Втык при закрытии сделок скриптом

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

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

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

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

так, а можно полностью код скрипта ?
 
RefreshRates();
   double   cur_bid=MarketInfo(Symbol(),MODE_BID);

Это нужно делать перед 

close_result=OrderClose(Orders[t],OrderLots(),cur_bid,3,CLR_NONE);

 
Techno:
так, а можно полностью код скрипта ?

А зачем полностью, это большой зацикленный скрипт, я привёл функцию закрытия. Если подозрение на использованную ф-цию Messages(), то без неё та же проблема.

Уточню - это происходит только когда на рынке быстрое движение, и то не всегда.

Дело в том, что когда котировка быстро уходит в минус для открытого ордера с момента посылки команды OrderClose(), то и происходит зависание, если быстро в плюс, то ордер закрывается по цене на момент посылки команды (например, у ордера +10п., срабатывает OrderClose(), за время обработки команды сервером (2-4с.) котировка поднялась до +13п., но закрывается ордер +10п., если же котировка опустилась до +7п. на ордере, то тут три варианта - либо Реквот, либо закрывается +7п., либо зависание ровно на 3мин. после чего приходит Реквот. Похоже что где то в конфиге терминала есть настройка какого-то таймаута (3мин), вот найти бы её.

 

Оказывается и открытие сделок зависает ((

Чтоб не быть голословным:


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

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

А Вы что хотите и где проблема?

Вы с помощью скрипта отправляете брокеру приказ. Брокер соответственно этот приказ обрабатывает (скажем 3 минуты в Вашем случае). Скрипт покорно ждёт ответа от брокера.

Меняйте брокера...

 
AlexSTAL:

А Вы что хотите и где проблема?

Вы с помощью скрипта отправляете брокеру приказ. Брокер соответственно этот приказ обрабатывает (скажем 3 минуты в Вашем случае). Скрипт покорно ждёт ответа от брокера.

Меняйте брокера...


Дык вроде известный брокер (forex4you), странно что у него такие проблемы.

А вот на счёт таймаута в 3мин., похоже это терминал прекращает торговый сеанс с сервером не получив ответа, никто не знает где эта настройка хранится? Или может у кого есть дешифратор/декомпилятор настроечных файлов МТ4 ))

 
SlashHammer:

Дык вроде известный брокер (forex4you), странно что у него такие проблемы.

А вот на счёт таймаута в 3мин., похоже это терминал прекращает торговый сеанс с сервером не получив ответа, никто не знает где эта настройка хранится? Или может у кого есть дешифратор/декомпилятор настроечных файлов МТ4 ))

Не говорите ерунды... Кухня - она и в Африке кухня...

Вы видели, с какой скоростью исполняются ордера на биржах? Вы что думаете, что там стоят более мощные сервера, чем в forex4you? или канал интернета шире?

Ответ очевиден - кухня не позволит Вам пипсовать....

 
AlexSTAL:

Не говорите ерунды... Кухня - она и в Африке кухня...

Вы видели, с какой скоростью исполняются ордера на биржах? Вы что думаете, что там стоят более мощные сервера, чем в forex4you? или канал интернета шире?

Ответ очевиден - кухня не позволит Вам пипсовать....


С Вами согласен, но обычно на демо-счёте всё-же пипсовка удаётся, а на реале уже нет, но я не о пипсовке речь веду. Задержка в 3мин. и получение Оффквота - это не защита от попсовщиков, это какието глюки. Имхо.
 
SlashHammer:

С Вами согласен, но обычно на демо-счёте всё-же пипсовка удаётся, а на реале уже нет, но я не о пипсовке речь веду. Задержка в 3мин. и получение Оффквота - это не защита от попсовщиков, это какието глюки. Имхо.
Телепаты уволены! Ключевая фраза: "А зачем полностью, это большой зацикленный скрипт, я привёл функцию закрытия."
 
AlexSTAL:
Телепаты уволены! Ключевая фраза: "А зачем полностью, это большой зацикленный скрипт, я привёл функцию закрытия."

Всё равно не понимаю надобности в целом скрипте, в нём больше 1200 строк кода, вот эта функция изменённая в отдельный скрипт, можно запускать вручную, проблема остаётся, но здесь не в скрипте похоже проблема, а в настройках терминала. Опять же имхо.

P.S. В большом скрипте зациклено всего пять строк - отслеживание нажатия клавиш, дальше всё управление передаётся различным ф-циям.

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