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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nikolay Elin
34
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 (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);

    }  

Sergey Kolemanov
1019
Sergey Kolemanov  
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);

        }

    

  } 
FXwin
756
FXwin  
Sergey Kolemanov:

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

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

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

FXwin
756
FXwin  

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

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;
  } 
Andrei Fandeev
36116
Andrei Fandeev  
FXwin:

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

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

FXwin
756
FXwin  
Andrei Fandeev:

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

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

Andrei Fandeev
36116
Andrei Fandeev  
FXwin:

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

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

FXwin
756
FXwin  
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));}
Andrei Fandeev
36116
Andrei Fandeev  
FXwin:

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

Именно.

FXwin
756
FXwin  
Andrei Fandeev:

Именно.

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий