Проблема открытия ордеров типов ORDER_TYPE_BUY_STOP и ORDER_TYPE_SELL_STOP в "открывашке" и именно на боевом сервере, на тестовом все нормально

 

Проблема на БИРЖЕВОМ РЫНКЕ рынке ( MQL5 )

Смотрю библиотеку   trade.mqh функцию   bool CTrade::OrderTypeCheck(const string symbol)

после исполнения кода

int flags=sym.OrderMode();   // На демке в ОТКРЫВАШКЕ возвращает 63   ,  Боевой сервер возвращает 59 

//  соответственно  проверка

 res=((flags&SYMBOL_ORDER_STOP)!=0);  // на боевом возвращает false на тестовом true

и функция на боевом  сервере  честно пишет  Print(__FUNCTION__+": Invalid order type");


Первое что приходит в голову - на боевом не разрешены STOP ордера , но  при этом и на боевом и на тестовом сервере легко выставляю  руками  ордера типа ORDER_TYPE_BUY_STOP и  ORDER_TYPE_SELL_STOP 

Подскажите пожалуйста в чем может быть причина ? 

на всякий случай кусочек кода

//+------------------------------------------------------------------+
//| Checks order                                                     |
//+------------------------------------------------------------------+
bool CTrade::OrderTypeCheck(const string symbol)
  {
   bool res=false;
//--- check symbol
   CSymbolInfo sym;
   if(!sym.Name((symbol==NULL)?Symbol():symbol))
      return(false);
//--- get flags of allowed trade orders
   int flags=sym.OrderMode();
//--- depending on the type of order in request
   switch(m_request.type)
     {
      case ORDER_TYPE_BUY:
      case ORDER_TYPE_SELL:
         //--- check possibility of execution
         res=((flags&SYMBOL_ORDER_MARKET)!=0);
         break;
      case ORDER_TYPE_BUY_LIMIT:
      case ORDER_TYPE_SELL_LIMIT:
         //--- check possibility of execution
         res=((flags&SYMBOL_ORDER_LIMIT)!=0);
         break;
      case ORDER_TYPE_BUY_STOP:
      case ORDER_TYPE_SELL_STOP:
         //--- check possibility of execution
         res=((flags&SYMBOL_ORDER_STOP)!=0);
         break;
      case ORDER_TYPE_BUY_STOP_LIMIT:
      case ORDER_TYPE_SELL_STOP_LIMIT:
         //--- check possibility of execution
         res=((flags&SYMBOL_ORDER_STOP_LIMIT)!=0);
         break;
      default:
         break;
     }
   if(res)
     {
      //--- trading order is valid
      //--- check if we need and able to set protective orders
      if(m_request.sl!=0.0 || m_request.tp!=0.0)
        {
         if((flags&SYMBOL_ORDER_SL)==0)
            m_request.sl=0.0;
         if((flags&SYMBOL_ORDER_TP)==0)
            m_request.tp=0.0;
        }
     }
   else
     {
      //--- trading order is not valid
      //--- set error
      m_result.retcode=TRADE_RETCODE_INVALID_ORDER;
      Print(__FUNCTION__+": Invalid order type");
     }
//--- result
   return(res);
  }
 

есть предположение что проблема происходит при тестированию в нерабочее время

 
Yuriy Zaytsev:

int flags=sym.OrderMode();   // На демке в ОТКРЫВАШКЕ возвращает 63   ,  Боевой сервер возвращает 59 

//  соответственно  проверка

 res=((flags&SYMBOL_ORDER_STOP)!=0);  // на боевом возвращает false на тестовом true

и функция на боевом  сервере  честно пишет  Print(__FUNCTION__+": Invalid order type");

У числа 59 третий бит (SYMBOL_ORDER_STOP) взведен, так что должен быть true.

Скорее всего, "утро вечера мудренее".

 
fxsaber:

У числа 59 третий бит (SYMBOL_ORDER_STOP) взведен, так что должен быть true.

Скорее всего, "утро вечера мудренее".

Доброе утро, спасибо большое за попытку помочь!   

Утро наступило , но  sym.m_order_mode  с утра по прежнему  int flags=sym.OrderMode();   получает 59 , а проверка res=((flags&SYMBOL_ORDER_STOP)!=0);  так же возвращает false

При этом на тестовом сервере  с утра все по прежнему int flags=sym.OrderMode();   получает 63 , а проверка res=((flags&SYMBOL_ORDER_STOP)!=0);  так же возвращает true

Раньше я такие вопросы отправлял в servic desk ,  но похоже службу заваливали очень сильно .

Посмотрите пожалуйста картинки, так намного наглядней и понятней.

Вопрос так и остался открыт , совершенно не ясно почему sell_stop buy_stop в тестере не отрабатывают , при этом в тестере с рынка или limit ордера прекрасным образом выполняются.





 
fxsaber:

У числа 59 третий бит (SYMBOL_ORDER_STOP) взведен, так что должен быть true.

Скорее всего, "утро вечера мудренее".

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


SYMBOL_ORDER_STOP

Разрешены стоп-ордера (Buy Stop и Sell Stop)

SymbolInfoInteger

SYMBOL_ORDER_STOP_LIMIT

Разрешены стоп-лимит ордера (Buy Stop Limit и Sell Stop Limit)

SymbolInfoInteger


После 10 часов  проведу эксперимент. 


Получается не третий бит а второй.

0010   битовое значение двойки

SYMBOL_ORDER_LIMIT

2

Разрешены лимитные ордера (Buy Limit и Sell Limit)

 
Yuriy Zaytsev:

Утро наступило , но  sym.m_order_mode  с утра по прежнему  int flags=sym.OrderMode();   получает 59 , а проверка res=((flags&SYMBOL_ORDER_STOP)!=0);  так же возвращает false

Я ошибся, третий бит у 59 не взведен.

Вы умеете написать так, что не сразу поймешь... В Тестере используются текущие настройки символа. Если там 59 во время закрытия рынка, то Тестер будет брать эти настройки, пока 59 не сменится чем-то другим после открытия рынка. Обойти данную особенность Тестера возможно через кастомный вариант.

 
fxsaber:

Я ошибся, третий бит у 59 не взведен.

Вы умеете написать так, что не сразу поймешь... В Тестере используются текущие настройки символа. Если там 59 во время закрытия рынка, то Тестер будет брать эти настройки, пока 59 не сменится чем-то другим после открытия рынка. Обойти данную особенность Тестера возможно через кастомный вариант.


Спасибо,  подскажите пожалуйста каким образом  обойти через кастомный вариант? 


и почему бит третий?  постом выше описал что константа SYMBOL_ORDER_STOP  значение 2 ,  а это в битовом значении 0010 ,  т е второй бит. 


Нумерацию битов беру с права налево,  как это принято .  Вы вероятно берете с лева направо? 


0010   значение 2

4321

 
Yuriy Zaytsev:

Спасибо,  подскажите пожалуйста каким образом  обойти через кастомный вариант? 

Кастомный символ.

и почему бит третий?  постом выше описал что константа SYMBOL_ORDER_STOP  значение 2 ,  а это в битовом значении 0010 ,  т е второй бит. 

Выше смотрели значение другой константы.

 
fxsaber:

Кастомный символ.

Выше смотрели значение другой константы.

кастомный символ!? ,  спасибо попробую. 

Можете пояснить,  значение выше это какое,  или где смотреть ? какой константы. 

 
Yuriy Zaytsev:

Можете пояснить,  значение выше это какое,  или где смотреть ? какой константы. 

 
fxsaber:

SYMBOL_ORDER_LIMIT

2

Разрешены лимитные ордера (Buy Limit и Sell Limit)

SYMBOL_ORDER_STOP

4

Разрешены стоп-ордера (Buy Stop и Sell Stop)


Да , ошибся , Вы правы  3-й бит 

Спасибо.

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