По просьбам трудящихся предлагаю вашему вниманию небольшую статейку о том как написать простейший советник, торгующий отложенными ордерами.
Перво наперво определимся со стратегией по которой наш эксперт будет торговать. За основу я взял первую пришедшую на ум стратегию. Составим небольшое техзадание для нашей импровизации.
// 1. В зависимости от цвета предыдущей свечи выставляем отложку на расстоянии Delta от цены в StartHour часов на пробой.
// 2. Время истечения ордера Expiration часов.
// 3. Ордер выставляется с установленными значениями стоплосс и тейкпрофит.
// 4. Торговля фиксированным лотом.
// 5. Торговля на открытии свечи на часовом графике.
Далее определимся с внешними входными переменными. Расположим их в самом начале нашего кода.
extern double StopLoss = 1000; //Стоплосс ордера
extern double TakeProfit = 1000; //Тейкпрофит ордера
extern int StartHour = 7; //Час начала торговли(терминальное время)
extern int Delta = 100; //Расстояние от цены для установки ордера
extern int Expiration = 4; //Время истечения ордера
extern double Lot = 1; //Объём позиции
В функции Start() расположим переменные и функции, необходимые для торговли.
В переменной b запоминаем бай стоп отложенные ордера, в переменной s запоминаем отложенные ордера селл стоп.
Переменная expiration хранит время истечения ордера. BuyPrice — это расстояние от текущей цены плюс отступ на пробой,
SellPrice — соответственно отступ от цены вниз.
int b,s,p,res;
datetime expiration = TimeCurrent()+3600*Expiration;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
Добавим в советник функцию контроля торговли на новом баре.
if(Volume[0]>1) return;
Следующая функция будет подсчитывать количество позиций и установленных отложенных ордеров.
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP) b++;
if (OrderType()==OP_SELLSTOP) s++;
}
}
Собственно установка отложенников идет в следующем блоке, при выполнении условий указанных в нашем ТЗ.
//---- buy stop
if(Close[1]-Open[1]>0 && Hour()==StartHour && p<1 && b<1)
{
res=OrderSend(Symbol(),OP_BUYSTOP,Lot,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"",MAGIC,expiration,Blue);
}
//---- sell stop
if(Open[1]-Close[1]>0 && Hour()==StartHour && p<1 && s<1)
{
res=OrderSend(Symbol(),OP_SELLSTOP,Lot,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"",MAGIC,expiration,Red );
}
После того как мы соберем все наши кирпичики воедино. мы получим следующий более менее работоспособный код.
//+------------------------------------------------------------------+
//| OTL.mq4 |
//| Copyright © 2013, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link "http://www.forexsystems.biz"
// 1. В зависимости от цвета предыдущей свечи выставляем отложку на расстоянии Delta от цены в StartHour часов на пробой.
// 2. Время истечения ордера Expiration часов.
// 3. Ордер выставляется с установленными значениями стоплосс и тейкпрофит.
// 4. Торговля фиксированным лотом.
// 5. Торговля на открытии свечи на часовом графике.
#define MAGIC 20130228
extern double StopLoss = 1000; //Стоплосс ордера
extern double TakeProfit = 1000; //Тейкпрофит ордера
extern int StartHour = 7; //Час начала торговли(терминальное время)
extern int Delta = 100; //Расстояние от цены для установки ордера
extern int Expiration = 4; //Время истечения ордера
extern double Lot = 1; //Объём позиции
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int b,s,p,res;
datetime expiration = TimeCurrent()+3600*Expiration;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
if(Volume[0]>1) return;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP) b++;
if (OrderType()==OP_SELLSTOP) s++;
}
}
//---- buy stop
if(Close[1]-Open[1]>0 && Hour()==StartHour && p<1 && b<1)
{
res=OrderSend(Symbol(),OP_BUYSTOP,Lot,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"",MAGIC,expiration,Blue);
}
//---- sell stop
if(Open[1]-Close[1]>0 && Hour()==StartHour && p<1 && s<1)
{
res=OrderSend(Symbol(),OP_SELLSTOP,Lot,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"",MAGIC,expiration,Red );
}
//----
return(0);
}
//--------------------------------------------------------------------
После оптимизации стратегии на отрезке 2012.01.04 — 2012.11.30.
Ответить на вопрос была ли это подгонка или найдена некоторая устойчивая закономерность можно проведя форвард и бэк тесты. Т.е. протестируем наш эксперт на истории вне диапазона оптимизации.
Результаты нас не очень то утешают. Получена совсем небольшая прибыль на выбранных трехмесячных участках. Из чего можно сделать вывод что положительные результаты на участке оптимизации являются результатом подгонки под историю.
Чтобы получить положительные результаты форвард и бэк тестов, оптимизируем стратегию на более длительном участке времени 2011.01.04 — 2012.11.30.
Рис.3. Тест на участке оптимизации 2012.11.30 — 2013.02.28.
Рис.2. Тест на истории 2010.07.01 — 2011.01.04
Рис.3. Тест на истории 2012.11.30 — 2013.02.28.
Ну а сейчас посмотрим а вдруг у нас в руках, то к чему стремятся миллионы людей торгующих на рынке FOREX. То в поисках чего не спят ночами начинающие и не очень трейдеры всего мира — торговая система Грааль.
Установим в эксперте лот 0.1 при депо 10000$ и протестируем наш эксперт с оптимизированными параметрами с начала 2000-го года. В результате получим вот такую картинку, которая уже с большей уверенностью позволяет нам сказать, что найдена определенная закономерность.
Рис.4. Тест на истории 2000.01.04 — 2013.02.28.
Тестирование и оптимизация эксперта проводились на котировках Альпари, H1, EURUSD.
В результате всего вышеизложенного можно сделать вывод что данная торговая система дает хороший доход на трендовых участках рынка и ведет себя нестабильно во флете.
Комментарии (50)
в закладки
8 Miha Сообщений: 485 - Михаил
20 Anatoly74 Сообщений: 3710 - Анатолий
11 kitajac Сообщений: 293
15 div15 Сообщений: 71 - div15
0 Strannik Сообщений: 685 - Алексей (деактивирован)
35 AM2 Автор Сообщений: 16419 - Андрей
0 Strannik Сообщений: 685 - Алексей (деактивирован)
1 liverpool Сообщений: 36 - viva la vida!
2 Kamar Сообщений: 37
1 liverpool Сообщений: 36 - viva la vida!
2 Kamar Сообщений: 37
1 MouseB Сообщений: 18
1 Albertovich Сообщений: 43 - Юрий Новиков
2 Kamar Сообщений: 37
4 shapi Сообщений: 52
1 koshchey Сообщений: 28
3 Rafaelka Сообщений: 121
1 koshchey Сообщений: 28
3 Rafaelka Сообщений: 121
1 koshchey Сообщений: 28
3 Rafaelka Сообщений: 121
2 Kamar Сообщений: 37
А вы уже какие-то философско-пустые беседы завели о совах в целом
45 Bishop Сообщений: 5812 - АЛЬФАХАМЕЦ-Машковод
15 div15 Сообщений: 71 - div15
P.S.
вызывается эта функция, примерно так:
Редактирован: 6 июня 2014, 07:39
0 guest111 Сообщений: 180
15 div15 Сообщений: 71 - div15
Поправилпеределал, но писал из головы — надо проверить в работе Редактирован: 6 июня 2014, 07:450 guest111 Сообщений: 180
И ВОПРОС В КОДЕ
15 div15 Сообщений: 71 - div15
Редактирован: 6 июня 2014, 09:03
15 div15 Сообщений: 71 - div15
А вообще, нужно перенести секции "//---- buy stop делете" и "//---- sell stop делете" в тело цикла, и не OrderDelete(OP_BUYSTOP) и OrderDelete(OP_SELLSTOP) а OrderDelete(OrderTicket()).
Примерно так:
Редактирован: 6 июня 2014, 11:25
0 guest111 Сообщений: 180
15 div15 Сообщений: 71 - div15
15 div15 Сообщений: 71 - div15
p<1 && s<1
p<1 && b<1
0 guest111 Сообщений: 180
15 div15 Сообщений: 71 - div15
Кроме того, как я и думал, отсутствует проверка на наличие уже имеющихся ордеров.
Вот код переделанной функции start():
P.S.
Ну и кривой же тут редактор! Редактирован: 10 июня 2014, 13:04
0 guest111 Сообщений: 180
ну даже с этими параметрами сов открывает кучу ордеров
15 div15 Сообщений: 71 - div15
2 Fedos Сообщений: 50
Вижу засаду в твоих сигналах: возможна ситуация, когда сигнал не сработает. Например, при резком рывке цены оба индюка сразу будут выше или ниже уровня 50.
P.S.
Подредактировал немного. Редактирован: 10 июня 2014, 18:22
0 guest111 Сообщений: 180
45 Bishop Сообщений: 5812 - АЛЬФАХАМЕЦ-Машковод
15 div15 Сообщений: 71 - div15
0 guest111 Сообщений: 180
15 div15 Сообщений: 71 - div15
0 lidya Сообщений: 4
35 AM2 Автор Сообщений: 16419 - Андрей
3 prostokot Сообщений: 63 - Сергей
35 AM2 Автор Сообщений: 16419 - Андрей
13 rz1zr Сообщений: 18
35 AM2 Автор Сообщений: 16419 - Андрей
1 Sel7 Сообщений: 3
2- этот советник написан вероятно в учебных целях!
3- заказать советник можно в группе «Стол заказов MQL», есть и другие группы.
18 Boris54 Сообщений: 812 - ПенSионер
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий