Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Вопросы по AFL Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Мар 30, 2014 7:17 pm Ответить с цитатой Вернуться к началу

Ну если мы изначально были в шорте, то полюбому сначала будет ковер иначе второй шорт не пройдет.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Сб Июн 21, 2014 7:12 pm Ответить с цитатой Вернуться к началу

Всем доброго времени суток!


Мне в системе надо в зависимости от конкретного значения рассматриваемого бара делать определенные действия. То есть, в коде требуется получить номер текущего (рассматриваемого) бара - что бы по этому номеру из массива взять конкретный элемент.

В справке к описанию "BarIndex()" прочитал:
Цитата:
When QuickAFL is ON, the BarIndex() may not be equal with array item index.

Actual array item
corresponding to bar index can be found this way:

bi = BarIndex();
arrayitem = SelectedValue( bi ) - bi[ 0 ];
"Close at selected bar:" + Close[ arrayitem ];


У меня есть индикатор - если значение этого индикатора ниже определенного, то принципиально не надо открывать / закрывать позицию, даже если все остальные условия срабатывают.
Соответственно, использую такой код (BW - это мой индикатор, при значении которого более 2 торговые сигналы должны использоваться для открытия-закрытия позиции; при значении 2 и менее - торговые сигналы должны игнорироваться):
Код:
bi = BarIndex();
arrayitem = SelectedValue( bi ) - bi[ 0 ];
if (BW[arrayitem] > 2)
{
  Buy = CondBuy;
  Sell = CondSell;
  Short = CondShort;
  Cover = CondCover;
}


не работает и конструкция :
Код:
if (BW[BarCount-1] > 2)
{
  Buy = CondBuy;
  Sell = CondSell;
  Short = CondShort;
  Cover = CondCover;
}

у меня почему-то при вычислениях используется значение последнего бара индикатора, а не текущего...

Где я ошибся?

Заранее спасибо за ответ(ы).
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Июн 21, 2014 11:30 pm Ответить с цитатой Вернуться к началу

Надо так

Код:
BW = ...;

CondBuy = ...;
CondSell = ...;
CondShort = ...;
CondCover = ...;

CondBW = BW > 2;

Buy = CondBuy AND CondBW;
Sell = CondSell AND CondBW;
Short = CondShort AND CondBW;
Cover = CondCover AND CondBW;

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Вс Июн 22, 2014 4:14 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Надо так
...

Олег, спасибо за предложенный вариант - в отличии от моих он прекрасно работает Smile


если не сложно, поясни, пожалуйста, - в чем у меня ошибка при определении номера текущего (рассматриваемого) бара?
вроде с использованием функции BarIndex() все делаю по инструкции (справку прочитал в двух вариантах - и на русском и на английском) - но что-то не получается то, что описано в справке.

в справке написано:
Цитата:
BarIndex() - returns zero-based bar number ...BarIndex() now returns values always starting from zero
...
Actual array item
corresponding to bar index can be found this way:
...

или же эта функция делает что-то другое (используется в иных ситуациях)?

вряд ли определить номер текущего бара - невозможно?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Июн 22, 2014 6:17 pm Ответить с цитатой Вернуться к началу

Ты не правильно понимаешь работу AFL. Твой код написан так, как будто AFL при работе анализирует бары по очереди, от самого первого до последнего и каждый раз, при анализе каждого бара AFL пробегает весь свой код. На самом деле это не правильно. Так работает код в Метатрейдере (вроде), изи (в омеге), врде в Велслабе.
Тут анализиуется сразу все за один проход. то не так просто объяснить... А для того, чтобы код работал последовательно от первого бара до последнего надо специально организовывать цикл.
....

Вот как то так.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пн Июн 23, 2014 6:41 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Ты не правильно понимаешь работу AFL. ......

Олег, спасибо за разъяснения - благодаря твоим пояснениям решил еще пару задач, которые раньше не знал как сделать ...
Shocked Laughing

стараюсь освоить AmiBroker (зря что ли покупал официальную версию Very Happy ) - хоть и получается, но как-то очень медленно ... Sad
получается почему-то преимущественно - только с твоими подсказками Embarassed
и это несмотря на то, что стараюсь и справку читать, и в инете ищу ответы Sad




отдельный вопрос - не связанный с предыдущим кодом.
так что же все-таки делает функция BarIndex()?
можешь так же в паре слов пояснить, как и ранее - коротко, доступно и понятно? Embarassed


СПАСИБО за помощь!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Июн 23, 2014 6:59 pm Ответить с цитатой Вернуться к началу

Возьми вот этот код и на гафик его. Сразу все поймешь.
Код:
SetBarsRequired(sbrAll, sbrall);
Plot(BarIndex(), "Barindex", colorRed);

И на будущее. Используй такой способ.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пт Июн 27, 2014 11:08 am Ответить с цитатой Вернуться к началу

торговые сигналы есть, но при прогоне через AA отрабатываются, почему-то только сигналы закрытия позиции (Cover и Sell). Открытие позиции (Buy и Short) в АА почему-то игнорируются.

Хотя сигналы на графике есть.
Если надо, могу приложить картинку с сигналами.

Вопрос - что мне посмотреть?
код:
Код:
  Buy = Crit_Buy;
  Sell = Crit_Sell;
  Short = Crit_Short;
  Cover = Crit_Cover;

  //Сигналы (стрелки) на графике
  ShapeBuy = shapeUpArrow;
  ShapeSell = shapeDownArrow;
  ShapeShort = shapeHollowDownArrow;
  ShapeCover = shapeHollowUpArrow;
  ColorUp = colorGreen;
  ColorDown = colorRed;
  PlotShapes( IIf(Crit_Buy, ShapeBuy, shapeNone), ColorUp, 0, Low );   //Определяет  "buy" (вход в long) – торговое правило
  PlotShapes( IIf(Crit_Short, ShapeShort, shapeNone), ColorDown, 0, High );   //Определяет "short" (вход в short) торговое правило
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Июн 27, 2014 2:53 pm Ответить с цитатой Вернуться к началу

il-ir писал(а):
торговые сигналы есть, но при прогоне через AA отрабатываются, почему-то только сигналы закрытия позиции (Cover и Sell). Открытие позиции (Buy и Short) в АА почему-то игнорируются.

Интересно, а как ты определил, что сигналы на закрытие отрабатываются если у тебя позиции не открываются?
Если сигналы на открытие есть, то переключи в АА отчет на подробный и смотри там. Возможно просто не хватает денег на открытие.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пт Июн 27, 2014 6:03 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Интересно, а как ты определил, что сигналы на закрытие отрабатываются если у тебя позиции не открываются?
Если сигналы на открытие есть, то переключи в АА отчет на подробный и смотри там. Возможно просто не хватает денег на открытие.

Если нажать на кнопку "Scan", то в отчете есть только sell и cover.
И если вызвать выпадающее меню (по правой кнопки мышки), то, выбрав пункт "Show arrows for all raw signal", получаем стрелки закрытия коротких и длинных позиций, которые совпадают с моими, нарисованными руками стрелками...

Я правильно понял, что в подробном отчете смотреть на результат на вкладке "Result list"?
на ней написан только такой текст (правда много раз подряд):
Entry signals(score):
Exit signals:
0 Open Possitions, Equity: 10000, Cash: 10000

Олег, а тебе можно выслать код индикатора? Вдруг я опять как-то что-то принципиально неправильно делаю, как ранее с массивами?
Embarassed Rolling Eyes

Кстати, я вроде научился работать правильно с массивами - по крайней мере в процедуре PlotShapes уже правильно массивы использовал для рисования стрелок, да?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Июн 27, 2014 8:01 pm Ответить с цитатой Вернуться к началу

Да, вышли в личку. Гляну.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пн Июн 30, 2014 10:28 am Ответить с цитатой Вернуться к началу

в общем, пишу резюме по моей заморочке с системой, в которой принципиально отсутствовало открытие позиций, хотя сигналы на открытие были.

Основной и самый главный вывод - если бы не помощь Олега, то фиг бы я смог самостоятельно разобраться Embarassed Laughing
За что Олегу - ОГРОМНОЕ СПАСИБО!!!

Первый вывод по работе с кодом - если используется деление, то желательно поверять на наличие нуля в знаменателе. Самое простое - использовать функцию Nz(...).

у меня как раз и получилось что при обработке нескольких баров возникало деление на ноль. Я не верил, что на 30-ти минутках сбербанк может иметь High равным Low (и поэтому даже не допускал такой гипотезы и не проверял), но практика показала, что запросто. Получилось, что наличие в знаменателе конструкции High - Low как раз все и портило...
Соответственно, по совету Олега добавление функции Nz(...) к операторам с делением и перевело систему из нерабочей в рабочую.

Да, и в моем случае массив сигналов строился по принципу - когда текущее значение зависит от нескольких предыдущих. И "кривые данные", то есть, деление на ноль, мне испортили весь оставшийся хвост массива.


вторая заморочка возникла при использовании квикАФЛ. Это когда я захотел вывести в файл те самые "кривые" данные (как выводить данные в файл написан подробный пример в справке к процедуре fputs). Заморочка выразилась в том, что после отсечения нулевых значений в знаменателе система заработала (то есть такие данные были), но в файл они не выводились.
Желающие подробно ознакомиться с с тем, что такое QuickAFL, как работает и как его контролировать могут посетить ссылку http://www.amibroker.com/kb/2008/07/03/quickafl/ - все написано и даже понятно (ну только на английском...).
мне достаточно было использовать конструкцию
Код:
SetBarsRequired( sbrAll, sbrAll );
и после этого все "кривые" данные оказались пойманными и выведенными в файл.
Посмотреть профиль Отправить личное сообщение
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пн Июл 28, 2014 9:36 am Ответить с цитатой Вернуться к началу

Подскажите, пожалуйста, как правильно (с точки зрения идеологии Amibroker'а) сделать такую вещь:

Есть канал.
Есть две системы получения сигналов: трендовая и разворотная.
К примеру от верхней границы канала есть сигнал разворотной системы на продажу.
При достижении нижней границы могут быть две ситуации:
1. разворотная система дает сигнал закрыть позицию.
2. трендовая система дает сигнал на продажу, а разворотная дает сигнал закрыть позицию. Соответственно, в этой ситуации надо как-то исключить сигнал разворотной системы на закрытие позиции.

Как сделать, используя IF-ы и перебор в цикле - я представляю.
Но может быть, это можно сделать правильно, с использованием массивов? Вдруг есть функция, которая такое делает?

Вот недавно прямо мой второй вопрос решили - как отслеживать наличие сигнала (про триггер позиции): http://amisite.ru/phpBB2/viewtopic.php?t=1992 Very Happy
Я понимал, что этот функционал должен быть, но спросить не успел - опередили Laughing

Спасибо за ответ(ы)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Июл 28, 2014 11:23 am Ответить с цитатой Вернуться к началу

Примерно так
Код:

//Система 1 трендовая
Buy1 = ...;
Sell1 = ...;
Short1 = ...;
Cover1 = ...;
//Система 2 разворотная
Buy2 = ...;
Sell2 = ... AND Buy1 == 0;
Short2 = ...;
Cover2 = ... AND Short1 == 0;

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пн Июл 28, 2014 11:48 am Ответить с цитатой Вернуться к началу

000 писал(а):
Примерно так

Спасибо. Как всегда - красивое, короткое и элегантное решение.
когда я так научусь Embarassed Sad

Только вопрос - зачем сравнивать Buy1 == 0 ?
Можно было бы написать вместо
Sell2 = ... AND Buy1 == 0;
так:
Sell2 = ... AND NOT Buy1;

Или я не правильно уловил логику?
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen