Как ограничить открытие ордеров на "0" баре

 

Подскажите код на ограничение открытия советником ордеров на "0" баре, в этом случае не более двух ордеров sell и bay

int start()

  {

//   if (TimeBar==Time[0]) return(0);

   double MA_slow=iMA (Symbol(),0,Period_MA_slow,Shift_MA_slow,Metod_MA_slow,Price_MA_slow,0);

   double MA_fast=iMA (Symbol(),0,Period_MA_fast,Shift_MA_fast,Metod_MA_fast,Price_MA_fast,0);

   double MA_fast11=iMA (Symbol(),0,Period_MA_fast,Shift_MA_fast,Metod_MA_fast,Price_MA_fast,1);

   double MA_fast2=iMA (Symbol(),0,Period_MA_fast2,Shift_MA_fast2,Metod_MA_fast2,Price_MA_fast2,0);

   double MA_fast22=iMA (Symbol(),0,Period_MA_fast2,Shift_MA_fast2,Metod_MA_fast2,Price_MA_fast2,1);

   int res;

   int kolpos = 0;

   for(int pos=0; pos<OrdersTotal(); pos++)

    {

    res=OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);

    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

    kolpos++;

    }

    if (kolpos==0)

    {

    if(MA_slow>MA_fast&&MA_slow<MA_fast11)

      {

//      TimeBar=Time[0];

      res=OrderSend(Symbol(),OP_SELL,Lot,Bid,10,NormalizeDouble(Bid+Stoploss*Point,Digits),NormalizeDouble(Bid-Takeprofit*Point,Digits),NULL,Magic,0,clrRed);

      res=OrderSend(Symbol(),OP_SELL,Lot,Bid,10,NormalizeDouble(Bid+Stoploss*Point,Digits),NormalizeDouble(Bid-Takeprofit2*Point,Digits),NULL,Magic,0,clrRed);

     

      }

     if(MA_slow<MA_fast2&&MA_slow>MA_fast22)

     {

 //    TimeBar=Time[0];

      res=OrderSend(Symbol(),OP_BUY,Lot,Ask,10,NormalizeDouble(Ask-Stoploss*Point,Digits),NormalizeDouble(Ask+Takeprofit*Point,Digits),NULL,Magic,0,clrGreen);

      res=OrderSend(Symbol(),OP_BUY,Lot,Ask,10,NormalizeDouble(Ask-Stoploss*Point,Digits),NormalizeDouble(Ask+Takeprofit2*Point,Digits),NULL,Magic,0,clrGreen);

     }

    } 

   

  

   

  return(0);

  }

 

Ведите подсчёт открытых сделок и обнуляйте этот подсчёт на новой свече

int buycount=0, sellcount=0;

int start()
   {
   if(TimeBar!=Time[0])
      {
      TimeBar=Time[0];
      buycount=0;
      sellcount=0; 
      }
   
//---

   if(buycount<2)
      {
      res=OrderSend(Symbol(),OP_BUY....
      if(res!=-1) buycount++;
      }
   
   if(sellcount<2)
      {
      res=OrderSend(Symbol(),OP_SELL....
      if(res!=-1) sellcount++;
      }
   return(0);
   }
 
Не правильно сформулировал вопрос, 

Как ограничить открытие ордеров на "0" баре даже если предыдущие 2 сделки закрылись по TP или SL.

 
Да уж, сейчас тоже не понятно. Опишите подробнее условие. Текущий бар он всегда нулевой, Вы имеете в виду новый? Про сделки ничего не понятно. Закрылись когда? На текущем баре? А если не закрылись? Закрылась одна? Закрылись 3 часа назад? Когда можно открывать?
Сейчас по Вашему описанию можно прочитать, что после двух сделок торговля останавливается.
 

Условия для открытия сделок

if(MA_slow>MA_fast&&MA_slow<MA_fast11)

      {


      res=OrderSend(Symbol(),OP_SELL,Lot,Bid,10,NormalizeDouble(Bid+Stoploss*Point,Digits),NormalizeDouble(Bid-Takeprofit*Point,Digits),NULL,Magic,0,clrRed);

      res=OrderSend(Symbol(),OP_SELL,Lot,Bid,10,NormalizeDouble(Bid+Stoploss*Point,Digits),NormalizeDouble(Bid-Takeprofit2*Point,Digits),NULL,Magic,0,clrRed);

     

      }

     if(MA_slow<MA_fast2&&MA_slow>MA_fast22)

     {


      res=OrderSend(Symbol(),OP_BUY,Lot,Ask,10,NormalizeDouble(Ask-Stoploss*Point,Digits),NormalizeDouble(Ask+Takeprofit*Point,Digits),NULL,Magic,0,clrGreen);

      res=OrderSend(Symbol(),OP_BUY,Lot,Ask,10,NormalizeDouble(Ask-Stoploss*Point,Digits),NormalizeDouble(Ask+Takeprofit2*Point,Digits),NULL,Magic,0,clrGreen);

     }


Необходимо открывать сделки на каждом появившемся сигнале (пересечения MA). Но если поставить TP или SL слишком маленькие, то ордера закрываются на той же свече что и открылись и советник снова открывает пару сделок на той же свече на которой был сигнал. Вот и вопрос как сделать так чтобы советник не открывал больше двух сделок по 1 сигналу (т.е. на сигнально свече)?

 
Вроде тогда подходит первый ответ. На одной свече может открыться не более двух buy и двух sell. Ну или пар. Присоедините к своему условию входа ещё && buycount<2.
 

Как-то так:

int buycount=0, sellcount=0;
double  MA_slow, MA_fast, MA_fast11, MA_fast2, MA_fast22;
int  res1, res2;   
datetime TimeBar=0;
bool finded=false;

int start()
   {
   if(TimeBar!=Time[0])
      {
      TimeBar=Time[0];
      buycount=0;
      sellcount=0; 
      }

   MA_slow=iMA (Symbol(),0,Period_MA_slow,Shift_MA_slow,Metod_MA_slow,Price_MA_slow,0);
   MA_fast=iMA (Symbol(),0,Period_MA_fast,Shift_MA_fast,Metod_MA_fast,Price_MA_fast,0);
   MA_fast11=iMA (Symbol(),0,Period_MA_fast,Shift_MA_fast,Metod_MA_fast,Price_MA_fast,1);
   MA_fast2=iMA (Symbol(),0,Period_MA_fast2,Shift_MA_fast2,Metod_MA_fast2,Price_MA_fast2,0);
   MA_fast22=iMA (Symbol(),0,Period_MA_fast2,Shift_MA_fast2,Metod_MA_fast2,Price_MA_fast2,1);

   if(MA_slow>MA_fast && MA_slow<MA_fast11 && sellcount<2)
      {
      finded=false;
      for(int pos=0; pos<OrdersTotal(); pos++)
         {
         if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            {
            finded=true;
            break;
            }
         }
      if(!finded)
         {
         res1=OrderSend(Symbol(),OP_SELL,Lot,Bid,10,NormalizeDouble(Bid+Stoploss*Point,Digits),NormalizeDouble(Bid-Takeprofit*Point,Digits),NULL,Magic,0,clrRed);
         res2=OrderSend(Symbol(),OP_SELL,Lot,Bid,10,NormalizeDouble(Bid+Stoploss*Point,Digits),NormalizeDouble(Bid-Takeprofit2*Point,Digits),NULL,Magic,0,clrRed);
         if(res1!=-1 || res2!=-1) sellcount++;
         }
      }

   if(MA_slow<MA_fast2 && MA_slow>MA_fast22 && buycount<2)
      {
      finded=false;
      for(int pos=0; pos<OrdersTotal(); pos++)
         {
         if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            {
            finded=true;
            break;
            }
         }
      if(!finded)
         {
         res1=OrderSend(Symbol(),OP_BUY,Lot,Ask,10,NormalizeDouble(Ask-Stoploss*Point,Digits),NormalizeDouble(Ask+Takeprofit*Point,Digits),NULL,Magic,0,clrGreen);
         res2=OrderSend(Symbol(),OP_BUY,Lot,Ask,10,NormalizeDouble(Ask-Stoploss*Point,Digits),NormalizeDouble(Ask+Takeprofit2*Point,Digits),NULL,Magic,0,clrGreen);
         if(res1!=-1 || res2!=-1) buycount++;
         }
      }
   return(0);
   } 
Причина обращения: