TralingStop - проблема в движении назад

 

Подскажите пожалуйста алгоритм при котором TralingStop не модифицирует ордер назад.Та схема которую я использую почему то пятица назад,привожу код.

Данный блок находится перед кодом модификации.Я расчитовал что он мне поможет в этом.

buy_stop - это глобальная переменная которой при модификации присваивается значение - Bid-OrderOpenPrice().

sell_stop -  это глобальная переменная которой при модификации присваивается значение - OrderOpenPrice()-Bid

   for (int i=0; i < orderTotal; i++) 
    {  
    if(OrderSelect(i,SELECT_BY_POS)==true && OrderType()==OP_BUY)  
     {
     if(OrderSymbol()==symbol)
      {
      if(Bid-OrderOpenPrice() <= buy_stop)                                                           
       {
       return;
       }
      }
     }
    }
     if(OrderSelect(i,SELECT_BY_POS)==true && OrderType()==OP_SELL)  
      {
      if(OrderSymbol()==symbol)
       {
       if(OrderOpenPrice()-Bid <= sell_stop)
        {
        return;
        }
       }
      }

это сам код модификации.Не обращайте внимание на дополнительные переменные,их задача в данной проблеме не важна.

 int   TralingStop;
  for (i=0; i < orderTotal; i++) 
   {   
  if(OrderSelect( i,SELECT_BY_POS)==true && OrderType()==OP_BUY)  
   {
   if(OrderSymbol()==symbol)
    {
    if(OrderComment()!=Com_Vin_iCust_30 || OrderComment()!=Com_Vin_iCust_h1 || OrderComment()!=Com_Vin_iCust_h4 || 
    OrderComment()!=Com_iMacd_30 || OrderComment()!=Com_iMacd_h1 || OrderComment()!=Com_iMacd_h4 || 
    OrderComment()!=Com_Monitor_Macd || OrderComment()!=Com_MonitorAllPair || OrderComment()=="") 
    TralingStop=TS_My_order;
    if(OrderComment()==Com_Vin_iCust_30)      TralingStop=TS_Vin_iCust_30;
    if(OrderComment()==Com_Vin_iCust_h1)      TralingStop=TS_Vin_iCust_h1; 
    if(OrderComment()==Com_Vin_iCust_h4)      TralingStop=TS_Vin_iCust_h4;
    if(OrderComment()==Com_Vin_iCust_d1)      TralingStop=TS_Vin_iCust_d1;
    if(OrderComment()==Com_iMacd_30)          TralingStop=TS_iMacd_30;
    if(OrderComment()==Com_iMacd_h1)          TralingStop=TS_iMacd_h1;
    if(OrderComment()==Com_iMacd_h4)          TralingStop=TS_iMacd_h4;
    if(OrderComment()==Com_iMacd_d1)          TralingStop=TS_iMacd_d1;
    if(OrderComment()==Com_Monitor_Macd)      TralingStop=TS_Monitor_Macd;
    if(OrderComment()==Com_MonitorAllPair)    TralingStop=TS_MonitorAllPair; 
     if(Bid-(OrderOpenPrice()+My_level*Point)>TralingStop*Point)
      {
       OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TralingStop*Point,OrderTakeProfit(),0,Yellow);
       GlobalVariableSet("buy_stop_"+symbol+raz+OrderComment(),Bid-OrderOpenPrice());
       Alert(Symbol()," - Buy - modifi","   ",OrderComment(),"  ",_GetLastError(),"   ",OrderStopLoss()-OrderOpenPrice());
       RefreshRates(); 
       Sleep(100000);         
       }
      }
     }
    }
  for ( i=0; i < orderTotal; i++) 
   { 
   if(OrderSelect(i,SELECT_BY_POS)==true && OrderType()==OP_SELL)  
    {
    if(OrderSymbol()==symbol)
     {
    if(OrderComment()!=Com_Vin_iCust_30 || OrderComment()!=Com_Vin_iCust_h1 || OrderComment()!=Com_Vin_iCust_h4 || 
    OrderComment()!=Com_iMacd_30 || OrderComment()!=Com_iMacd_h1 || OrderComment()!=Com_iMacd_h4 || 
    OrderComment()!=Com_Monitor_Macd || OrderComment()!=Com_MonitorAllPair || OrderComment()=="")  
    TralingStop=TS_My_order;
    if(OrderComment()==Com_Vin_iCust_30)      TralingStop=TS_Vin_iCust_30;
    if(OrderComment()==Com_Vin_iCust_h1)      TralingStop=TS_Vin_iCust_h1; 
    if(OrderComment()==Com_Vin_iCust_h4)      TralingStop=TS_Vin_iCust_h4;
    if(OrderComment()==Com_Vin_iCust_d1)      TralingStop=TS_Vin_iCust_d1;
    if(OrderComment()==Com_iMacd_30)          TralingStop=TS_iMacd_30;
    if(OrderComment()==Com_iMacd_h1)          TralingStop=TS_iMacd_h1;
    if(OrderComment()==Com_iMacd_h4)          TralingStop=TS_iMacd_h4;
    if(OrderComment()==Com_iMacd_d1)          TralingStop=TS_iMacd_d1;
    if(OrderComment()==Com_Monitor_Macd)      TralingStop=TS_Monitor_Macd;
    if(OrderComment()==Com_MonitorAllPair)    TralingStop=TS_MonitorAllPair;    
      if((OrderOpenPrice()-My_level*Point)-Ask >TralingStop*Point)
       {
       OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TralingStop*Point,OrderTakeProfit(),0,Yellow);
       GlobalVariableSet("sell_stop_"+symbol+raz+OrderComment(),OrderOpenPrice()-Bid);
       Alert(Symbol()," - Sell - modifi","   ",OrderComment(),"  ",_GetLastError(),"   ",OrderOpenPrice()-OrderStopLoss());
       RefreshRates(); 
       Sleep(100000);  
       }
      }
     }
    }
 
https://www.mql5.com/ru/code/7108
 
Добавьте еще в условия, чтобы новый стоп был ближе к биду чем старый.
 
Roger >>:
Добавьте еще в условия, чтобы новый стоп был ближе к биду чем старый.

Вот за это вам спасибо.Но я всё таки не пойму почему,если глобальные переменные четко фиксируют разницу между  Bid и OrderOpenPrice() и в условии ясно прописано,если разница меньше,то ничего не делать,а expetr топо модифицирует ордер.Я просто начинаю сомневаться в надёжности цифры(программирования),или я что то не догоняю.

 
intersheff >>:

Вот за это вам спасибо.Но я всё таки не пойму почему,если глобальные переменные четко фиксируют разницу между  Bid и OrderOpenPrice() и в условии ясно прописано,если разница меньше,то ничего не делать,а expetr топо модифицирует ордер.Я просто начинаю сомневаться в надёжности цифры(программирования),или я что то не догоняю.

Проблема в вашем коде.

Мой собственный TrailingStop работает корректно.

А зачем вам глобальные переменные?

 
intersheff писал(а) >>

Вот за это вам спасибо.Но я всё таки не пойму почему,если глобальные переменные четко фиксируют разницу между Bid и OrderOpenPrice() и в условии ясно прописано,если разница меньше,то ничего не делать,а expetr топо модифицирует ордер.Я просто начинаю сомневаться в надёжности цифры(программирования),или я что то не догоняю.

Надо сравнивать не только OrderOpenPrice(), но И (доп. условие) Расчетный Стоплос с уже установленным. и если он будет выше (ниже)OrderStopLoss(), модифицировать ордер.

 
SergNF >>:

Надо сравнивать не только OrderOpenPrice(), но И (доп. условие) Расчетный Стоплос с уже установленным. и если он будет выше (ниже)OrderStopLoss(), модифицировать ордер.


Совсем недавно сам сталкивался с подобной проблемой, нашел решение... Привожу свой код (функцию) работающего трейлинг - стопа (по 2-м АТР) согласно его определения  - перемещение только в сторону открытия ордера, если Вас интересует только условия открытия - думаю Вам не составит труда их увидеть...
Файлы:
tral_stop.mqh  6 kb
 
Roman. писал(а) >>

...если Вас интересует...

Упс. Меня в этой теме ничего не интересует. :)
intersheff стал мудрить с Глобальными переменными, видимо, "не дочитав до функции" OrderStopLoss()
СтопЛосс рассчитывать можно мульёном способов, а вот при его установке топикастеру!!! нужно было просто проверить корректность нового по сравнению со старым.

 
SergNF >>:

Упс. Меня в этой теме ничего не интересует. :)
intersheff стал мудрить с Глобальными переменными, видимо, "не дочитав до функции" OrderStopLoss()
СтопЛосс рассчитывать можно мульёном способов, а вот при его установке топикастеру!!! нужно было просто проверить корректность нового по сравнению со старым.

Понял.спасибо

 
Roman. >>:


Совсем недавно сам сталкивался с подобной проблемой, нашел решение... Привожу свой код (функцию) работающего трейлинг - стопа (по 2-м АТР) согласно его определения  - перемещение только в сторону открытия ордера, если Вас интересует только условия открытия - думаю Вам не составит труда их увидеть...

Спасибо.Буду разбираться.

Причина обращения: