Скачать MetaTrader 5

Закрытие встречных ордеров. Нужна ваша помощь!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай, как установить MetaTrader на Mac OS
LEV
27
LEV 2014.10.19 18:12 

Уважаемые профи, помогите пож-т разобраться с закрытием встречных ордеров.

Логика такая:

Сначала советник определяет общую прибыль по всем открытым ордерам:

//Определяем общую прибыль по всем открытым ордерам
       Total=OrdersTotal()-1;
       for (int f=Total+1;f>=0;f--)
       {
       OrderSelect(f,SELECT_BY_POS,MODE_TRADES);
       if(OrderType()==OP_SELL)
       {
       Sell_Profit=OrderProfit();
       }
       if(OrderType()==OP_BUY)
       {
       Buy_Profit=OrderProfit();
       }
       double Total_Profit=Buy_Profit+Sell_Profit;
       Total_Orders++;
       Sell_Profit=0;
       Buy_Profit=0;
       }

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

//При достижении требуемого размера прибыли закрываем все открытые и отложенные ордера
       if(Total_Profit<0&&Total>=2)
       {
       while(OrdersTotal()>0)
       {
       int Total2=OrdersTotal()-1;
       for (int l=Total2+1;l>=0;l--)
       {
       OrderSelect(l,SELECT_BY_POS,MODE_TRADES);
//Определяем ордер SELL c наибольшим лотом
       if(OrderType()==OP_SELL)
       {
       SELL_Remains++;
       if (Max_Lot_SELL<OrderLots());
       Max_Lot_SELL=OrderLots();
       int Ticket_SELL=OrderTicket();
       }
//Определяем ордер BUY c наибольшим лотом
       if(OrderType()==OP_BUY)
       {
       BUY_Remains++;
       if (Max_Lot_BUY<OrderLots());
       Max_Lot_BUY=OrderLots();
       int Ticket_BUY=OrderTicket();
       }
//Определяем номер (Ticket) отложенного ордера
       if(OrderType()==OP_SELLSTOP||OrderType()==OP_BUYSTOP)
       {
       int TICKET=OrderTicket();
       }
       }
      

После того как определили наибольшие по объему ордера BUY и SELL взаимно из закрываем. Так же закрываем оставшиеся ордера (если встречных нет) и удаляем отложенный ордер:


       if(Max_Lot_SELL>0&&Max_Lot_BUY>0&&Max_Lot_SELL>Max_Lot_BUY)
       {
       bool Close_BY1=OrderCloseBy(Ticket_SELL,Ticket_BUY);
       Max_Lot_SELL=0;
       Max_Lot_BUY=0; 
       }
       if(Max_Lot_SELL>0&&Max_Lot_BUY>0&&Max_Lot_SELL<Max_Lot_BUY)
       {
       bool Close_BY=OrderCloseBy(Ticket_BUY,Ticket_SELL);
       Max_Lot_SELL=0;
       Max_Lot_BUY=0;
       }
       if(Close_BY1==false&&Close_BY==false)
       {
       Close_BUYSTOP_SELLSTOP=OrderDelete(TICKET,Yellow);
       bool Close_SELL=OrderClose(OrderTicket(),OrderLots(),Ask,0,Yellow);
       bool Close_BUY=OrderClose(OrderTicket(),OrderLots(),Bid,0,Yellow);
       }
       }
       }

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

Не могу в толк взять как работает один цикл (for) в другом (while).

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

LEV
27
LEV 2014.10.19 19:03  

void OnTick()   { //---
   double profit=100.00;
   bool res;    if(AccountInfoDouble(ACCOUNT_PROFIT)>=profit)//Определяем общую прибыль по всем открытым ордерам
     {
      for(int i=OrdersTotal()-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderType()>1) res=OrderDelete(OrderTicket(),clrAqua);
            else res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),clrGreen);//При достижении требуемого размера прибыли закрываем все открытые и отложенные ордера
           }
        }
     }
  }


В данном случае ордера закрываются через OrderClose. А как это сделать через OrderCloseBy. Причем так, чтобы ордера взаимно закрывались в порядке уменьшения их объемов.

pako
3308
pako 2014.10.19 19:10  
LEV5:

В данном случае ордера закрываются через OrderClose. А как это сделать через OrderCloseBy. Причем так, чтобы ордера взаимно закрывались в порядке уменьшения их объемов.

сортируйте по OrderLots()

 потом закрывайте по  OrderCloseBy

LEV
27
LEV 2014.10.19 19:33  

В таком случае, пройдет полный цикл, советник отберет два ордера SELL и BUY (наибольшие по объему) и взаимно их закроет.

но еще останутся другие ордера. как с ними быть? как запустить цикл заново?

LEV
27
LEV 2014.10.19 19:43  

еще один вопрос (больше по теории). Если я понимаю, нельзя при открытии одного цикла в другом задавать для них одинаковые условия?

например:

for (int i=0;i<OrdersTotal;i++)

  {

   ......

       for (int a=0;a<OrdersTotal;a++)

         {

         .......

         }

}

Victor Nikolaev
Модератор
14508
Victor Nikolaev 2014.10.20 04:05  
LEV5:

В таком случае, пройдет полный цикл, советник отберет два ордера SELL и BUY (наибольшие по объему) и взаимно их закроет.

но еще останутся другие ордера. как с ними быть? как запустить цикл заново?

А массивы не устраивают. Хранить номера тикетов отсортированные по размеру позиций
Artyom Trishkin
Модератор
75802
Artyom Trishkin 2014.10.20 05:12  
LEV5:

В таком случае, пройдет полный цикл, советник отберет два ордера SELL и BUY (наибольшие по объему) и взаимно их закроет.

но еще останутся другие ордера. как с ними быть? как запустить цикл заново?

Хороший вам совет:

Сначала представьте, потом распишите "на бумажке" алгоритм, как бы вы сами всё это проделали, не с программным кодом, а с, например, яблоками - с нормальными и с подгнившими... А уже потом, сверяясь с алгоритмом, писали бы код.

Ну или - с самыми большими, и с самыми маленькими вплоть, пока не останутся два самых больших, или одно - самое большое.

Наверное начали бы их раскладывать по двум кучкам, постепенно убирая из кучек самые крайние по размеру. Да?

TarasBY
1740
TarasBY 2014.10.20 07:17  
Здесь есть функция fClose_AllOrdersBy(), выполняющая закрытие всех рыночных ордеров, начиная со встречных. Суть варианта реализации уловить не сложно.
LEV
27
LEV 2014.10.20 19:21  

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

требуются услуги специалиста по доработке советника.

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

LEV
27
LEV 2014.10.20 19:32  
artmedia70:

Хороший вам совет:

Сначала представьте, потом распишите "на бумажке" алгоритм, как бы вы сами всё это проделали, не с программным кодом, а с, например, яблоками - с нормальными и с подгнившими... А уже потом, сверяясь с алгоритмом, писали бы код.

Ну или - с самыми большими, и с самыми маленькими вплоть, пока не останутся два самых больших, или одно - самое большое.

Наверное начали бы их раскладывать по двум кучкам, постепенно убирая из кучек самые крайние по размеру. Да?

В советник заложена другая логика:

Одна большая (или не очень) кучка яблок: Зеленые (BUY) и красные (SELL).

Сначала перебираю все перебираю все зеленые яблоки и выбираю самое крупное потом тоже самое красные.

убрал эти яблоки из кучи, потом заново перебираю.

Как мне кажется такая логика тоже верна. Только не могу ее прописать.

Mislaid
622
Mislaid 2014.10.20 20:47  
LEV5:

В советник заложена другая логика:

Одна большая (или не очень) кучка яблок: Зеленые (BUY) и красные (SELL).

Сначала перебираю все перебираю все зеленые яблоки и выбираю самое крупное потом тоже самое красные.

убрал эти яблоки из кучи, потом заново перебираю.

Как мне кажется такая логика тоже верна. Только не могу ее прописать.

Какая разница, как Вы будете ковыряться в Вашей куче? Эквити от  этого не пострадает. Вот, если тока задумаетесь, тогда свопов нахватаетесь.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий