AM2
Андрей

 
Уровень 35

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Как написать простейший советник, торгующий отложенными ордерами.

По просьбам трудящихся предлагаю вашему вниманию небольшую статейку о том как написать простейший советник, торгующий отложенными ордерами.

Перво наперво определимся со стратегией по которой наш эксперт будет торговать. За основу я взял первую пришедшую на ум стратегию. Составим небольшое техзадание для нашей импровизации.


// 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.

В результате всего вышеизложенного можно сделать вывод что данная торговая система дает хороший доход на трендовых участках рынка и ведет себя нестабильно во флете.
  • +12
  • Просмотров: 109923
  • 28 февраля 2013, 20:53
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
02 мая 2012
15 марта 2013

Брокер для ваших роботов, 15 лет на рынке

Комментарии (50)

+
0
Отлично! *bravo* 
в закладки
avatar

  8  Miha Сообщений: 485 - Михаил

  • 28 февраля 2013, 21:07
+
0
Мать его ети… У меня моска только хватает цвет да толщину линиеф поменять… я уж лучшее подожжу, коды сынишка программёрам станет, мне кажетси быстрее будеть…
avatar

  20  Anatoly74 Сообщений: 3710 - Анатолий

  • 28 февраля 2013, 21:09
+
0
Ну а сам себя списал уже что-ли? Судя по нику мы с тобой ровестники.Ну ладно у меня нет времени этим заняться.
avatar

  11  kitajac Сообщений: 293

  • 28 февраля 2013, 23:59
+
0
СПАСИБО ЗА ПРОДЕЛАННУЮ РАБОТУ, Я ОЧЕНЬ РАД ЧТО ВЫ НЕ ОТКАЗАЛИ В МОЕЙ ПРОСЬБЕ.
avatar

  15  div15 Сообщений: 71 - div15

  • 28 февраля 2013, 21:30
+
0
Подскажите, а как реализовать, без отложников. Если скажем свеча закрылась бычья, то купили по рынку, если медвежья закрылась то продали по рынку? Без дополнительных наворотов. Только стопы и объем.
avatar

  0  Strannik Сообщений: 685 - Алексей (деактивирован)

  • 15 марта 2013, 17:22
+
+1
Без отложенников и без времени:


//---- buy 
   if(Close[1]-Open[1]>0 && p<1)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lot,Ask,5,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
     }        
//---- sell  
   if(Open[1]-Close[1]>0 && p<1) 
     {
      res=OrderSend(Symbol(),OP_SELL,Lot,Bid,5,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red);
     }   

avatar

  35  AM2 Автор Сообщений: 16419 - Андрей

  • 15 марта 2013, 19:11
+
0
Спасибо огромное. Как обычно в мелочи ошибся всю голову сломал почему. А тут все гораздо проще. Блин, аж самому смешно.
avatar

  0  Strannik Сообщений: 685 - Алексей (деактивирован)

  • 15 марта 2013, 19:34
+
0
Ого! програмирование для меня темный лес… Тут явно знания нужны( Как по-мне, то лучше купить советник. Так как я явно ошибусь при написании «простейшего» даже. Как говорится каждомцу свое…
avatar

  1  liverpool Сообщений: 36 - viva la vida!

  • 10 июня 2013, 10:06
+
0
я когда-то очень давно изучал для общего развития основы програмирования. и глядя на эти скрины могу сказать, что не так это все просто, есть много нюянсов. этот (да и любой другой) советник нужно будет перенастраивать постоянно. поэтому даже если ты хочешь создать работа в програмировании нужно разбираться и в торговле
avatar

  2  Kamar Сообщений: 37

  • 31 июля 2013, 14:22
+
0
соглашусь, думаю ис куленным не так все просто, его тоже постоянно нужно перенастраивать. Так что лучше самому торговать.
avatar

  1  liverpool Сообщений: 36 - viva la vida!

  • 2 сентября 2013, 09:01
+
0
или самому создавать и с ним торговать. если ты конечно все это умеешь
avatar

  2  Kamar Сообщений: 37

  • 5 сентября 2013, 16:24
+
0
я сколько не пытался и по разным инструкциям, а сам не могу написать советник свой. пользуюсь чужими =(
avatar

  1  MouseB Сообщений: 18

  • 17 сентября 2013, 18:34
+
0
Я тоже пытался, но все же решил, что не судьба. К тому же меня и чужой сейчас устраивает :) 
avatar

  1  Albertovich Сообщений: 43 - Юрий Новиков

  • 22 октября 2013, 17:09
+
0
и что вы нормально с ними торгуете? по инструкции там врятли что-то нормально выйдет
avatar

  2  Kamar Сообщений: 37

  • 23 октября 2013, 16:04
+
0
У меня 1 вопрос можно к нему приделать риск фактор ну и трейлинг стоп думаю неплохая сова вышла бы
avatar

  4  shapi Сообщений: 52

  • 28 октября 2013, 20:51
+
0
Всё вот так вот просто и легко, раз и получаем грааль! Очень понравилось, спасибо.
avatar

  1  koshchey Сообщений: 28

  • 23 февраля 2014, 00:48
+
0
Ну не думаю, что так уж всё просто. Почему тогда совы постоянно сливают депозиты?
avatar

  3  Rafaelka Сообщений: 121

  • 23 февраля 2014, 18:02
+
0
Насчёт того что все совы постоянно сливают депозиты я готов поспорить. Нужно просто уметь ими пользоваться.
avatar

  1  koshchey Сообщений: 28

  • 23 февраля 2014, 18:28
+
0
У вас есть совы, которые регулярно приносят прибыль? Подскажите какие? Как то мне это сомнительно. Мои попытки совами торговать все закончились сливом.
avatar

  3  Rafaelka Сообщений: 121

  • 23 февраля 2014, 18:33
+
0
В данный момент есть роботы которые торгуют на реале и приносят прибыль. Есть роботы которые проходят тест на демо и пока тоже неплохие результаты.
avatar

  1  koshchey Сообщений: 28

  • 23 февраля 2014, 18:38
+
0
Вы имеете ввиду совы, которые есть на сайте Фрэш? Я пробовала, не получается. Может надо дольше тестировать? Или я настройки не те делаю?
avatar

  3  Rafaelka Сообщений: 121

  • 23 февраля 2014, 18:48
+
0
а они работают только если ты на фреше зарегин?
avatar

  2  Kamar Сообщений: 37

  • 28 апреля 2014, 17:03
+
0
Вы что-то не в ту степь ушли. Тема называется «Как написать простейший советник, торгующий отложенными ордерами»
А вы уже какие-то философско-пустые беседы завели о совах в целом
avatar

  45  Bishop Сообщений: 5812 - АЛЬФАХАМЕЦ-Машковод

  • 28 апреля 2014, 17:16
+
0
как написать функцию закрытия отложенных ордеров при встречном сигнале например рси спасибо
avatar

  15  div15 Сообщений: 71 - div15

  • 5 июня 2014, 03:54
+
0
например так:

extern int  Magic = 123654;   // уникальный идентификатор "своих" ордеров

/************************************************************************
   Функция закрытия открытых и удаления отложенных ордеров.
   Входные параметры: тип ордеров
   Возвращает: код ошибки (0 - успешное завершение)
************************************************************************/
int close_orders_all(int type)
{
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() &&
          OrderMagicNumber() == Magic && OrderType() == type)
      {
         if ( ((type == OP_BUY || type == OP_SELL) &&
               OrderClose(OrderTicket(), OrderLots(), (type == OP_BUY) ? Bid : Ask, 3, CLR_NONE)) ||
               OrderDelete(OrderTicket(), CLR_NONE) ) continue;
      }
      return (GetLastError());
   }
   return (0);
}


P.S.
вызывается эта функция, примерно так:

if(сигнал_на_закрытие_SELL == true && close_orders_all(OP_SELLSTOP) != 0) error();
if(сигнал_на_закрытие_BUY  == true && close_orders_all(OP_BUYSTOP)   != 0) error();

Редактирован: 6 июня 2014, 07:39
avatar

  0  guest111 Сообщений: 180

  • 5 июня 2014, 12:33
+
0
а для удаления отложенных ордеров должна быть другая функция или нет разницы
avatar

  15  div15 Сообщений: 71 - div15

  • 6 июня 2014, 04:01
+
0
Дико извиняюсь, конечно же, отложники! *wall* 
Поправил переделал, но писал из головы — надо проверить в работе <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '>&nbsp; 
Редактирован: 6 июня 2014, 07:45
avatar

  0  guest111 Сообщений: 180

  • 6 июня 2014, 07:35
+
0
OrderClose(OrderTicket(), OrderLots(), (type == OP_BUY) ? Bid: Ask, 3, CLR_NONE)) ||
И ВОПРОС В КОДЕ
avatar

  15  div15 Сообщений: 71 - div15

  • 6 июня 2014, 08:06
+
0
можно сделать так или нет
int start()
  {
  if (TrailingStop!=0) Trailing(); 
  
   //ИНДИКАТОР RSI 
   double RSI0=iRSI(NULL,0,14,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,14,PRICE_CLOSE,1);
   
   int b,s,p,res; 
   double BuyPrice=Ask+Delta*Point; 
   double SellPrice=Bid-Delta*Point;
   
   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++;        
      }   
    }
      double SL,TP;
//---- buy stop делете
      if(RSI0<50&&RSI1>50)
    {
     OrderDelete(OP_BUYSTOP);
     
    }
//---- sell stop делете
      if(RSI0>50&&RSI1<50)
    {
     OrderDelete(OP_SELLSTOP);
     
    }

//---- buy stop
   if(RSI0>50&&RSI1<50) //&& Hour()==StartHour Close[1]-Open[1]>0  &&p<1 && b<1
     {
           
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50) // && Hour()==StartHourOpen[1]-Close[1]>0  && p<1 && s<1
     {

      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red );
     }   
//----
   return(0);
  }

Редактирован: 6 июня 2014, 09:03
avatar

  15  div15 Сообщений: 71 - div15

  • 6 июня 2014, 08:56
+
+1
Странные какие-то сигналы. *think* 

А вообще, нужно перенести секции "//---- buy stop делете" и "//---- sell stop делете" в тело цикла, и не OrderDelete(OP_BUYSTOP) и OrderDelete(OP_SELLSTOP) а OrderDelete(OrderTicket()).

Примерно так:

   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)
             if (сигнал_bue) OrderDelete(OrderTicket());
                 else b++;
        if (OrderType()==OP_SELLSTOP)
             if (сигнал_sell) OrderDelete(OrderTicket());
                 else s++;
      }   
    }

Редактирован: 6 июня 2014, 11:25
avatar

  0  guest111 Сообщений: 180

  • 6 июня 2014, 11:19
+
0
спасибо
avatar

  15  div15 Сообщений: 71 - div15

  • 6 июня 2014, 21:08
+
0
вот *girlcry* *wall*  сов открывает ордера пачками а надо всего 1 при пересечении индикатора.
avatar

  15  div15 Сообщений: 71 - div15

  • 7 июня 2014, 06:09
+
0
ну так дай полный код совы, думаю отсутствует проверка на наличие уже выставленных отложников и открытых ордеров:

p<1 && s<1

p<1 && b<1
avatar

  0  guest111 Сообщений: 180

  • 10 июня 2014, 10:52
+
0
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал 
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing(); 
  
   //ИНДИКАТОР RSI 
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b,s,p,res; 
   double BuyPrice=Ask+Delta*Point; 
   double SellPrice=Bid-Delta*Point;
   
   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++;        
      }   
    }
      double SL,TP;
//---- buy stop
   if(RSI0>50&&RSI1<50) 
     {
           
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50) 
     {

      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red );
     }
//---- buy stop делете
      if(RSI0<50&&RSI1>50)
    {
     OrderDelete( OrderTicket());
     
    }
//---- sell stop делете
      if(RSI0>50&&RSI1<50)
    {
     OrderDelete( OrderTicket());
     
    }
//----
   return(0);
  }
//--------------------------------------------------------------------
//---------ФУНКЦИЯ ТРАЛА----------------------------------------------
//--------------------------------------------------------------------

void Trailing()
{
   for(int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol()||OrderMagicNumber()==Magic)
       if(OrderType()==OP_BUY)
         {
          if(TrailingStop>0)  
            {                 
              if(Bid-OrderOpenPrice()>TrailingStop)
               {
                 if(OrderStopLoss()<Bid-TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
         
        if(OrderType()==OP_SELL)
         {
           if(TrailingStop>0)  
            {                 
              if((OrderOpenPrice()-Ask)>TrailingStop)
               {
                 if((OrderStopLoss()>(Ask+TrailingStop)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }   
   }
}
//+------------------------------------------------------------------------------------+
//+------------------------------------------------------------------------------------+--------------------------------------------------------------------+
avatar

  15  div15 Сообщений: 71 - div15

  • 10 июня 2014, 11:47
+
0
Ну, я же сказал, в тело цикла удаление отложников надо, потому что OrderDelete(...) требует параметром глобальный идентификатор ордера, возвращаемый функцией OrderTicket(), а она в свою очередь требует, чтобы ордер был предварительно выбран функцией OrderSelect(...), а при выходе из цикла текущий выбранный ордер может быть любым!
Кроме того, как я и думал, отсутствует проверка на наличие уже имеющихся ордеров.

Вот код переделанной функции start():

//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал 
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b = 0, s = 0, p = 0, res = 0;

   double BuyPrice=Ask+Delta*Point; 
   double SellPrice=Bid-Delta*Point;
   
   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)
        {
           if(RSI0<50&&RSI1>50)
                OrderDelete(OrderTicket());
            else
                b++;
        }
        if (OrderType()==OP_SELLSTOP)
        {
           if(RSI0>50&&RSI1<50)
                OrderDelete(OrderTicket());
              else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----
   return(0);
}


//--------------------------------------------------------------------
//---------ФУНКЦИЯ ТРАЛА----------------------------------------------
//--------------------------------------------------------------------


Функция трейлинга стопов кривая, ДУМАЙ



P.S.
Ну и кривой же тут редактор!
Редактирован: 10 июня 2014, 13:04
avatar

  0  guest111 Сообщений: 180

  • 10 июня 2014, 13:00
+
0
&& p<1 && b<1) // <!!!
ну даже с этими параметрами сов открывает кучу ордеров
avatar

  15  div15 Сообщений: 71 - div15

  • 10 июня 2014, 14:10
+
0
Есть же умные и не ленивые люди)) Спасибо за работу. В закладочки!))
avatar

  2  Fedos Сообщений: 50

  • 10 июня 2014, 14:31
+
0

int start()
{

//   if (TrailingStop!=0) Trailing();
  
   int res, b = 0, s = 0, p = 0;

   //ИНДИКАТОР RSI
   double RSI0 = iRSI(NULL, 0, 5, PRICE_CLOSE, 0);
   double RSI1 = iRSI(NULL, 0, 5, PRICE_CLOSE, 1);

   // СИГНАЛЫ
   bool signal_buy  = (RSI0 > 50 && RSI1 < 50);
   bool signal_sell = (RSI0 < 50 && RSI1 > 50);

   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS) == false || OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) p++;
      if (OrderType() == OP_BUYSTOP)
      {
         if ( signal_sell && OrderDelete(OrderTicket()) ) continue;
            else b++;
      }
      if (OrderType() == OP_SELLSTOP)
      {
         if ( signal_buy && OrderDelete(OrderTicket()) ) continue;
            else s++;
      }
   }

   // buy stop
   if(signal_buy && p < 1 && b < 1)
   {
      double BuyPrice  = Ask + Delta * Point; 
      res = OrderSend(Symbol(), OP_BUYSTOP, LOT, BuyPrice, 0, BuyPrice - StopLoss * Point, BuyPrice + TakeProfit * Point, "ОТЛОЖКИ", Magic, 0, Blue);

      /* if (res < 0) error(); */
   }        

   // sell stop  
   if(signal_sell && p < 1 && s < 1)
   {
      double SellPrice = Bid - Delta * Point;
      res = OrderSend(Symbol(), OP_SELLSTOP, LOT, SellPrice, 0, SellPrice + StopLoss * Point, SellPrice - TakeProfit * Point, "ОТЛОЖКИ", Magic, 0, Red);
      /* if (res < 0) error(); */
   }

//----
   return(0);
}


Вижу засаду в твоих сигналах: возможна ситуация, когда сигнал не сработает. Например, при резком рывке цены оба индюка сразу будут выше или ниже уровня 50.

P.S.
Подредактировал немного.
Редактирован: 10 июня 2014, 18:22
avatar

  0  guest111 Сообщений: 180

  • 10 июня 2014, 15:58
+
0
avatar

  45  Bishop Сообщений: 5812 - АЛЬФАХАМЕЦ-Машковод

  • 10 июня 2014, 18:19
+
0
сов открывает кучу ордеров КАК СДЕЛАТЬ ПРИ ПЕРЕСЕЧЕНИИ ИНДИКАТОРА ЧТОБЫ ВЫСТАВЛЯЛСЯ 1 ОРДЕР А НЕ 5 7 29
avatar

  15  div15 Сообщений: 71 - div15

  • 10 июня 2014, 16:39
+
0
замени у себя функцию start полностью на ту, которую я дал в последний раз.
avatar

  0  guest111 Сообщений: 180

  • 10 июня 2014, 16:43
+
0
СПАСИБО ЗА ПОМОЩЬ
avatar

  15  div15 Сообщений: 71 - div15

  • 10 июня 2014, 16:50
+
0
А можно % от депо прикрутить чтобы лот увеличивался? Так при тестировании более правдивые результаты получатся
avatar

  0  lidya Сообщений: 4

  • 22 января 2015, 17:17
+
0
Можно. Разместите ваши пожелания в Стол заказов MQL в выходные сделаю.
Редактирован: 22 января 2015, 22:41
avatar

  35  AM2 Автор Сообщений: 16419 - Андрей

  • 22 января 2015, 22:40
+
0
здравствуйте вы мне можете помоч написать Stop loss к тейк трофиту. или к нему же трэйлинг стоп в готовый советник
avatar

  3  prostokot Сообщений: 63 - Сергей

  • 12 мая 2015, 15:46
+
0
Напишите подробное ТЗ в Стол заказов MQL желательно с рисунками и сделаю
avatar

  35  AM2 Автор Сообщений: 16419 - Андрей

  • 12 мая 2015, 15:49
+
0
а нельзя ли добавить в советник простой мартин, т.е. если ордер закрывается с убытком, последующий открывать с умножением на 2?
avatar

  13  rz1zr Сообщений: 18

  • 25 сентября 2015, 08:35
+
0
Можно в Столе заказов MQL: zakaz.opentraders.ru/
avatar

  35  AM2 Автор Сообщений: 16419 - Андрей

  • 25 сентября 2015, 11:19
+
0
Уважаемые можно есть в качестве примера простая сова открывающая отложенные стоп ордера и удаляющая по противоположному сигналу? Указанные тут не удаляются, из-за чего-то ((((
avatar

  1  Sel7 Сообщений: 3

  • 9 июня 2020, 15:49
+
0
1- не удаляются, потому как это не прописано в алгоритме.
2- этот советник написан вероятно в учебных целях!
3- заказать советник можно в группе «Стол заказов MQL», есть и другие группы.
avatar

  18  Boris54 Сообщений: 812 - ПенSионер

  • 9 июня 2020, 16:44

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий