Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 703

 
Zvezdochet:

ДА. Именно это и есть учебник Сергея Ковалёва. Именно в нём в настоящий момент много чего не хватает.

По mql5 как такового учебника на этом сайте нету, о других не знаю. Но зато очень много статей, читайте, может получится.

Статьи по MQL5
Статьи по MQL5
  • www.mql5.com
Статьи по программированию на языке MQL5
 

Господа программисты!

Плиз, помогите решить проблему с которой бьюсь уже месяц.

Моя ТС почему-то иногда не закрывает ордера.

Выглядит это так:

Вот первые три ордера - 44329646, 44330563 и 44337351 открываются и закрываются отлично.

А на четвертом ордере происходит трагедия:

и так - до бесконечности...

Т.е. советник открыл ордер 44339156, а закрыть пытается ордер 44337351, который сам же (!!!!) успешно закрыл несколькими часами ранее.

Приходится закрывать вручную, а если не уследил - иногда попадаешь на глубочайшую просадку. Катастрофа!

Как такое вообще возможно?

Код советника проще некуда:

здесь - условие открытия сделки
{
         RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(total_orders_NZDUSD==0)
         {
         Balance=AccountBalance();
         Lots=NormalizeDouble((Balance/(Ask*10.0))*0.01,2);
         double AskNorm=NormalizeDouble(Ask,Digits);
         ticket_buy_NZDUSD=OrderSend("NZDUSD.I",OP_BUY,0.01,AskNorm,0,0,0);
         }
      }
здесь - условие закрытия сделки
      {
         RefreshRates();
         if(OrderSelect(ticket_buy_NZDUSD, SELECT_BY_TICKET)==true)
         {
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         ctm_ticket_buy_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_buy_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_BUY)
                  {
                  double BidNorm=NormalizeDouble(Bid,Digits);
                  OrderClose(ticket_buy_NZDUSD,0.01,BidNorm,0);
                  }
               }
            }
         }

Как одна и та же программа может работать "через раз"? Не понимаю...

 
Alexander_K2:

Господа программисты!

Плиз, помогите решить проблему с которой бьюсь уже месяц.

Моя ТС почему-то иногда не закрывает ордера.

Выглядит это так:

Вот первые три ордера - 44329646, 44330563 и 44337351 открываются и закрываются отлично.

А на четвертом ордере происходит трагедия:

и так - до бесконечности...

Т.е. советник открыл ордер 44339156, а закрыть пытается ордер 44337351, который сам же (!!!!) успешно закрыл несколькими часами ранее.

Приходится закрывать вручную, а если не уследил - иногда попадаешь на глубочайшую просадку. Катастрофа!

Как такое вообще возможно?

Код советника проще некуда:

Как одна и та же программа может работать "через раз"? Не понимаю...

Про OrderSelect() почитайте справку. В частности о выборе по тикету. Даже закрытый ордер спокойно выбирается по тикету. Он уже закрыт, а вы его опять закрывать пытаетесь.

Выбрали - проверили время закрытия - если 0, значит он ещё в рынке - закрываете, если > 0, значит он уже закрыт, и не нужно его опять ногой толкать - не оживёт и не закроется.

 
Artyom Trishkin:

Про OrderSelect() почитайте справку. В частности о выборе по тикету. Даже закрытый ордер спокойно выбирается по тикету. Он уже закрыт, а вы его опять закрывать пытаетесь.

Выбрали - проверили время закрытия - если 0, значит он ещё в рынке - закрываете, если > 0, значит он уже закрыт, и не нужно его опять ногой толкать - не оживёт и не закроется.

Спасибо большое - попробую.

 
Alexander_K2:

Спасибо большое - попробую.

Пожалуйста. Не пробовать нужно, а сделать...

 
Artyom Trishkin:

Пожалуйста. Не пробовать нужно, а сделать...

Артем, прочитал справку - вроде все у меня верно.

ctm_ticket_buy_NZDUSD=OrderCloseTime();
         ...
               if(ctm_ticket_buy_NZDUSD==0)
            ...

Время закрытия проверяю.

Из справки по MQL4:

Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

Тоже выполнено.

А что тогда не так?

 
Alexander_K2:

Артем, прочитал справку - вроде все у меня верно.

Время закрытия проверяю.

Из справки по MQL4:

Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

Тоже выполнено.

А что тогда не так?

Вот это что за функция?

total_orders_NZDUSD=TotalOrders("NZDUSD.I");
И после её отработки какой ордер выделен?
 
Alexander_K2:

Господа программисты!

Плиз, помогите решить проблему с которой бьюсь уже месяц.

Моя ТС почему-то иногда не закрывает ордера.

Выглядит это так:

Вот первые три ордера - 44329646, 44330563 и 44337351 открываются и закрываются отлично.

А на четвертом ордере происходит трагедия:

и так - до бесконечности...

Т.е. советник открыл ордер 44339156, а закрыть пытается ордер 44337351, который сам же (!!!!) успешно закрыл несколькими часами ранее.

Приходится закрывать вручную, а если не уследил - иногда попадаешь на глубочайшую просадку. Катастрофа!

Как такое вообще возможно?

Код советника проще некуда:

Как одна и та же программа может работать "через раз"? Не понимаю...

вы в каком направлении просматриваете массив ордеров ?

если при "ревизии" возможны закрытия/удаления, то лучше смотреть в обратном. От OrdersTotal()-1 до 0 включительно.

иначе можно наступить :-)


 
Artyom Trishkin:

Вот это что за функция?

Эту функцию мне любезно подарил Goldtrader, за что я ему искренне благодарен.

//+------------------------------------------------------------------+
//| Calculate Market Orders function                                 |
//+------------------------------------------------------------------+
int TotalOrders(string sy) {    // sy - Currency Pair
int orders=0;
   for (int i=0; i<OrdersTotal(); i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==sy) {
           if (OrderType()==OP_SELL || OrderType()==OP_BUY) {
             orders++;
           }
         }
       }
     }
return(orders);
}

Она позволяет открывать одновременно ордера по разным валютным парам.

:))) По-моему, из-за нее все и началось - т.к. я ее подключил как раз месяц назад... А без нее Грааля не видать, как своих ушей...

Что-то с ней не так?

 

А ведь что-то, действительно, не так...

Т.е. я один раз делаю OrderSelect, а потом еще раз из функции... Чертовщина какая-то...

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