Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Вопросы по AFL |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 След. |
Автор |
Сообщение |
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну если мы изначально были в шорте, то полюбому сначала будет ковер иначе второй шорт не пройдет. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Всем доброго времени суток!
Мне в системе надо в зависимости от конкретного значения рассматриваемого бара делать определенные действия. То есть, в коде требуется получить номер текущего (рассматриваемого) бара - что бы по этому номеру из массива взять конкретный элемент.
В справке к описанию "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
|
Надо так
Код: |
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
|
000 писал(а): |
Надо так
... |
Олег, спасибо за предложенный вариант - в отличии от моих он прекрасно работает
если не сложно, поясни, пожалуйста, - в чем у меня ошибка при определении номера текущего (рассматриваемого) бара?
вроде с использованием функции 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
|
Ты не правильно понимаешь работу AFL. Твой код написан так, как будто AFL при работе анализирует бары по очереди, от самого первого до последнего и каждый раз, при анализе каждого бара AFL пробегает весь свой код. На самом деле это не правильно. Так работает код в Метатрейдере (вроде), изи (в омеге), врде в Велслабе.
Тут анализиуется сразу все за один проход. то не так просто объяснить... А для того, чтобы код работал последовательно от первого бара до последнего надо специально организовывать цикл.
....
Вот как то так. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
Ты не правильно понимаешь работу AFL. ...... |
Олег, спасибо за разъяснения - благодаря твоим пояснениям решил еще пару задач, которые раньше не знал как сделать ...
стараюсь освоить AmiBroker (зря что ли покупал официальную версию ) - хоть и получается, но как-то очень медленно ...
получается почему-то преимущественно - только с твоими подсказками
и это несмотря на то, что стараюсь и справку читать, и в инете ищу ответы
отдельный вопрос - не связанный с предыдущим кодом.
так что же все-таки делает функция BarIndex()?
можешь так же в паре слов пояснить, как и ранее - коротко, доступно и понятно?
СПАСИБО за помощь! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Возьми вот этот код и на гафик его. Сразу все поймешь.
Код: |
SetBarsRequired(sbrAll, sbrall);
Plot(BarIndex(), "Barindex", colorRed); |
И на будущее. Используй такой способ. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
торговые сигналы есть, но при прогоне через 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
|
il-ir писал(а): |
торговые сигналы есть, но при прогоне через AA отрабатываются, почему-то только сигналы закрытия позиции (Cover и Sell). Открытие позиции (Buy и Short) в АА почему-то игнорируются.
|
Интересно, а как ты определил, что сигналы на закрытие отрабатываются если у тебя позиции не открываются?
Если сигналы на открытие есть, то переключи в АА отчет на подробный и смотри там. Возможно просто не хватает денег на открытие. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
Интересно, а как ты определил, что сигналы на закрытие отрабатываются если у тебя позиции не открываются?
Если сигналы на открытие есть, то переключи в АА отчет на подробный и смотри там. Возможно просто не хватает денег на открытие. |
Если нажать на кнопку "Scan", то в отчете есть только sell и cover.
И если вызвать выпадающее меню (по правой кнопки мышки), то, выбрав пункт "Show arrows for all raw signal", получаем стрелки закрытия коротких и длинных позиций, которые совпадают с моими, нарисованными руками стрелками...
Я правильно понял, что в подробном отчете смотреть на результат на вкладке "Result list"?
на ней написан только такой текст (правда много раз подряд):
Entry signals(score):
Exit signals:
0 Open Possitions, Equity: 10000, Cash: 10000
Олег, а тебе можно выслать код индикатора? Вдруг я опять как-то что-то принципиально неправильно делаю, как ранее с массивами?
Кстати, я вроде научился работать правильно с массивами - по крайней мере в процедуре PlotShapes уже правильно массивы использовал для рисования стрелок, да? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да, вышли в личку. Гляну. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
в общем, пишу резюме по моей заморочке с системой, в которой принципиально отсутствовало открытие позиций, хотя сигналы на открытие были.
Основной и самый главный вывод - если бы не помощь Олега, то фиг бы я смог самостоятельно разобраться
За что Олегу - ОГРОМНОЕ СПАСИБО!!!
Первый вывод по работе с кодом - если используется деление, то желательно поверять на наличие нуля в знаменателе. Самое простое - использовать функцию 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
|
Подскажите, пожалуйста, как правильно (с точки зрения идеологии Amibroker'а) сделать такую вещь:
Есть канал.
Есть две системы получения сигналов: трендовая и разворотная.
К примеру от верхней границы канала есть сигнал разворотной системы на продажу.
При достижении нижней границы могут быть две ситуации:
1. разворотная система дает сигнал закрыть позицию.
2. трендовая система дает сигнал на продажу, а разворотная дает сигнал закрыть позицию. Соответственно, в этой ситуации надо как-то исключить сигнал разворотной системы на закрытие позиции.
Как сделать, используя IF-ы и перебор в цикле - я представляю.
Но может быть, это можно сделать правильно, с использованием массивов? Вдруг есть функция, которая такое делает?
Вот недавно прямо мой второй вопрос решили - как отслеживать наличие сигнала (про триггер позиции): http://amisite.ru/phpBB2/viewtopic.php?t=1992
Я понимал, что этот функционал должен быть, но спросить не успел - опередили
Спасибо за ответ(ы) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Примерно так
Код: |
//Система 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
|
000 писал(а): |
Примерно так |
Спасибо. Как всегда - красивое, короткое и элегантное решение.
когда я так научусь
Только вопрос - зачем сравнивать Buy1 == 0 ?
Можно было бы написать вместо
Sell2 = ... AND Buy1 == 0;
так:
Sell2 = ... AND NOT Buy1;
Или я не правильно уловил логику? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Вопросы по AFL |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|