Помогите с кодом

 

Надо вставить в код функцию закрытия сделки. По следующему пересечению основной и сигнальной линией.

 

//+------------------------------------------------------------------+                              
//+------------------------------------------------------------------+

#property description "Советник открывает позиции по сигналам стохастика"
//--------------------------------------------------------------------*/
extern int     KPeriod              = 5;
extern int     DPeriod              = 3;
extern int     Slowing              = 3;
extern int     LevelSell            = 75;
extern int     LevelBuy             = 25;
extern int     Stoploss             = 50;           //стоплосс
extern int     Takeprofit           = 50;           //тейкпрофит
extern int     TrailingStop         = 10;           //трейлингстоп, если 0, то нет трейлинга
extern double  Lot                  = 0.10;         //лот
extern int     slippage             = 5;            // проскальзывание
extern int     Magic                = 0;
//--------------------------------------------------------------------
double STOPLEVEL;

//-------------------------------------------------------------------
void OnTick()
{
   if (!IsTradeAllowed())
   {
      return;
   }
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL,OTP,OOP,StLo=0,SL=0,TP=0;
   int i,b=0,s=0,tip;
   for (i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
         {
            tip = OrderType();
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OTP = NormalizeDouble(OrderTakeProfit(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;TP=OTP;
            if (tip==OP_BUY)            
            {  
               b++;
               if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
               {
                  SL = NormalizeDouble(OOP - Stoploss   * Point,Digits);
               }
               if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
               {
                  TP = NormalizeDouble(OOP + Takeprofit * Point,Digits);
               }
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
               {
                  StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
                  if (StLo >= OOP && StLo > OSL) SL = StLo;
               }
               if (SL != OSL || TP != OTP)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",(GetLastError()),">> ");
               }
            }                                        
            if (tip==OP_SELL)        
            {
               s++;
               if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
               {
                  SL = NormalizeDouble(OOP + Stoploss   * Point,Digits);
               }
               if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
               {
                  TP = NormalizeDouble(OOP - Takeprofit * Point,Digits);
               }
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
               {
                  StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
                  if (StLo <= OOP && (StLo < OSL || OSL==0)) SL = StLo;
               }
               if (SL != OSL || TP != OTP)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",(GetLastError()),">> ");
               }
            }
         }
      }
   }
   //----------------------------------------------------------------

   double Stoch0 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,0);
   double Signl0 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_SIGNAL,0);

   double Stoch1 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,1);
   double Signl1 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_SIGNAL,1);

   //-----------------------------------------------------------------------
   if (Stoch0>Signl0 && Stoch1<Signl1 && Stoch0<LevelBuy)
   {
      if (b==0)
      {
         if (OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL,Magic,0,clrNONE)==-1) Print("Ошибка открытия ордера <<",(GetLastError()),">>  ");
      }
   }
   if (Stoch0<Signl0 && Stoch1>Signl1 && Stoch0>LevelSell)
   {
      if (s==0)
      {
         if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,0,NULL,Magic,0,clrNONE)==-1) Print("Ошибка открытия ордера <<",(GetLastError()),">>  ");
      }
   }
return;
}
//--------------------------------------------------------------------
Программные помощники MQL для работы на финансовых рынках
  • cmillion.ru
Бесплатная версия советника fishing получила свое развитие и в итоге советник оброс множеством функций и возможностей, которых нет в начальной версии. Если что то будет непонятно из описания работы советника на картинке, то всегда можно задать вопрос, а также присоединиться к обсуждению и улучшению работы советника на форуме МТ5. Все...
 

Двойная-тройная нормализация - типа "кашу маслом не испортишь"?

А по поводу закрытия - так там такой же цикл, как выше в коде нужен, перебираем все рыночные ордера и закрываем их, до открытия новых. Рекомендую только перебор в цикле в обратную сторону вести, да в отдельную функцию оформить.

И это... Не надо дубли тем создавать, не комильфо.

 
https://www.mql5.com/ru/forum/161579
код закрытия сделки
код закрытия сделки
  • www.mql5.com
Здравствуйте. Нужен код для вставки в советник, чтобы он закрывал сделку либо по стоп-лосу, либо после закрытия свечи если стоп-лос не сработал...