Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет

 

Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет:

if (OrdersTotal ()==2&&TrailingStop==1)//определение количества открытых ордеров и разрешения на трейлинг
{Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if ((OrderType()==OP_SELL)&&(Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5))&&((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5)))||(TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
if ((OrderType()==OP_BUY)&&(Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5)))&&(TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
}

 


подскажите в чем прикол а то я уже голову сломал!!! 

 
Vitaliy29:

Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет:

if (OrdersTotal ()==2&&TrailingStop==1)//определение количества открытых ордеров и разрешения на трейлинг
{Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if ((OrderType()==OP_SELL)&&(Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5))&&((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5)))||(TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
if ((OrderType()==OP_BUY)&&(Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5)))&&(TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
}

 


подскажите в чем прикол а то я уже голову сломал!!! 

Вы бы сначала прочитали про 
bool

 Возможно тут всегда "false"

TrallStopLoss_Ask>Ask+NormalizeDouble(Point*TR_otstup,5)

 Тут всегда "true", потому и OP_BUY OrderModify() вызывается 

TrallStopLoss_Bid<Bid-NormalizeDouble(Point*TR_otstup,5)
 

Сложно стилизатором воспользоваться? (Ctrl+ , ) 

Можете воспользоваться моим кодом с некоторой доработкой под себя. 

//автор Гаврилин Александр
void GOrders::trailing_simple(double level,double doffset,double dstep=0,int itype=ALL)
  {
   double st,stop=0,dStep=dstep;
   int flag;

   if(level==0.0) return;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;

      if(OrderType()>=2) continue;
      if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1))
        {

         string n=OrderSymbol();
         double tick=MarketInfo(n,MODE_TICKSIZE);
         if(dStep==0) dStep=tick/p;

         stop=OrderStopLoss();
         if(bvirtual) stop=virtual_get_sl(OrderTicket());

         double pt=0;
         flag=toMyTypes(OrderType())&itype;

         if(OrderType()==OP_BUY && OrderType()==toDefType(flag,itype))
           {
            pt=(dBid(n)-OrderOpenPrice())/p;
            // Print("buy pt=",pt);    
            st=NormalizeDouble(MathFloor((dBid(n)-MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
            if(pt>=level && level!=0.0)
              {
               if(stop==0 || (stop<st && (st-stop)/p>=dStep))
                 {
                  if(bvirtual) virtual_set(OrderTicket(),st,-1);
                  else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
                  continue;
                 }
              }

           }

         if(OrderType()==OP_SELL && OrderType()==toDefType(flag,itype))
           {
            pt=(OrderOpenPrice()-dAsk(n))/p;

            st=NormalizeDouble(MathFloor((dAsk(n)+MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
            if(pt>=level && level!=0)
              {
               if(stop==0 || (stop>st && (stop-st)/p>=dStep))
                 {
                  if(bvirtual) virtual_set(OrderTicket(),st,-1);
                  else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
                  continue;
                 }
              }

           }

        }

     }

  }
 
Alexandr Gavrilin:

Сложно стилизатором воспользоваться? (Ctrl+ , ) 

Можете воспользоваться моим кодом с некоторой доработкой под себя. 

Сколько в среднем бывает OrderMagicNumber() и сколько OrderSymbol()?

Лучше ордера сортировать так:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
  {
   if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      continue;
   if(OrderType()>OP_SELL)
      continue;
   if(OrderMagicNumber()!=MagicIdentifier)
      continue;
   if(OrderSymbol()!=sYmbol)
      continue;

//Исполняемый код

  }
//+------------------------------------------------------------------+
 
Alexandr Gavrilin:

Сложно стилизатором воспользоваться? (Ctrl+ , ) 

Можете воспользоваться моим кодом с некоторой доработкой под себя. 

//автор Гаврилин Александр
void GOrders::trailing_simple(double level,double doffset,double dstep=0,int itype=ALL)
  {
   double st,stop=0,dStep=dstep;
   int flag;

   if(level==0.0) return;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;

      if(OrderType()>=2) continue;
      if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1))
        {

         string n=OrderSymbol();
         double tick=MarketInfo(n,MODE_TICKSIZE);
         if(dStep==0) dStep=tick/p;

         stop=OrderStopLoss();
         if(bvirtual) stop=virtual_get_sl(OrderTicket());

         double pt=0;
         flag=toMyTypes(OrderType())&itype;

         if(OrderType()==OP_BUY && OrderType()==toDefType(flag,itype))
           {
            pt=(dBid(n)-OrderOpenPrice())/p;
            // Print("buy pt=",pt);    
            st=NormalizeDouble(MathFloor((dBid(n)-MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
            if(pt>=level && level!=0.0)
              {
               if(stop==0 || (stop<st && (st-stop)/p>=dStep))
                 {
                  if(bvirtual) virtual_set(OrderTicket(),st,-1);
                  else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
                  continue;
                 }
              }

           }

         if(OrderType()==OP_SELL && OrderType()==toDefType(flag,itype))
           {
            pt=(OrderOpenPrice()-dAsk(n))/p;

            st=NormalizeDouble(MathFloor((dAsk(n)+MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
            if(pt>=level && level!=0)
              {
               if(stop==0 || (stop>st && (stop-st)/p>=dStep))
                 {
                  if(bvirtual) virtual_set(OrderTicket(),st,-1);
                  else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
                  continue;
                 }
              }

           }

        }

     }

  }
мне в чужом коде пока сложно разобраться, опыта маловато
 
Vitaliy29:
мне [...] опыта маловато

 Наберите в поисковике эту строчку:

"Оцените курс по программированию от Kirill" 

 
Lilita Bogachkova:
Вы бы сначала прочитали про 
bool

 Возможно тут всегда "false"

TrallStopLoss_Ask>Ask+NormalizeDouble(Point*TR_otstup,5)

 Тут всегда "true", потому и OP_BUY OrderModify() вызывается 

TrallStopLoss_Bid<Bid-NormalizeDouble(Point*TR_otstup,5)  
Lilita Bogachkova:
Вы бы сначала прочитали про 
bool

 Возможно тут всегда "false"

TrallStopLoss_Ask>Ask+NormalizeDouble(Point*TR_otstup,5)

 Тут всегда "true", потому и OP_BUY OrderModify() вызывается 

TrallStopLoss_Bid<Bid-NormalizeDouble(Point*TR_otstup,5)
Проверял удалял условие полностью оставлял только проверку на OP_SELL ничего на поменялось
 
Vitaliy29:

Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет:

if (OrdersTotal ()==2&&TrailingStop==1)//определение количества открытых ордеров и разрешения на трейлинг
{Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if ((OrderType()==OP_SELL)&&(Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5))&&((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5)))||(TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
if ((OrderType()==OP_BUY)&&(Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5)))&&(TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
}

 


подскажите в чем прикол а то я уже голову сломал!!! 

Ошибка при вызове OrderModify() ? Или вообще условие не срабатывает для Sell ?
 
Vitaliy29:

 Проверьте так:

if(OrdersTotal()==2 && TrailingStop==1)//определение количества открытых ордеров и разрешения на трейлинг
  {
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()>OP_SELL)
         continue;

      Ticket_ordera_TRSTOP=OrderTicket();
      if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-MathMax(NormalizeDouble(TR_otstup*Point,5),NormalizeDouble((Ask-Bid)*2.0,5)))))// && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))
        {
         TrallStopLoss_Ask=Ask+Point*TR_otstup;
         Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),MathMax(Ask+NormalizeDouble(Point*TR_otstup,5),Ask+NormalizeDouble((Ask-Bid),5)),OrderTakeProfit(),0,clrDarkViolet);
         if(!Orders)
            Print("ошибка трейлинга- "+GetLastError());
        }
      if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
        {
         TrallStopLoss_Bid=Bid-Point*TR_otstup;
         Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
         if(!Orders)
            Print("ошибка трейлинга- "+GetLastError());
        }
     }
  }


 

 


при выборе ордера ошибка, напиши так:


if(OrdersTotal()==2 && TrailingStop==1)
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
           {
            Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
            Ticket_ordera_TRSTOP=OrderTicket();
            if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5)) && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))))
              {
               TrallStopLoss_Ask=Ask+Point*TR_otstup;
               Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
               Print("ошибка трейлинга- "+GetLastError());
              }
            if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
              {
               TrallStopLoss_Bid=Bid-Point*TR_otstup;
               Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
               Print("ошибка трейлинга- "+GetLastError());
              }
           }
       }
 
Alexander Berdenev:


при выборе ордера ошибка, напиши так:


if(OrdersTotal()==2 && TrailingStop==1)
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
           {
            Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
            Ticket_ordera_TRSTOP=OrderTicket();
            if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5)) && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))))
              {
               TrallStopLoss_Ask=Ask+Point*TR_otstup;
               Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
               Print("ошибка трейлинга- "+GetLastError());
              }
            if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
              {
               TrallStopLoss_Bid=Bid-Point*TR_otstup;
               Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
               Print("ошибка трейлинга- "+GetLastError());
              }
           }
       }
Alexander Berdenev:


при выборе ордера ошибка, напиши так:


if(OrdersTotal()==2 && TrailingStop==1)
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
           {
            Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
            Ticket_ordera_TRSTOP=OrderTicket();
            if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5)) && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))))
              {
               TrallStopLoss_Ask=Ask+Point*TR_otstup;
               Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
               Print("ошибка трейлинга- "+GetLastError());
              }
            if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
              {
               TrallStopLoss_Bid=Bid-Point*TR_otstup;
               Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
               Print("ошибка трейлинга- "+GetLastError());
              }
           }
       }
Спасибо, попробую!
Причина обращения: