Помогите пожалуйста с открытием ордеров

 

Пишу советник, возникла проблема: открывается ордер по условию, и пока он не закроется, следующий ордер не открывается. А хотелось бы, чтоб каждый раз при наступлении условия ордер снова открывался, не важно открывался ли ордер до этого.

Код:

void OnTick(void)

  {

   MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0);

   MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1);

   SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0);

   SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1);

 

   if (CountSell() == 0 && MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious)

        {

                                    

        ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red);

        }

   if (CountBuy() == 0 && MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious)

        {

                                     

        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green);

        }

    

  } 

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

   int CountSell()

    {

     int count = 0;

     for(int trade = OrdersTotal()- 1; trade>=0; trade--)

     {

      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      {

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

       count++;

      }

     }

     return(count);

    }  

    

    int CountBuy()

    {

     int count = 0;

     for(int trade = OrdersTotal()- 1; trade>=0; trade--)

     {

      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      {

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

       count++;

      }

     }

     return(count);

    }  

 
Nikolay Elin:
void OnTick(void)

  {

   MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0);

   MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1);

   SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0);

   SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1);

 

   if (MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious)

        {

                                    

        ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red);

        }

   if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious)

        {

                                     

        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green);

        }

    

  } 
 
Sergey Kolemanov:

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

 
Nikolay Elin:  ... чтоб каждый раз при наступлении условия ордер снова открывался, не важно открывался ли ордер до этого.

Сделайте ещё функцию поиска времени открытия последнего рыночного ордера TimeLastOpen()
И замените CountSell() == 0 и CountBuy() == 0 на TimeLastOpen()<iTime(NULL,0,0)

 

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

int SignalBuy=-1,SignalSell=-1;
bool buy=true,sell=true;

void OnTick(void)
  {
   MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0);

   MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1);

   SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0);

   SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1); 
//----+
   if (MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) {SignalSell=1;} else SignalSell=-1;
   if (SignalSell==1 && sell)
        {                                    
        ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red); sell=false;
        }
   if(SignalSell==-1) sell=true;
//----+   
   if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) {SignalBuy=1;} else SignalBuy=-1;
   if (SignalBuy==1 && buy)
        {
        ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green); buy=false;
        }
   if(SignalBuy==-1) buy=true;
  } 
 
FXwin:

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

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

 
Andrei Fandeev:

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

Очень даже можно и перезагружать осторожно))
Нет открытых позиций и терминал лагает можно и перезагружаться, также если видно по индикатору что сигнал не соответствует ни одному из направлений.
Зачем во время открытия позиции сразу перезагружаться?

 
FXwin:

Очень даже можно и перезагружать осторожно))
Нет открытых позиций и терминал лагает можно и перезагружаться, также если видно по индикатору что сигнал не соответствует ни одному из направлений.
Зачем во время открытия позиции сразу перезагружаться?

Электросетям не прикажешь.
Предложенный мною выше метод исключает ошибку.
Вы ведь не уверены что график советника не Period() == W1 ? А за неделю много что может случиться.

 
Andrei Fandeev:

Электросетям не прикажешь.
Предложенный мною выше метод исключает ошибку.

Аааа, ваш вариант подразумевает не было ли открытия на текущем баре?
Ну можно тогда и это учесть

int SignalBuy=-1,SignalSell=-1;
bool buy=true,sell=true;

void OnTick(void)
  {
   MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0);

   MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1);

   SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0);

   SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1); 
//----+
   if (MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) {SignalSell=1;} else SignalSell=-1;
   if (SignalSell==1 && BarOp()!=0 && sell)
        {                                    
        ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red); sell=false;
        }
   if(SignalSell==-1) sell=true;
//----+   
   if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) {SignalBuy=1;} else SignalBuy=-1;
   if (SignalBuy==1 && BarOp()!=0 && buy)
        {
        ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green); buy=false;
        }
   if(SignalBuy==-1) buy=true;
  } 
//+------------------------------------------------------------------+ 
//| Одна позиция на одном баре //if(BarOp()!=0)                      | 
//+------------------------------------------------------------------+ 
bool BarOp(){
   datetime t=0;
   for(int i=OrdersTotal()-1; i>=0; i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {   
   if(t<OrderOpenTime()) t=OrderOpenTime();}
return(iBarShift(Symbol(),0,t,true));}
 
FXwin:

Аааа, ваш вариант подразумевает не было ли открытия на текущем баре?

Именно.

 
Andrei Fandeev:

Именно.

Ну вроде всё учли, ждём благодарности))