Дублирование отложенных ордеров

 

Здравствуйте. Привожу код советника. Он выставляет отложенные ордера при каждом тике, а нужно чтоб выставил бы только один раз. Можете помочь?

extern  string s="Выбор валютной пары";

input double PRICES = 1.1600;
extern  string Symbol1 = "EURUSD";
extern  double P1 = 0;
extern int Magic1 = 123;
extern  double P2 = 0;
extern  double P3 = 0;
extern  double P4 = 0;
input string COMMENT1 = "test";
extern  string Symbol2 = "GBPUSD";
input string COMMENT2 = "test";
extern  string Symbol3 = "";
extern  string Symbol4 = "";
extern  string Symbol5 = "";
extern  string Symbol6 = "";
extern  string Symbol7 = "";
extern  string Symbol8 = "";
extern  string Symbol9 = "";

extern  string ss="Настройки советника";

extern double Lots1       = 0.01;      // LOT
extern double Lots2       = 0.1;      // LOT
extern int TakeProfit    = 3333;      // TP
extern int StopLoss      = 3333;      // SL
extern int Slip          = 30;        // SLEPE
extern int Magic         = 123;       // MAG

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment(PRICES);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Symbol1!="")
     {
      OpenPos(Symbol1);
     }
   if(Symbol2!="")
     {
      OpenPos(Symbol2);
     }
   if(Symbol3!="")
     {
      OpenPos(Symbol3);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,string symb)
  {
   int r=0,d=0;
   color clr=Green;
   double sl=0,tp=0, pp=0;
   pp= MarketInfo(symb,MODE_POINT);
   d =(int)MarketInfo(symb,MODE_DIGITS);

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*pp,d);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*pp,d);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*pp,d);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*pp,d);
     }

   r=OrderSend(Symbol1,OP_BUY,Lots1,NormalizeDouble(price,d),Slip,sl,tp,COMMENT1,Magic,0,clr);

   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P1,Slip,sl,tp,COMMENT1,Magic1,0,clr);
   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P2,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P3,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P4,Slip,sl,tp,COMMENT1,Magic,0,clr);

   r=OrderSend(Symbol2,OP_SELL,Lots2,NormalizeDouble(price,d),Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_BUYLIMIT,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_BUYSTOP,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_SELLLIMIT,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_SELLSTOP,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);

   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos(string symb)

  {

   double bid=0,ask=0;

   if(CountTrades(symb)<1)
     {
      if(PRICES - Bid < -Point() / 10.0)
        {
         bid = MarketInfo(symb,MODE_BID);
         ask = MarketInfo(symb,MODE_ASK);

         //buy
         if(CountTrades(symb)<1)
           {
            PutOrder(0,ask,symb);
           }

         //sell
         if(CountTrades(symb)<1)
           {
            PutOrder(1,bid,symb);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(string symb)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symb && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }

   return(count);
  }
 
          static datetime bar_time = 0;
          datetime _time = iTime(_Symbol, PERIOD_CURRENT, 0);
          if( bar_time == _time )
               return;
          bar_time = _time;
          /* рабтаем*/
 
выдает ошибки. может не туда записываю? можете указать где в коде правильно разместить?
 

nas3ha:


.....
FlagOpnOr = false; // после extern int Magic ... флаг открытия ордеров
.....

void OnTick()
  {
  if(FlagOpnOr == false) 
  {
   if(Symbol1!="")
     {
      OpenPos(Symbol1);
     }
   if(Symbol2!="")
     {
      OpenPos(Symbol2);
     }
   if(Symbol3!="")
     {
      OpenPos(Symbol3);
     }
  FlagOpnOr = true;
  }
  }

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

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

 

Опять что то не так делаю.

extern  string s="Выбор валютной пары";

input double PRICES = 1.1600;
extern  string Symbol1 = "EURUSD";
extern  double P1 = 0;
extern int Magic1 = 123;
extern  double P2 = 0;
extern  double P3 = 0;
extern  double P4 = 0;
input string COMMENT1 = "test";
extern  string Symbol2 = "GBPUSD";
input string COMMENT2 = "test";
extern  string Symbol3 = "";
extern  string Symbol4 = "";
extern  string Symbol5 = "";
extern  string Symbol6 = "";
extern  string Symbol7 = "";
extern  string Symbol8 = "";
extern  string Symbol9 = "";

extern  string ss="Настройки советника";

extern double Lots1       = 0.01;      // LOT
extern double Lots2       = 0.1;      // LOT
extern int TakeProfit    = 3333;      // TP
extern int StopLoss      = 3333;      // SL
extern int Slip          = 30;        // SLEPE
extern int Magic         = 123;       // MAG
int FlagOpnOr = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment(PRICES);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  if(FlagOpnOr == false) 
  {
   if(Symbol1!="")
     {
      OpenPos(Symbol1);
     }
   if(Symbol2!="")
     {
      OpenPos(Symbol2);
     }
   if(Symbol3!="")
     {
      OpenPos(Symbol3);
     }
  FlagOpnOr = true;
  }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,string symb)
  {
   int r=0,d=0;
   color clr=Green;
   double sl=0,tp=0, pp=0;
   pp= MarketInfo(symb,MODE_POINT);
   d =(int)MarketInfo(symb,MODE_DIGITS);

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*pp,d);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*pp,d);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*pp,d);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*pp,d);
     }

   r=OrderSend(Symbol1,OP_BUY,Lots1,NormalizeDouble(price,d),Slip,sl,tp,COMMENT1,Magic,0,clr);

   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P1,Slip,sl,tp,COMMENT1,Magic1,0,clr);
   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P2,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P3,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P4,Slip,sl,tp,COMMENT1,Magic,0,clr);

   r=OrderSend(Symbol2,OP_SELL,Lots2,NormalizeDouble(price,d),Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_BUYLIMIT,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_BUYSTOP,Lots2,1.1500,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_SELLLIMIT,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);
   r=OrderSend(Symbol2,OP_SELLSTOP,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr);
   

   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos(string symb)

  {

   double bid=0,ask=0;

   if(CountTrades(symb)<1)
     {
      if(PRICES - Bid < -Point() / 10.0)
        {
         bid = MarketInfo(symb,MODE_BID);
         ask = MarketInfo(symb,MODE_ASK);

         //buy
         if(CountTrades(symb)<1)
           {
            PutOrder(0,ask,symb);
           }

         //sell
         if(CountTrades(symb)<1)
           {
            PutOrder(1,bid,symb);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(string symb)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symb && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }

   return(count);
  }

Открывает только два рыночных ордера и три отложених, к тому же BUYLIMIT выставляется дважды. 

 
nas3ha:

Опять что то не так делаю.

Открывает только два рыночных ордера и три отложених, к тому же BUYLIMIT выставляется дважды. 

Код внимательно не смотрел. А что правильно должен открывать?
Обычно как написано, так и работает)
Поправьте тип переменной флага на булеву. Предупреждение компилятор даёт.
bool FlagOpnOr = false;
 
Valeriy Yastremskiy:
Код внимательно не смотрел. А что правильно должен открывать?
Обычно как написано, так и работает)
Поправьте тип переменной флага на булеву. Предупреждение компилятор даёт.

И как то уж не по феньшуй сперва считать для или Бай или Селл стоплосс и тейкпрофит, и потом открывать все ордера и Бай и Селл направления. Для Селл стоплосс и тейкпрофит при открытии бай ордеров будет давать ошибку.

Причина обращения: