Автор |
Сообщение |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Олег и всем кто тут привет)
Есть простая старая заготовка:
Код: |
SetBacktestMode( backtestRegularRawMulti );
pds=111;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;
Buy=Cross(High,DonchianUpper);
Short=Cross(DonchianLower,Low);
Sell=DonchianMiddle > Low;
Cover=DonchianMiddle < High;
BuyPrice=max(DonchianUpper, O);SellPrice=min(DonchianMiddle,O);ShortPrice=min(DonchianLower, O);CoverPrice=max(DonchianMiddle,O);
Buy = ExRem(Buy,Sell);Sell = ExRem(Sell,Buy);Short=ExRem(Short,Cover);Cover=ExRem(Cover,Short);
SetPositionSize(1, 4); |
Задача стоит простая. После лонг или шорт докупить еще 1 лот, если цена пошла против нашей позы на 200 пп, например (график РИ 6 минутка).
Потом по сигналу выхода закрыть все полностью.
Полазив на форуме, нашел, что подойдет использование SetBacktestMode. Но примеры на сайте ами находятся в мембер зоне. Не пойму как дописать условие на лонг и шорт? Добавлял вторые Buy Short, но получается какой-то бред.
и я так понимаю exrem надо убирать? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
1. Оставляешь как есть
2. Вычисляешь когда система в позиции (функцией flip)
3. Запоминаешь цену открытия позиции (ValueWhen(Buy)...)
4. Если цена упала ниже цены входа и система в позиции то добавляем Buy = ... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
000 писал(а): |
1. Оставляешь как есть
2. Вычисляешь когда система в позиции (функцией flip)
3. Запоминаешь цену открытия позиции (ValueWhen(Buy)...)
4. Если цена упала ниже цены входа и система в позиции то добавляем Buy = ... |
Как запомнить правильно цену открытия? Тут ведь немного нестандартное определение цены входа в сделку.
По логике сделал, но конечно не работает)
Код: |
SetBacktestMode( backtestRegularRawMulti );
pds=111;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;
Buy=Cross(High,DonchianUpper);
Short=Cross(DonchianLower,Low);
Sell=DonchianMiddle > Low;
Cover=DonchianMiddle < High;
InTrade = Flip( Buy, Short );
bp=ValueWhen(Buy,C);//buy price
sp=ValueWhen(Short,C);//short price
Buy=InTrade AND Low<bp-100;
Short=InTrade AND High>sp+100;
BuyPrice=max(DonchianUpper, O);SellPrice=min(DonchianMiddle,O);ShortPrice=min(DonchianLower, O);CoverPrice=max(DonchianMiddle,O);
Buy = ExRem(Buy,Sell);Sell = ExRem(Sell,Buy);Short=ExRem(Short,Cover);Cover=ExRem(Cover,Short);
SetPositionSize(1, 4); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Сделай сперва только для лонга.
Как то так
Код: |
SetBacktestMode( backtestRegularRawMulti );
pds=111;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;
Buy=Cross(High,DonchianUpper);
Sell=DonchianMiddle > Low;
BuyPrice=max(DonchianUpper, O);
SellPrice=min(DonchianMiddle,O);
Buy = ExRem(Buy,Sell); Sell = ExRem(Sell,Buy);
SetPositionSize(1, 4);
inLong = Flip(Buy, Sell);
ep = ValueWhen(Buy, BuyPrice);
Buy = Buy OR (L < ep-200 AND inLong);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Спасибо Олег. Интересно работает код) Он каждую сделку в 1 лот ведет отдельно)
Поковыряюсь сейчас. Мне нужно что бы было не больше 2 докупок.
я так понимаю, что с помощью setpositionsize просто не сделать, надо считать докупки? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вторую сделку обзови buy2.
Buy2 = ExRem(Buy2, Sell);
Buy = Buy OR Buy2; |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Я понял, сделал вот так:
Код: |
SetBacktestMode( backtestRegularRawMulti );
pds=111;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;
Buy=Cross(High,DonchianUpper);
Sell=DonchianMiddle > Low;
BuyPrice=max(DonchianUpper, O);
SellPrice=min(DonchianMiddle,O);
Buy = ExRem(Buy,Sell); Sell = ExRem(Sell,Buy);
SetPositionSize(1, 4);
inLong = Flip(Buy, Sell);
ep = ValueWhen(Buy, BuyPrice);
Buy2=L < ep-200 AND inLong;
Buy2 = ExRem(Buy2, Sell);
Buy = Buy OR Buy2; |
Но вот с ценами докупок не понятно. Уж они точно не с разницей в 200 пп идут. Сделал что бы не Low проверялся а Close и все равно цены неправильные а кое-где докупка идет по большей цене... |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну правильно. А кто будет задавать правильную цену покупки для сделки добавления? У тебя тестер пытается купить второй раз по
BuyPrice=max(DonchianUpper, O);
...
Надо как то
BuyPrice1=max(DonchianUpper, O);
ep = ValueWhen(Buy, BuyPrice);
BuyPrice2 = ep-200;
BuyPrice = IIf(Buy2, BuyPrice2, BuyPrice1); |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Супер. Олег, спасибо))
вечером попытаюсь добавить вторую доливку на -300 пп. По аналогии)
а вот в роботе такая конструкция будет работать? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В роботе надо по другому, но можно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Олег, изучаю эффективность метода, на примере только лонга с одной доливкой. Ну перед тем как усложнять алгоритм. Вот такой код пока: И есть проблема
Код: |
SetBacktestMode( backtestRegularRawMulti );
pds=111;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;
Buy1=Cross(High,DonchianUpper);
Sell=DonchianMiddle > Low;
BuyPrice1=max(DonchianUpper, O);
SellPrice=min(DonchianMiddle,O);
inLong = Flip(Buy1, Sell);
ep = ValueWhen(Buy1, BuyPrice1);
Buy2=L < ep-200 AND inLong;
BuyPrice2 = ep-200;
BuyPrice = IIf(Buy2, BuyPrice2, BuyPrice1);
Buy1 = ExRem(Buy1,Sell);
Buy2 = ExRem(Buy2, Sell);
Buy = Buy1 OR Buy2;
Sell = ExRem(Sell,Buy);
SetPositionSize(1, 4);
|
Проходят глючные доливки(
И еще такой момент, если Exrem перемещать по коду то меняется результаты тестирования. Где и в какой последовательности их правильно оставить? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Правильно ставить ExRem-ы вот так. Почему есть "глючные" сделки я не знаю. Выводи на график сигналы, линии покупки ep. и т.п и смотри...
Код: |
SetBacktestMode( backtestRegularRawMulti );
pds=111;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;
Buy1=Cross(High,DonchianUpper);
Sell=DonchianMiddle > Low;
Buy1 = ExRem(Buy1,Sell);
BuyPrice1=max(DonchianUpper, O);
SellPrice=min(DonchianMiddle,O);
inLong = Flip(Buy1, Sell);
ep = ValueWhen(Buy1, BuyPrice1);
Buy2=L < ep-200 AND inLong;
BuyPrice2 = ep-200;
BuyPrice = IIf(Buy2, BuyPrice2, BuyPrice1);
Buy2 = ExRem(Buy2, Sell);
Buy = Buy1 OR Buy2;
Sell = ExRem(Sell,Buy);
SetPositionSize(1, 4);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Олег, есть какая-то неточность в коде. Я сейчас проверил последний код. На первый взгляд глючные сделки ушли. (хотя если перейти на 30 минут то они появятся, но сейчас не об этом)
На скрине на графике выведена дефолтная система с сигналами. В тестере результат работы системы с доливкой.
в 19-42 1 марта покупка идет по 128540. Но прогонка дает нам на 200 пп ниже цену. Там должна быть через 3 бара докупка,но ее в тестере не видно. Тестер как будто соединил в данном случае 2 сделки. От первой взял время, а от второй цену. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
потом несколько сделок нормально с отображением доливок и вот тоже самое...
пометил красным, где сработала докупка (но её в тестере нет) и он просто цену Buy1 поменял на цену Buy2. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Скорее всего какая то путанца с сигналами Buy1 и Buy2. Выведи их на график PlotShape() и поизучай... Еще можно вывести на график BuyPrice. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
|