Ошибка в логике

 

Здравствуйте... не могу найти свою ошибку... может у кого то получится. Огромное спасибо.

Цель просто - закрывать все рыночные ордера при достижении нового плюсового значения евити с шагом в степ.

К примеру по значению еквити 5000 когда доходит до 5001 все закрывается и теперь следующее закрытие будет при значении еквити 5002, а потом при 5003.

Спасибо.

extern double STEP = 1.0;
int a1=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!GlobalVariableCheck("A"))
     {
      datetime a_time=GlobalVariableSet("A",AccountEquity()); // задаю начальную точку
      if(ulong(a_time)==0)
        {
         MessageBox("Глобальная переменная терминала 'Точка отсчёта' не создана!","Ошибка",MB_OK|MB_ICONHAND);
        }
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(AccountEquity()-STEP>GlobalVariableGet("A")) //проверяю стал ли еквити на степ больше от начального значения
     {
      //---1
      F_Close_all(); 
      //---2
      int pos=0;
      for(int i=0; i<OrdersTotal(); i++)     // проверяю остались ли рыночные ордера 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               pos++;
        }
      if(pos>0) //если остались пробую закрыть еще раз
        {
         F_Close_all();
        }

      if(pos==0) //ставлю новую начальную точку
        {
         datetime a2_time=GlobalVariableSet("A",GlobalVariableGet("A")+STEP);
         //или
         //datetime a2_time=GlobalVariableSet("A",AccountEquity());
         a1++;
         Alert("a = ",a1);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double F_Close_all()
  {

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        {
         //if (OrderSymbol() != Symbol()) continue; 
         if(OrderType()==OP_BUYSTOP )  bool a = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_SELLSTOP)  bool b = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_BUYLIMIT ) bool c = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_SELLLIMIT) bool d = OrderDelete (OrderTicket(),CLR_NONE);
        }
     }

   bool error=true;
   int OMN,nn,OT,Ticket,j;
   double loss=0;
   while(true)
     {
      for(j=OrdersTotal()-1; j>=0; j--)
        {
         if(OrderSelect(j,SELECT_BY_POS))
           {
            OT = OrderType();
            OMN=OrderMagicNumber();
            Ticket=OrderTicket();
            if(OT>1) error=OrderDelete(Ticket);
            if(OT==OP_BUY)
              {
               error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),100,Blue);
               if(error) loss+=OrderProfit();
              }
            if(OT==OP_SELL)
              {
               error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),100,Red);
               if(error) loss+=OrderProfit();
              }
           }
        }
      int n=0;
      for(j= 0; j<OrdersTotal(); j++)
        {
         if(OrderSelect(j,SELECT_BY_POS))
           {
            OT=OrderType();
            n++;
           }
        }
      if(n==0) break;
      nn++;
      if(nn>10)
        {
         Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
         return(loss);
        }
      Sleep(1000);
      RefreshRates();
     }
   return(loss);
  }
 
protr:

Здравствуйте... не могу найти свою ошибку... может у кого то получится. Огромное спасибо.

Цель просто - закрывать все рыночные ордера при достижении нового плюсового значения евити с шагом в степ.

К примеру по значению еквити 5000 когда доходит до 5001 все закрывается и теперь следующее закрытие будет при значении еквити 5002, а потом при 5003.

Спасибо.

Должно быть сложно ? Или просто тоже пойдет? 

Если эквити - баланс > степ     Закрываем

 
pako:

Должно быть сложно ? Или просто тоже пойдет? 

Если эквити - баланс > 1  закрываем 

еквити-(баланс+комисс) >1 так надежней :)
 

Может тут true надо а не false?

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) //true???
        {
         //if (OrderSymbol() != Symbol()) continue; 
         if(OrderType()==OP_BUYSTOP )  bool a = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_SELLSTOP)  bool b = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_BUYLIMIT ) bool c = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_SELLLIMIT) bool d = OrderDelete (OrderTicket(),CLR_NONE);
        }
 
pako:

Должно быть сложно ? Или просто тоже пойдет? 

Если эквити - баланс > степ     Закрываем

 

Спасибо. 

Фишка в том что каждый раз нужно стартовать от пред идущего значения еквити который получился после закрытия все ордеров.

Так не подойдет 

 
protr:

 

Спасибо. 

Фишка в том что каждый раз нужно стартовать от пред идущего значения еквити который получился после закрытия все ордеров.

Так не подойдет 

После закрытия всех ордеров эквити равен балансу
 
Maxim Dmitrievsky:

Может тут true надо а не false?

И зачем тут объявлены переменные внутри цикла, которые нигде не используются?
 
pako:
После закрытия всех ордеров эквити равен балансу
Спасибо но в процессе работы баланс растет при том что еквити в данный момент может быть отрицательным
 
Maxim Dmitrievsky:
И зачем тут объявлены переменные внутри цикла, которые нигде не используются?

Если Вы о bool a =

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

 
protr:

Если Вы о bool a =

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

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

for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        {
         //if (OrderSymbol() != Symbol()) continue; 
         if(OrderType()==OP_BUYSTOP )  bool a = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_SELLSTOP)  bool b = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_BUYLIMIT ) bool c = OrderDelete (OrderTicket(),CLR_NONE);
         if(OrderType()==OP_SELLLIMIT) bool d = OrderDelete (OrderTicket(),CLR_NONE);
        }
     }
 
Maxim Dmitrievsky:

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

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