не могу понять в чем проблема

 

Всем привет.

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

Поставил ограничение (if (OrdersTotal ()==0)), а он может открыть до 4 (большее количество не наблюдал) ордеров при чем в один момент времени. Не могу понять где ошибка.

Есть еще одна проблемка - программа не модифицирует ордера. Тоже не могу понять где просчитался.

Буду признателен за помощь.

extern int     Quant_Bars = 5;     // Количество баров

                           
bool New_Bar=false;

double Lot = 0.1;








//--------------------------------------------------------------------------------------------------


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+



  
int start()
{


int i;
double Min_H=High[1];
double Max_L=Low[1];

double Alligator=iAlligator(NULL,0,13,32,8,5,5,3,2,4,MODE_GATORTEETH,1);




if (OrdersTotal()==0)
{
for(i=2;i<=Quant_Bars;i++)
   {
   if(Low[i]>Max_L)
        Max_L=Low[i];
        if (High[i]<Min_H)
        Min_H=High[i];

      if (Alligator>Ask)
      {
         if(Max_L==Low[1])
{
        if(Ask==Low[2]-1*Point)
        Sell();
}

if(Max_L==Low[2])
{
        if(Low[1]>=Low[3] && Ask==Low[3]-1*Point)
        Sell();
}

if(Max_L==Low[3])
{
        if(Low[2]>=Low[4] && Low[1]>=Low[4] && Ask==Low[4]-1*Point)
        Sell();
}

if(Max_L==Low[4])
{
        if(Low[1]>=Low[5] && Low[2]>=Low[5] && Low[3]>=Low[5] && Ask==Low[5]-1*Point)
        Sell();
}

if(Max_L==Low[5])
{
        if(Low[1]>=Low[6] && Low[2]>=Low[6] && Low[3]>=Low[6] && Low[4]>=Low[6]&& Ask==Low[6]-1*Point)
        Sell();
}
    
     
      }
      
      
      
      
      
      
      
      if (Alligator<Bid)
      {
      
     if(Min_H==High[1])
{
        if(Bid==High[2]+1*Point)
        Buy();
}

if(Min_H==High[2])
{
        if(High[1]<=High[3] && Bid==High[3]+1*Point)
        Buy();
}

if(Min_H==High[3])
{
        if(High[2]<=High[4] && High[1]<=High[4] && Bid==High[4]+1*Point)
        Buy();
}

if(Min_H==High[4])
{
        if(High[1]<=Low[5] && High[2]<=High[5] && High[3]<=High[5] && Bid==High[5]+1*Point)
        Buy();
}

if(Min_H==High[5])
{
        if(High[1]<=High[6] && High[2]<=High[6] && High[3]<=High[6] && High[4]<=High[6]&& Bid==High[6]+1*Point)
        Buy();
}
   }
  }
}

if (OrdersTotal()>0)

   Fun_New_Bar();                               
      
   
      if( New_Bar==true)
      {
      for(int k=0; k<=OrdersTotal(); i++)
      {
         if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
         {
      
      
       if (OrderOpenTime()<Time[0] && Time[1]<=OrderOpenTime() )
         {
            if (OrderType()==OP_BUY)
               {
               OrderModify(OrderTicket(),OrderOpenPrice(),Low[1], 0, 0, Green);
               }
            if(OrderType()==OP_SELL)
               {
               OrderModify(OrderTicket(),OrderOpenPrice(),High[1], 0, 0, Red);
               }
         }
      if(OrderOpenTime()<Time[1] && Time[2]<=OrderOpenTime() )
         {
            if (OrderType()==OP_BUY)
               {
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+1*Point, 0, 0, Green);
               }
            if(OrderType()==OP_SELL)
               {
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-1*Point, 0, 0, Red);
               }
         }
       if(OrderOpenTime()<Time[2] && Time[3]<=OrderOpenTime())
         {
            if (OrderType()==OP_BUY)
               {
               OrderModify(OrderTicket(),OrderOpenPrice(),0, Close[1]-10*Point, 0, Green);
               }
            if(OrderType()==OP_SELL)
               {
               OrderModify(OrderTicket(),OrderOpenPrice(),0, Close[1]+10*Point, 0, Red);
               }
         }
      }
}
}



   return;
}



double Buy ()
{

RefreshRates();
OrderSend (Symbol (), OP_BUY, Lot, Ask, 0, Low[1],Ask+50*Point, NULL,0, 0,Green); // Открываемся вверх
Print(GetLastError());
return;

}


double Sell ()
{

RefreshRates();
OrderSend (Symbol (), OP_SELL, Lot, Bid, 0, High[1],Bid-50*Point,NULL ,0, 0,Red); //Открываемся вниз
Print(GetLastError());
return;

}

bool Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime New_Time=0;                  // Время текущего бара
   bool New_Bar=false;                               // Нового бара нет
   if(New_Time!=Time[0])                        // Сравниваем время
     {
      New_Time=Time[0];                         // Теперь время такое
      New_Bar=true;                             // Поймался новый бар
     }
  }
 

надо для селла и для бая

double Sell ()
{

RefreshRates();

if(OrdersTotal()==0) 
{
OrderSend (Symbol (), OP_SELL, Lot, Bid, 0, High[1],Bid-50*Point,NULL ,0, 0,Red); //Открываемся вниз
Print(GetLastError()); }
return;

 
Maks:

Всем привет.

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

Поставил ограничение (if (OrdersTotal ()==0)), а он может открыть до 4 (большее количество не наблюдал) ордеров при чем в один момент времени. Не могу понять где ошибка.

Есть еще одна проблемка - программа не модифицирует ордера. Тоже не могу понять где просчитался.

Буду признателен за помощь.

Наверно с фигурными скобками где-то напутано.
 
paukas:

надо для селла и для бая


Спасибо большое, а что по модификации подскажете?

 
khorosh:
Наверно с фигурными скобками где-то напутано.
Там цикл, в начале проверено что нет ордеров, а потом в цикле десяток открывается, проверок нет
 
khorosh:
Наверно с фигурными скобками где-то напутано.

нет, с прогой все ок. Если б была проблема со скобками я б ее не скомпилировал, а так все чудно работает, вот только не совсем так как мне надо.
 
Maks:

Спасибо большое, а что по модификации подскажете?

После каждого ифа коммент выведите, посмотрите попадает туда или неправильное условие
if (OrderOpenTime()<Time[0] && Time[1]<=OrderOpenTime() )
{ print.....
}
 
paukas:
После каждого ифа коммент выведите, посмотрите попадает туда или неправильное условие

ок, спасибо
 
Maks:

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

Ошибаетесь, скомпилируется, если количество открывающих и закрывающих скобок одинаково. Но они могут быть расставлены неправильно.

Расставьте открывающую скобку и соответствующую ей закрывающую на одной вертикали. Так легче будет разбираться.

А перед модификацией надо проверять, чтобы стоплосс и тейкпрофит не были ближе к цене ордера чем величина стоплевела.

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