Помогите разобраться с функцией OrderModify

 

Здравствуйте.

Помогите модернизировать ордер.

1. Возможно ли такое реализовать?
2. Встречали ли Вы в каком то советнике такой способ модернизации ордера? если да то можете дать на него ссылку или скинуть его, возможно Вы встречали на форуме похожую тему?

Образовался БАР 1.

Открылся БАР 2, как только цена стала больше high БАРА 1 открывается ордер на покупку, стом лос (SL) устанавливается на Low БАРА 1, тэйк профит (ТР) допустим на +1000 пунктов от High бара 1.

Открылся БАР 3. SL перемещается с Low БАРА 1 на Low БАРА 2. ТР перемещатся на +1000 пунктов от бара 2. 

И так до бесконечности пока на ЛЮБОМ баре не сработает SL.

 

 

 
Fantar:

И так до бесконечности пока на ЛЮБОМ баре не сработает SL.

 

 

А зачем тогда ТР ставить?

Посмотри, как работает трейлинг стоп и запускай его только в начале бара с параметрами от предыдущего. 

 
Roger:

А зачем тогда ТР ставить?

Посмотри, как работает трейлинг стоп и запускай его только в начале бара с параметрами от предыдущего. 

Можете подробней написать? Или скинуть ссылку на похожую тему? Чтоб я разобрался
 
Fantar:
Можете подробней написать? Или скинуть ссылку на похожую тему? Чтоб я разобрался

Библиотека трейлингстопа. 

https://www.mql5.com/ru/code/7108

 

khorosh спасибо.

Я понял что реализации данного условия нужен  Трейлинг по теням N последних баров.

Подскажите как сделать так чтоб при открытии ордера, запускался сам трал???

TrailingByShadows я вставил в самый конец индикатора. 

extern int    NumberOfTry      = 5;            // Количество торговых попыток 
bool          UseSound         = True;         // Использовать звуковой сигнал
string        NameFileSound    = "expert.wav"; // Наименование звукового файла


extern int       Lots=1;    //объём торгов    
extern int       Target=15; //тейк профит
int    MagicNumber = 89354658;
string MagicName = "DojiTrader";
int      eDirection = 0; //условие
int      SigP = 0;       //условие
int      OpenTime=1;     

extern   int   iTicket;             // уникальный номер (тикет) открытой позиции
extern   int   iTmfrm;              // период, по барам которого следует тралить (1, 5, 15, 30, 60, 240, 1440, 10080, 43200)
extern   int   iBars_n = 3;         // кол-во баров, по которым следует тралить
extern   int   iIndent = 3;         // отступ от тени бара, на котором размещается стоплосс
extern   bool  bTrlinloss = false;  // следует ли тралить на участке лоссов (между курсом стоплосса и открытия)

/////////////////////////////////////////////////////////////////////////////////////////////
int start()
  {       
   int orders = 0;
   int i = 0;           

   for(i = 0; i < OrdersTotal(); i++ )  
   {      
      OrderSelect(i,SELECT_BY_POS);     
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1
         break;
      }
   }


///////////////////////////////////////////////////////////////////////////////////////////// 
   for(i = 1; i < OrdersTotal(); i++ )  //количество открытых ордеров на 1 больше
      {
      OrderSelect(i,SELECT_BY_POS);  
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         orders ++; 
         break;
      }
   }   
 ///////////////////////////////////////////////////////////////////////////////////////////////  
   if(orders < 1 )
      {
         for(i = 1; i < Bars; i++ )
     {
      //Бычье поглащение
      if ((Open[i]>Close[i]) && (High[i+1]>High[i]) && Low[i+1]>Low[i]) 
         {
            eDirection = 1;
            break;
         }    
     }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      if(i < 4 && i > 0)
      {      
         
        if(SigP == 0)
         {       
          if(High[i] < Ask)
           {
               SigP = 1;             
           }
         }                       
      }
      else
      {
         SigP = 0;
      }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //Покупка
 double res;              
        if (eDirection==1 && SigP ==1 && iBarShift(NULL,0,OpenTime) != 0)
       {
         res = OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Low[i]-3*Point,High[i]+20*Point ,MagicName,MagicNumber,0,Green);
         OpenTime = iTime(NULL,0,0);

       }

}                    

  }
  
  void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss)
   {  
   
   int i; // counter
   double new_extremum;
   
   // проверяем переданные значения
   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
      {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY), находим минимум bars_n свечей
   if (OrderType()==OP_BUY)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i);
         else 
         if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
         }         
      
      // если тралим и в зоне убытков
      if (trlinloss==true)
         {
         // если найденное значение "лучше" текущего стоплосса позиции, переносим 
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration()))            
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      else
         {
         // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL), находим минимум bars_n свечей
   if (OrderType()==OP_SELL)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i);
         else 
         if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
         }         
           
      // если тралим и в зоне убытков
      if (trlinloss==true)
         {
         // если найденное значение "лучше" текущего стоплосса позиции, переносим 
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      else
         {
         // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }      
      }      
   }
  


 
Из индикаторов запрещён доступ к торговым функциям, торговать да и вообще модифицировать ордера и.т.д могут только советники или скрипты, вам нужно написать советник и уже из советника получать показания индикатора функцией iCustom.
 

Хотя это и так советник. Вставьте вызов трейлинга вот сюда:

for(i = 0; i < OrdersTotal(); i++ )  
   {      
      OrderSelect(i,SELECT_BY_POS);     
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         ---Сюда---
         orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1
         break;
      }
   }
 
PozitiF:

Хотя это и так советник. Вставьте вызов трейлинга вот сюда:

Всё равно SL не переносится на Low нового бара (допустим при покупке).

Что делать?((((

// https://book.mql4.com/ru/trading/ordersend - OrderSend


extern int    NumberOfTry      = 5;            // Количество торговых попыток 
bool          UseSound         = True;         // Использовать звуковой сигнал
string        NameFileSound    = "expert.wav"; // Наименование звукового файла


extern int       Lots=1;    //объём торгов    
extern int       Target=15; //тейк профит
int    MagicNumber = 89354658;
string MagicName = "DojiTrader";
int      eDirection = 0; //условие
int      SigP = 0;       //условие
int      OpenTime=1;     

extern   int   iTicket;             // уникальный номер (тикет) открытой позиции
extern   int   iTmfrm;              // период, по барам которого следует тралить (1, 5, 15, 30, 60, 240, 1440, 10080, 43200)
extern   int   iBars_n = 3;         // кол-во баров, по которым следует тралить
extern   int   iIndent = 3;         // отступ от тени бара, на котором размещается стоплосс
extern   bool  bTrlinloss = false;  // следует ли тралить на участке лоссов (между курсом стоплосса и открытия)

/////////////////////////////////////////////////////////////////////////////////////////////
int start()
  {       
   int orders = 0;
   int i = 0;           

   for(i = 0; i < OrdersTotal(); i++ )  
   {      
      OrderSelect(i,SELECT_BY_POS);     
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         TrailingByShadows(OrderTicket(),iTmfrm,iBars_n,iIndent,bTrlinloss);
         orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1
         break;
      }
   }


///////////////////////////////////////////////////////////////////////////////////////////// 
   for(i = 1; i < OrdersTotal(); i++ )  //количество открытых ордеров на 1 больше
      {
      OrderSelect(i,SELECT_BY_POS);  
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         
         orders ++; 
         break;
      }
   }   
 ///////////////////////////////////////////////////////////////////////////////////////////////  
   if(orders < 1 )
      {
         for(i = 1; i < Bars; i++ )
     {
      //Бычье поглащение
      if ((Open[i]>Close[i]) && (High[i+1]>High[i]) && Low[i+1]>Low[i]) 
         {
            eDirection = 1;
            break;
         }    
     }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      if(i < 4 && i > 0)
      {      
         
        if(SigP == 0)
         {       
          if(High[i] < Ask)
           {
               SigP = 1;             
           }
         }                       
      }
      else
      {
         SigP = 0;
      }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //Покупка
 double res;              
        if (eDirection==1 && SigP ==1 && iBarShift(NULL,0,OpenTime) != 0)
       {
         res = OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Low[i]-3*Point,High[i]+20*Point ,MagicName,MagicNumber,0,Green);
         OpenTime = iTime(NULL,0,0);
       }

}                    

  }
  
  void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss)
   {  
   
   int i; // counter
   double new_extremum;
   
   // проверяем переданные значения
   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
      {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY), находим минимум bars_n свечей
   if (OrderType()==OP_BUY)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i);
         else 
         if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
         }         
      
      // если тралим и в зоне убытков
      if (trlinloss==true)
         {
         // если найденное значение "лучше" текущего стоплосса позиции, переносим 
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration()))            
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      else
         {
         // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL), находим минимум bars_n свечей
   if (OrderType()==OP_SELL)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i);
         else 
         if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
         }         
           
      // если тралим и в зоне убытков
      if (trlinloss==true)
         {
         // если найденное значение "лучше" текущего стоплосса позиции, переносим 
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      else
         {
         // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
         }      
      }      
   }
  


 
В этом советнике есть такой трейлинг (N2 - TrailByShadows).
Причина обращения: