Скачать MetaTrader 5

БАГ с SYMBOL_FILLING_MODE РЕШЕНО

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Запусти агентов на свободном компьютере. Это принесет доход!
Vladislav Andruschenko
91688
Vladislav Andruschenko 2015.12.22 14:06 

Приветствую.

Уважаемая администрация. Нашел баг с SYMBOL_FILLING_MODE

Билд компилятора 1241

пытался сделать автоопределение типа заливки для ордеров:

      if((ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(sy,SYMBOL_FILLING_MODE)!=(ENUM_ORDER_TYPE_FILLING)request.type_filling)
request.type_filling=(ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(sy,SYMBOL_FILLING_MODE);

 Т.е. если тип заливки указан неправильно то присваивается значения с спецификации символа.

например на ..ПРО брокере заливка IOC (У Вас в таблице и в реале присваивается значение

2

)

но с типом два - сервер возвращает ошибку:

2015.12.22 14:57:11.385 EXP5 _ COPYLOT_Client_market18 (USDCHF,H1)      ERROR 0 Result = 10030 symbol NZDUSD volume 0.1 action 1 tp 0 sl 0 type 0 price 0.68205   Invalid order filling type
2015.12.22 14:57:11.385 EXP5 _ COPYLOT_Client_market18 (USDCHF,H1)      ERROR   Result = 10030 symbol NZDUSD volume 0.1 action 1 tp 0 sl 0 type 0 price 0.68205   request.type_filling=2

 

Поэтому еще 2 года назад я делал выбор заливки - клиентом. прописывал так в настройках:

 

 

enum filling
  {
   FillOrKill=ORDER_FILLING_FOK,
   ImmediatOrCancel=ORDER_FILLING_IOC,
   Return=ORDER_FILLING_RETURN,
  };

 

 и выбор через input:

input filling TypeFilling=ORDER_FILLING_FOK;

 

 


так вот  когда я делаю автоопределение почему не срабатывает и пишет ошибку

а когда я выбираю в настройках сам IOC ему присваивается значение

1

! и все работает.

 

в таблице же указаны следующие значения:

 

 

Fill or Kill

SYMBOL_FILLING_FOK

1

This policy means that a deal can be executed only with the specified volume. If the necessary amount of a financial instrument is currently unavailable in the market, the order will not be executed. The required volume can be filled using several offers available on the market at the moment.

Immediate or Cancel

SYMBOL_FILLING_IOC

2

In this case a trader agrees to execute a deal with the volume maximally available in the market within that indicated in the order. In case the order cannot be filled completely, the available volume of the order will be filled, and the remaining volume will be canceled. The possibility of using IOC orders is determined at the trade server.

Return

No identifier

 

This policy is used only for market orders (Buy and Sell), limit and stop limit orders and only for the symbols with Market or Exchange execution. In case of partial filling a market or limit order with remaining volume is not canceled but processed further.

 

 Но здесь наверно перепутаны данные! 

 

 

Решение:

 

   switch((int)SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE))
     {
      case SYMBOL_FILLING_FOK:
         request.type_filling=ORDER_FILLING_FOK;
         break;
      case SYMBOL_FILLING_IOC:
         request.type_filling=ORDER_FILLING_IOC;
         break;
      default:
         request.type_filling=ORDER_FILLING_RETURN;
     }
Vladislav Andruschenko
91688
Vladislav Andruschenko 2015.12.22 14:29  

провел тест обычным экспертом

void OnTick()
  {
//---

   Print(
         "FillOrKill="+ORDER_FILLING_FOK+
         " ImmediatOrCancel="+ORDER_FILLING_IOC+
         " Return="+ORDER_FILLING_RETURN+
         " SYMBOL_FILLING_MODE="+SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE)
         );


  }

 на брокере ФЫКСPRO

получается следующая картинка

в спецификации указан IOC

 SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODEпочему то возвращает цифру 2, которая по ORDER_FILLING_RETURN имеет значение 2. А должен возвращать 1

 

 

 

при этом у Вас на сервере Демо

та же ситуация

 

Sergei Vladimirov
8764
Sergei Vladimirov 2015.12.22 14:58  
Vladislav Andruschenko:

Поэтому еще 2 года назад я делал выбор заливки - клиентом. прописывал так в настройках:

Всё так и есть, но на клиента выбор вешать не обязательно. Автоопределение элементарно же делается:

   CTrade oTrade;
   
   switch((int)SymbolInfoInteger(Symbol(), SYMBOL_FILLING_MODE))
   {
   case SYMBOL_FILLING_FOK:
      oTrade.SetTypeFilling(ORDER_FILLING_FOK);
      break;
   case SYMBOL_FILLING_IOC:
      oTrade.SetTypeFilling(ORDER_FILLING_IOC);
      break;
   default:
      oTrade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
Vladislav Andruschenko
91688
Vladislav Andruschenko 2015.12.22 15:00  

да ну я выше описал проблему, возвращаемое значение не соответствует спецификации контракта. 

 

Ваш код рабочий? ВЫ проверяли его?  

или Вы говорите о том что  SYMBOL_FILLING_FOK!=ORDER_FILLING_FOK?

Vladislav Andruschenko
91688
Vladislav Andruschenko 2015.12.22 15:03  
нда проверил работает, тогда получается где то надо баг все равно исправить, чтоб не было такого глюка кто не будет знать решение. 
Sergei Vladimirov
8764
Sergei Vladimirov 2015.12.22 15:12  
Конечно проверял, и не в одном десятке советников. :) Они ж без этого кода просто не работают. С этим все сталкиваются, как можно не столкнуться-то? Только если вообще торговых программ не писать...
Vladislav Andruschenko
91688
Vladislav Andruschenko 2015.12.22 15:15  

понял спасибо

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий