Автор |
Сообщение |
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
К примеру, мы имеем случай, представленный на картинке. Смотрим только вход, отмечен красной стрелкой.
На момент входа у нас имеется размах между Хай (151750) и Лоу (150380). Размах равен 1370 пунктов. Задача состоит в том, чтобы выйти из шорта в тот момент, когда цена в падении пересечет расширение фибы 61.8% от диапазона Хай-Лой, ИМЕЮЩЕГО МЕСТО БЫТЬ на МОМЕНТ ВХОДА. Т.е. в районе 149530.
Пока что я могу сделать выход только на пробое текущего лоя. Ну это легко и понятно.
Т.е. я так понимаю, в момент входа необходимо запомнить параметры хай/лой, рассчитать нужный диапазон и задать условия нужного пересечения. Но вот как запомнить эти параметры. И чтобы при обновлении экстремумов, значения в памяти не менялись.
Спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
2 варианта.
1. Геморойный. Воспользоваться функцией ValueWhen()
Типа ЗначениеКогда(Шорт, посчитаный уровень выхода)
2. Посчитать уровень выхода, Цена входа - цена выхода и запихать это в ApplyStop() |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
000 писал(а): |
2 варианта.
1. Геморойный. Воспользоваться функцией ValueWhen()
Типа ЗначениеКогда(Шорт, посчитаный уровень выхода)
2. Посчитать уровень выхода, Цена входа - цена выхода и запихать это в ApplyStop() |
Через стопы очень нежелательно. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Почему? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
Ну я не знаю, будет ли робот отрабатывать Амишные стопы. Он настроен на buy/short/cover/sell.
Сделал следующую вставку:
Код: |
H1 = ValueWhen(B1, NewHigh, n = 1);
L1 = ValueWhen(S1, NewLow, n = 1);
Delta = H1-L1;
D161H = L1 + Delta*1.618;
D161S = H1 - Delta*1.618;
Lout3 = Cross (H, D161H);
Sout3 = Cross (D161S, L);
|
Иногда отрабатывается правильно. Иногда невнятно, как будто берет предыдущий или наоборот следующий диапазон экстремумов. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Пффф.
Давай не будем смешивать мух и котлеты.
Для теста проще и значит лучше использовать ApplyStop()
Для робота вот так |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
000 писал(а): |
Пффф.
Давай не будем смешивать мух и котлеты.
Для теста проще и значит лучше использовать ApplyStop()
Для робота вот так |
Олег, да просто у меня другой робот стоит. Там под стопы переделка понадобится.
А то, что я выше киданул - правильно с точки зрения геморойного варианта? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Наверное правильно. Я не знаю что у тебя B1 и S1. Только там одно но.
Если после открытия сделки и до ее закрытия появился еще один сигнал на сделку, то и B1 и S1 изменяться.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
000 писал(а): |
Наверное правильно. Я не знаю что у тебя B1 и S1. Только там одно но.
Если после открытия сделки и до ее закрытия появился еще один сигнал на сделку, то и B1 и S1 изменяться.... |
B1 и S1 - это Buy и Short. Т.е. условия для бая и шорта загнал в переменную дабы проставить в два места. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Бррр. Не правильно написал. Изменится не B1 и S1 а H1 и L1... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Кстати говоря. Даже если у тебя другой робот, ничто не мешает тебе использовать тот же принцип (запись уровня в файл). |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
000 писал(а): |
Бррр. Не правильно написал. Изменится не B1 и S1 а H1 и L1... |
Вот такой код:
Код: |
H1 = ValueWhen(B1, NewHigh, n = 0);
L1 = ValueWhen(S1, NewLow, n = 0);
Delta = H1-L1;
D161H = L1 + Delta*1.61;
D161S = H1 - Delta*1.61;
Lout3 = Cross (H, D161H);
Sout3 = Cross (D161S, L); |
И несмотря на n = 0, просходит перерисовка сигналов. Печаль.
А через файл - вообще не понимаю, как делать. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
Поставил n=1, что бы брало первое слева выражение, дабы не заглядывало в будущее.
Однако рассчитывает неверно. К примеру, если обратимся к картинке. В 10:20 проходит первый сигнал (B1), H1 и S1, соответсвенно сужаются. Однако, сужается не до нужных позиций. Если H1 должна быть на 148728 (сетка фибы натянута на хай/лой), то здесь он очевидна выше.
Дальше сигналы идут в пределах имеющегося хая/лоя, поэтому H1/S1 не меняется. В 11:15 снова проходит B1. На этот момент хай/лой уже другие, соответсвенно расширяется и H1/S1. А вот здесь они уже встают верно.
Ничего не понимаю. Откуда ошибки в первом случае?
Ну и конечно это не дело. Все таки надо рассматривать для теста значению исключительно по первому сигналу. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Попытался разобраться. Не получилось. Давай свой код и описание что именно надо. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
AntColonel
Зарегистрирован: 03.05.2011
Сообщения: 213
Откуда: Новосибирск
|
000 писал(а): |
Попытался разобраться. Не получилось. Давай свой код и описание что именно надо. |
Значит ситуация такова. Имеется код (следует чуть ниже). Что делает он на данный момент? Определяет хай/лой дня, определяет в этом диапазоне три уровня коррекции - 61.8%, 50%, 38.2%. Вход в позицию происходит в том случае, когда цена доходит до одного из этих уровней коррекции и определенным образом тестирует его. Плюс фильтр. Выход осуществляется на пересечении экстремума. Т.е. либо ТП, либо стоп.
Что хочется сделать? Выход по ТП на пересечении экстремума - это слишком рано. Часто бывает, что цена уходит далеко дальше. Поэтому, задача состоит в том, что заставить систему выходить из позы по достижению расширения фибы 161.8%. Диапазон для этого расщирения должен браться от хай до лоу в том месте, ГДЕ БЫЛ ВХОД. На картинке это 150960. Т.е. если после входа в позу, хай/лоу были обновлены, но цены еще не достигли 161.8% и снова ушли на коррекции, где прошел очередной сигнал (который не отработан, поскольку уже в позе), то диапазон все равно должен остаться первоначальный.
Код:
Код: |
// получение данных с форинг-источников
SB = Foreign("RIZVSP", "Close");
VT = Foreign("RIZVPR", "Close");
// расчет фильтров и адаптивная оптимизация
spred = SB/VT;
spred2 = SB-VT;
n = Optimize ("n", 17, 2, 100, 1);
Const1 = Optimize("Const1", 2.84, 0, 4, 0.02);
n2 = round(ATR(n)*Const1);
MA1 = MA (spred, n2);
CCIT = CCI (n);
// установка временных параметров работы
TMin = Param ("TMin", 100000, 100000, 230000, 10000);
TMout = Param ("TMout", 190000, 100000, 230000, 10000);
TM4 = TimeNum() >= TMin AND TimeNum() < TMout;
BeginDay = Ref(Day(), -1) != Day();
DayBars = BarsSince(BeginDay)+1;
TM = TimeNum() == 234000;
TM2 = TimeNum() < 190000;
TM3 = TimeNum() > 100000;
// определение хай/лоу дня и уровней коррекции
NewHigh = Ref(HHV(H, DayBars), -1);
NewLow = Ref(LLV(L, DayBars), -1);
Delta50 = (NewHigh + NewLow)/2;
Delta161 = (NewHigh - NewLow)*1.6 + NewLow;
Delta161L = NewHigh - (NewHigh - NewLow)*1.6;
Delta61 = NewLow + (NewHigh - NewLow)*0.618;
Delta38 = NewLow + (NewHigh - NewLow)*0.382;
Delta236 = NewLow + (NewHigh - NewLow)*0.236;
Delta764 = NewLow + (NewHigh - NewLow)*0.764;
// условия входа/выхода
BC1 = L < Delta50 AND O > Delta50 AND C > Delta50;
BC2 = MA1 > Ref (MA1, -1);
BC3 = L < Delta61 AND O > Delta61 AND C > Delta61;
BC4 = L < Delta38 AND O > Delta38 AND C > Delta38;
BC5 = spred2 > 0;
SC1 = H > Delta50 AND O < Delta50 AND C < Delta50;
SC2 = MA1 < Ref (MA1, -1);
SC3 = H > Delta61 AND O < Delta61 AND C < Delta61;
SC4 = H > Delta38 AND O < Delta38 AND C < Delta38;
SC5 = spred < 0;
Lout1 = Cross (H, NewHigh);
Lout2 = Cross (NewLow, C);
Lout4 = Cross (300, CCIT);
Sout1 = Cross (NewLow, L);
Sout2 = Cross (C, NewHigh);
Sout4 = Cross (CCIT, -300);
// попытка сделать запоминание диапазона в момент входа и выход по 161.8%. Неудачная. Считает неверно, перерисовывает после новых сигналов
B1 = (BC1 OR BC4 OR BC3) AND BC2 AND TM4;
S1 = (SC1 OR SC3 OR SC4) AND SC2 AND TM4;
H1 = ValueWhen(B1, NewHigh, n = 1);
L1 = ValueWhen(S1, NewLow, n = 1);
Delta = H1-L1;
D161H = L1 + Delta*1.618;
D161S = H1 - Delta*1.618;
Lout3 = Cross (H, D161H);
Sout3 = Cross (D161S, L);
// сигналы
Buy = (BC1 OR BC4 OR BC3) AND BC2 AND TM4;
Short = (SC1 OR SC3 OR SC4) AND SC2 AND TM4;
Sell = Lout1 OR Lout2 OR Lout4 OR TM;
Cover = Sout1 OR Sout2 OR Sout4 OR TM;
Plot( NewHigh, "NewHigh", colorRed, 32);
Plot( NewLow, "NewLow", colorGreen, 32);
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
|