Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай, как растет твой рейтинг
protr
358
protr 2015.11.05 09:57 

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

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

К примеру по значению еквити 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);
  }
pako
3309
pako 2015.11.05 11:22  
protr:

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

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

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

Спасибо.

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

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

Maxim Dmitrievsky
13831
Maxim Dmitrievsky 2015.11.05 11:46  
pako:

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

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

еквити-(баланс+комисс) >1 так надежней :)
Maxim Dmitrievsky
13831
Maxim Dmitrievsky 2015.11.05 11:50  

Может тут 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);
        }
protr
358
protr 2015.11.05 13:12  
pako:

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

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

 

Спасибо. 

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

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

pako
3309
pako 2015.11.05 13:22  
protr:

 

Спасибо. 

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

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

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

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

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

Если Вы о bool a =

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

Maxim Dmitrievsky
13831
Maxim Dmitrievsky 2015.11.05 13:57  
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);
        }
     }
protr
358
protr 2015.11.05 14:17  
Maxim Dmitrievsky:

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

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