Автор |
Сообщение |
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
начал делать систему на циклах... и понял, что почти все функции там не работают (или надо для них массивы создавать как исходную инфу?)
решил отказаться от циклов.
столкнулся if ... else и совершил стандартную ошибку if ( H >Ref(H,-1) )
.
----
как я думал раньше как работает тестер:
сначала смотрит первый бар и прогоняет систему, потом смотрит следующий бар, и т.д.
а на самом деле он как-то по-хитрому целиком весь массив сравнивает!
т.е. если я пишу:
Buy=C>5000;
то он сразу учитывает весь массив закрытия на всем периоде тестирования!!!!
на первый взгляд очень мощно и удобно... ноо
...как вообще это сочетается с линейным программированием?
мне нужно, чтоб он все делал ТОЛЬКО на текущем баре.
это можно с помощью циклов сделать - но тогда вылетают все стандартные функции.
и вообще теряется смысл в амиброкере - раз писать все с нуля, то можно и в екселе написать в VBA
вот чего я не пойму:
как можно написать линейную программу, последовательную, если Амиброкер все сразу с массивами делает?
получается не линейная программа - а какая-то матрица:
т.е. программа-то идет сверху вниз, а код исполняется СРАЗУ на всех барах одновременно.
иными словами,
в чем философия программирования AFL?
некоторая структура программы? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В общем мысли совершенно верные. Даже порадовался когда прочитал. Дело, вероятно, в том, что ами изначально использовал почти копию языка MetaStock. Работа со всем массивом сразу. Конечно такой подход не дает полной возможности контроля кода, но зато так очень быстро (и писать и считать) и, вероятно, людям далеким от программирования так проще. Затем в AFL добавились циклы и появилась возможность осуществлять 100% контроль над расчетами. Синтаксис и использование очень похож на JS.
Еще вот что. Надо иметь ввиду, что трейдинг это, как ни крути, не точная наука и правила входа/выхода могут допускать довольно приблизительное толкование без потери эффективности. ИМХО нормальная система вряд ли должна быть длиннее 20-30 строк, а если нужен более точный подход (например для создания робота), то тогда и следует использовать возможности AFL на всю катушку. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Novi4ok
Зарегистрирован: 15.08.2008
Сообщения: 127
|
до меня кажется дошло.
во-первых, желательно вообще не использовать if.. else, если мы работаем НЕ в цикле.
но эт так ерунда.
главное, все пром. значения также можно располагать в массивах.
и принимать решение по текущему бару исходя не только из истории цен и констант, но также из всей истории промежуточных массивов.
это весьма удобно.
т.е. прога выглядит так:
НАЧАЛО
+создание констант
+создание промежуточных расчетов в массивах!
+скидывание инфы в POPUPWINDOW или еще куда-нибудь для отладки кода
+условия бай, селл
+// комментарии
+рисование графиков //кому надо
КОНЕЦ |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Совершенно верно.
Только на счет if.. else не совсем. это управляющее слово позволяет менять путь прохождения кода.
Т.е если обычно выполняются все строки кода подряд, то if.. else позволяет менять путь прохождения кода. Например
Код: |
if(Name() == "SBER")
{
Buy = блаблабла1;
Sell = Блаблабла1;
}
elase if(Name() == "LKOH")
{
Buy = блаблабла2;
Sell = Блаблабла2;
}
|
Т.е. меняется алгоритм в зависимости от символа. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
CheeGer
Зарегистрирован: 10.09.2009
Сообщения: 29
|
Олег можно немного по подробней про структуру кода.. до этого год работал на Mql ни как не могу перестроится...
Вот например почему здесь условие выполняется а сделка не проходит?
Код: |
i=0;x=0;MAs[i]=H[i];
for( ; x <BarCount>1){
Cond1 = MAs[i] ==MAs[i-1];
Cond2 = MAs[i-1] ==MAs[i-2];
AlertIf(Cond1 AND Cond2,"","buy",1,1);
Buy = Cond1 AND Cond2;
}
Sell=C>BuyPrice + TickSize*100;
if ( H[x] <MAs> MAs[i]&i>0;i--);
i++;
MAs[i] = H[x] ;
}
} |
то есть у меня по чему то проходит только одна сделка на одном инструменте из всей базы и та на первом баре... |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
CheeGer
Зарегистрирован: 10.09.2009
Сообщения: 29
|
Код почему то криво вставился..нормально не получается...
Короче там просто поддержка-сопротивление..грубо говоря я последовательно создаю массив равный хаю..если новый хай выше предыдущего он записывается на место старого..а если меньше или равен просто добавляется..в результате если три последних элемента массива(т.е. вершины) ровны то подаётся сигнал на сделку...
Понимаю что намудрил.. но это только чтоб понять язык.. дк в чём я не прав? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Прикрепи код файлом к сообщению. Посмотрю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
CheeGer
Зарегистрирован: 10.09.2009
Сообщения: 29
|
Меня вот эти строки интересуют :
AlertIf(Cond1 AND Cond2,"","buy",1,1);
Buy = Cond1 AND Cond2;
Почему алерт проходит, а сделка нет? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
Почему алерт проходит, а сделка нет? |
Много возможных причин. Самое простое может денег не хватает.
Кроме того возможно, что система уже в позе. Сигнал на покупку есть, но тестер его проигнорирует поскольку уже в рынке. Алерт однако сработает.
По коду. Честно говоря я не могу понять что там за алгоритм. Или в коде все плохо или используются слишком непонятные для меня методы.
Вообще мне не нравится, что используются вложенные циклы. Ами этого не любит и это сильно замедляет работу кода.
Вот в этой строке
Код: |
Sell = C > BuyPrice + TickSize*100;
|
Точно ошибка. BuyPrice это не цена последней покупки, а цена по которой могла бы совершится покупка на ЭТОМ БАРЕ если бы был сигнал Buy.
Напиши словами алгоритм. Я постараюсь его в код превратить. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
CheeGer
Зарегистрирован: 10.09.2009
Сообщения: 29
|
Денег хватает.Система не в позе.Алерты срабатывают точно по правилам,но вот сделок почему-то нет
На счет sella-про ошибку знаю, это я просто приписал,чтоб тестер не ругался,что нет правила на продажу.
Алгоритм простой: Если n последних вершин равны совершает сделку. Я просто описал момент формирования поддержки-сопротивления. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Алгоритм такой?
Код: |
Cond1 = H == Ref(H, -1);
Cond2 = Ref(H, -1) == Ref(H, -2);
Buy = Cond1 AND Cond2;
Sell = 0;
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
CheeGer
Зарегистрирован: 10.09.2009
Сообщения: 29
|
Почти, здесь три последних хая,а мне нужны вершины,т.е они могут идти и подряд(в твоем коде учитывается только этот вариант),а могут и с разницей в сотню баров(в моем учитывается и такой вариант) код работает,можешь проверить сам, алерты выходят правильно, вот только сделок почему-то нет |
Последний раз редактировалось: CheeGer (Вс Сен 20, 2009 10:32 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вершина это ?
Код: |
H > Ref(H, -1) and H > Ref(H , 1);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если да, то вот код.
Код: |
Pik = H > Ref(H, -1) AND H > Ref(H , 1);
Pik1 = ValueWhen(Pik, H, 1);
Pik2 = ValueWhen(Pik, H, 2);
Pik3 = ValueWhen(Pik, H, 3);
Cond1 = Pik1 == Pik2;
Cond2 = Pik2 == Pik3;
Buy = Cond1 AND Cond2;
Sell = Ref(Buy, -5);
|
Выход через 5 баров. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
CheeGer
Зарегистрирован: 10.09.2009
Сообщения: 29
|
Что значит: H > Ref(H , 1)? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
|