Правильное заполнение MqlTradeRequest

 

Для разных брокеров требуется указать разное значение ENUM_ORDER_TYPE_TIME

Плюс цена должна быть в отложенных заявках правильная. 

Как мне автоматически определить для каждого брокера?

1)Объясните мне код из <Trade\Trade.mqh>

if(type_time==ORDER_TIME_GTC && expiration==0)
     {
      int exp=(int)SymbolInfoInteger(symbol,SYMBOL_EXPIRATION_MODE);
      if((exp&SYMBOL_EXPIRATION_GTC)!=SYMBOL_EXPIRATION_GTC)
        {
         //--- if you place order for an unlimited time and if placing of such orders is prohibited
         //--- try to place order with expiration at the end of the day
         if((exp&SYMBOL_EXPIRATION_DAY)!=SYMBOL_EXPIRATION_DAY)
           {
            //--- if even this is not possible - error
            Print(__FUNCTION__,": Error: Unable to place order without explicitly specified expiration time");
            m_result.retcode=TRADE_RETCODE_INVALID_EXPIRATION;
            m_result.comment="Invalid expiration type";
            return(false);
           }
         type_time=ORDER_TIME_DAY;
        }
     }

SymbolInfoInteger получает разрешенный тип исполнения по времени. Насколько понимаю, отложенных ордеров. Рыночные еще большой вопрос. 

Может быть их несколько, что он выдает? 

Вот эта запись не понятна 

if((exp&SYMBOL_EXPIRATION_GTC)!=SYMBOL_EXPIRATION_GTC)

Переменная exp что делает? В моем понимании & - логическое И. Но что то не логичная запись SYMBOL_EXPIRATION_GTC != SYMBOL_EXPIRATION_GTC

К примеру у Финам брокера type_time = ORDER_TIME_GTC для отложенных ордеров. Открытие брокер ORDER_TIME_DAY

2) Форекс кухни не дают выставлять отложенные ордера рядом с ценой. Приходит ответ - не правильная цена. Как запросить этот диапазон?

И что это за диапазон цен такой?

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
vbymrf:


Вот эта запись не понятна 

Переменная exp что делает? В моем понимании & - логическое И. Но что то не логичная запись SYMBOL_EXPIRATION_GTC != SYMBOL_EXPIRATION_GTC

Это побитовая операция И.
В непонятной строке: конкретные биты (в конкретно этом сравнении - один бит) проверяются на предмет установки.
Т.е. сначала битовая операция "И" сбрасывает все биты кроме тех, что имеют значение "1" в константе SYMBOL_EXPIRATION_GTC, а потом результат проверяется на совпадение с этой констрантой.
 
vbymrf:

В моем понимании & - логическое И.

Как бы да, но побитовое.

Т.е., в переменной exp сбрасываем все биты, кроме того, который соответствует SYMBOL_EXPIRATION_GTC (т.е., по маске SYMBOL_EXPIRATION_GTC), и проверяем, выставлен ли этот бит, сравнением, опять же, с SYMBOL_EXPIRATION_GTC.

 
JRandomTrader #:

Как бы да, но побитовое.

Т.е., в переменной exp сбрасываем все биты, кроме того, который соответствует SYMBOL_EXPIRATION_GTC (т.е., по маске SYMBOL_EXPIRATION_GTC), и проверяем, выставлен ли этот бит, сравнением, опять же, с SYMBOL_EXPIRATION_GTC.

Мне после шарпа не ожидаемо было увидеть в if число и не получить ошибку. Что тогда происходит здесь:

bool a=true;
bool b&=a;

Тоже самое что и 

b=b&&a;

?

 
vbymrf #:

Мне после шарпа не ожидаемо было увидеть в if число и не получить ошибку. Что тогда происходит здесь:

Тоже самое что и 

?

Тоже самое, что:
b=b&a;
 
&& - логическое И
& - побитовое умножение (побитовое И)
 
vbymrf #:

Мне после шарпа не ожидаемо было увидеть в if число и не получить ошибку. Что тогда происходит здесь:

Тоже самое что и 

?

На всякий случай лучше так не делать, не проверив, что получается (bool, наверное, можно распечатать через PrintFormat как uchar в HEX'уальном виде и посмотреть, что там реально получается).

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

Вот тут и далее я давал свой вариант использования такой переменной: https://www.mql5.com/ru/forum/6343/page1384#comment_26447195

 
vbymrf:

Для разных брокеров требуется указать разное значение ENUM_ORDER_TYPE_TIME

Плюс цена должна быть в отложенных заявках правильная. 

Как мне автоматически определить для каждого брокера?

1)Объясните мне код из <Trade\Trade.mqh>

SymbolInfoInteger получает разрешенный тип исполнения по времени. Насколько понимаю, отложенных ордеров. Рыночные еще большой вопрос. 

Может быть их несколько, что он выдает? 

Вот эта запись не понятна 

Переменная exp что делает? В моем понимании & - логическое И. Но что то не логичная запись SYMBOL_EXPIRATION_GTC != SYMBOL_EXPIRATION_GTC

К примеру у Финам брокера type_time = ORDER_TIME_GTC для отложенных ордеров. Открытие брокер ORDER_TIME_DAY

2) Форекс кухни не дают выставлять отложенные ордера рядом с ценой. Приходит ответ - не правильная цена. Как запросить этот диапазон?

И что это за диапазон цен такой?

Если не возможно понять объяснения образованных программистов, без поддёвки, то можно попытаться разобраться как работать с флагами.

Вот таблица примера флагов

Идентификатор

Значение

Описание

SYMBOL_ORDER_MARKET

1

Разрешены рыночные ордера (Buy и Sell)

SYMBOL_ORDER_LIMIT

2

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

SYMBOL_ORDER_STOP

4

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

SYMBOL_ORDER_STOP_LIMIT

8

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

SYMBOL_ORDER_SL

16

Разрешена установка Stop Loss

SYMBOL_ORDER_TP

32

Разрешена установка Take Profit

SYMBOL_ORDER_CLOSEBY

64

Разрешение на закрытие позиции с помощью встречной – то есть открытой в противоположном направлении по тому же инструменту. Свойство задается для счетов с хеджинговой системой учета  (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)


После этой таблицы в документации есть примеры.

//+------------------------------------------------------------------+
//| Функция выводит на печать разрешенные для символа типы ордеров   |
//+------------------------------------------------------------------+
void Check_SYMBOL_ORDER_MODE(string symbol)
  {
//--- получим значение свойства, описывающего разрешенные типы ордеров
   int symbol_order_mode=(int)SymbolInfoInteger(symbol,SYMBOL_ORDER_MODE);
//--- проверка на рыночные ордера (Market Execution)
   if((SYMBOL_ORDER_MARKET&symbol_order_mode)==SYMBOL_ORDER_MARKET)
      Print(symbol+": Рыночные ордера разрешены (Buy и Sell)");
//--- проверка на ордера типа Limit
   if((SYMBOL_ORDER_LIMIT&symbol_order_mode)==SYMBOL_ORDER_LIMIT)
      Print(symbol+": Ордера Buy Limit и Sell Limit разрешены");
//--- проверка на ордера типа Stop
   if((SYMBOL_ORDER_STOP&symbol_order_mode)==SYMBOL_ORDER_STOP)
      Print(symbol+": Ордера Buy Stop и Sell Stop разрешены");
//--- проверка на ордера типа Stop Limit
   if((SYMBOL_ORDER_STOP_LIMIT&symbol_order_mode)==SYMBOL_ORDER_STOP_LIMIT)
      Print(symbol+": Ордера Buy Stop Limit и Sell Stop Limit разрешены");
//--- проверка на возможность установки ордеров Stop Loss
   if((SYMBOL_ORDER_SL&symbol_order_mode)==SYMBOL_ORDER_SL)
      Print(symbol+": Ордера Stop Loss разрешены");
//--- проверка на возможность установки ордеров Take Profit
   if((SYMBOL_ORDER_TP&symbol_order_mode)==SYMBOL_ORDER_TP)
      Print(symbol+": Ордера Take Profit разрешены");
//--- проверка разрешения на закрытие позиции с помощью встречной
   if((SYMBOL_ORDER_TP&symbol_order_mode)==SYMBOL_ORDER_CLOSEBY)
      Print(symbol+": Встречное закрытие разрешено");
//---
  }

переменная symbol_order_mode может иметь только сумму флагов, максимально 127 для вышеуказанного набора флагов. И строка 

   if((SYMBOL_ORDER_MARKET&symbol_order_mode)==SYMBOL_ORDER_MARKET)

проверяет есть-ли флаг соответствующий значению SYMBOL_ORDER_MARKET

Обратите внимание, что если взять сумму 1+2+8=11 то проверяя наличие флага равному 4 вы не найдёте. Равно как и в сумме 10 вы не найдёте ни 4, ни 1. 

Это просто для забавы

   if((4&11)==4)
    Print("Ничего не напечатает");
   if((2&10)==2)
    Print("Флаг 2 присутствует");
 
Чувствую, как же я ошибся. Начав программировать без знаний основ языка. Думал, С язык он и в Африке Си. 
Причина обращения: