Втык при закрытии сделок скриптом - страница 2

 
SlashHammer:
Товарищи программеры, подскажите в чём может быть проблема. Делается попытка закрыть ордер ниже приведённым скриптом, но если цена движется достаточно быстро, а на fx4u время открытия/закрытия сделок примерно 2-4сек., то вместо ошибки "реквот" скрипт просто зависает ровно на 3 (!!!) минуты, после чего выкидывает ошибку.

Даже если во время зависа ордер закрыть вручную, то всё равно 3 минуты зависания скрипта, и удалить его из окна тоже не удаётся.

У Вас есть несколько логических ошибок :

1. Не анализируете код ошибки функции выбора ордера. Что Вы обрабатываете, если ордер не выбран ? например, сработал стоп или тейк в процессе опроса ? Или ордер удален вручную ?

2. Определение цен Bid и Asк нужно делать непосредственно перед вызовом функций работы с ордерами ОрдерКлозе, ОрдерСенд, Вам об этом уже присали.

А по поводу указаного ДЦ - ага известное ))))))))))). Правильно выше написано ;).

Удачи.

 
VladislavVG:

У Вас есть несколько логических ошибок :

1. Не анализируете код ошибки функции выбора ордера. Что Вы обрабатываете, если ордер не выбран ? например, сработал стоп или тейк в процессе опроса ? Или ордер удален вручную ?

2. Определение цен Bid и Asк нужно делать непосредственно перед вызовом функций работы с ордерами ОрдерКлозе, ОрдерСенд, Вам об этом уже присали.

А по поводу указаного ДЦ - ага известное ))))))))))). Правильно выше написано ;).

Удачи.


Согласен, оптимизацию и доводку проведу позже, главный вопрос - почему ТРИ минуты ???
 
SlashHammer:

Согласен, оптимизацию и доводку проведу позже, главный вопрос - почему ТРИ минуты ???

Возможные причины:

1. Вы посылаете запрос по уже несуществующим ценам

2. Качество работы ДЦ

Потому и говорю: первое, что нужно сделать - это определение цен непосредственно перед вызовом функций, заодно и решить ситуацию с ОрдерСелект - там одну строку поправить.

Если не поможет - смена ДЦ однозначно.

Удачи.

 

Поправил, надеюсь правильно, буду тестить

void CLOSEfunc()
{
   int      GLErr=0, ticket, index=0;
   int      Orders[10];
   bool     close_result;
   RefreshRates();
   double   cur_bid;
   double   cur_ask;
   double   cur_point=MarketInfo(Symbol(),MODE_POINT);
   
   for(int j=0; j<OrdersTotal(); j++)
   {
      if(OrderSelect(j, SELECT_BY_POS) == false)
         continue;
      if(OrderMagicNumber() == magic)
      {
         Orders[index]=OrderTicket();
         index++;
      }
      
   }
   for(int t=0; t<index; t++)
   {
         if(OrderSelect(Orders[t],SELECT_BY_TICKET) == false)
            continue;
         Messages("Попытка закрыть ордер №"+OrderTicket()+" с профитом: "+DoubleToStr(OrderProfit(),2),Yellow);
         RefreshRates();
         cur_bid=MarketInfo(Symbol(),MODE_BID);
         cur_ask=MarketInfo(Symbol(),MODE_ASK);
         if(OrderType() == OP_BUY) close_result=OrderClose(Orders[t],OrderLots(),cur_bid,0,Blue);
         if(OrderType() == OP_SELL) close_result=OrderClose(Orders[t],OrderLots(),cur_ask,0,Red);
         if(close_result == false)
         {
            GLErr=GetLastError();
            Messages("Закрытие ордера №"+OrderTicket()+" по "+Symbol()+", ошибка - "+GLErr,Red);
            Messages ("("+Errors(GLErr)+")",Red);
            if(snd==true)PlaySound("s_error.wav");
         }
         else
         {
            if(OrderSelect(OrderTicket(),SELECT_BY_TICKET) == false)
               continue;
            Messages("Ордер №"+OrderTicket()+" закрыт успешно!!! Профит: "+DoubleToStr(OrderProfit(),2),Lime);
            if(snd==true)PlaySound("s_close.wav");
         }
   }
   delay();
   return(0);
 
SlashHammer:

Поправил, надеюсь правильно, буду тестить

Да, только я б немного не так сделал:

         if(OrderType() == OP_BUY)
         {
             RefreshRates();
             close_result=OrderClose(Orders[t],OrderLots(),Bid,0,Blue);
         }
         if(OrderType() == OP_SELL)
         {
             RefreshRates();
             close_result=OrderClose(Orders[t],OrderLots(),Ask,0,Red);
         }
         if(close_result == false)
Причина обращения: