MetaEditor build 1471 - страница 4

 
Alexey Navoykov:
А что это меняет?  Конструкторы всех переменных выполняются строго в порядке объявления этих переменных (по крайней мере в C++ так), независимо от их типа.  И если конструктор string не запускался, то что в нём может содержаться?
Согласен насчет порядка инициализации и объявления, а вот насчет не запуска конструктора string и что в нем может содержаться тут ответа нет - все что угодно, т.к. мы не знаем как устроена досконально работа по созданию объектов в MQL, мы видим лишь внешние проявления ))) К примеру в С++ вы объявляете объект не на глобальном уровне и в нем может содержаться - мусор из памяти т.к. мы не инициализировали созданный объект значением. Мы же не знаем механизм создания структур в MQL ))
 
coderex:
Согласен насчет порядка инициализации и объявления, а вот насчет не запуска конструктора string и что в нем может содержаться тут ответа нет - все что угодно, т.к. мы не знаем как устроена досконально работа по созданию объектов в MQL, мы видим лишь внешние проявления ))) К примеру в С++ вы объявляете объект не на глобальном уровне и в нем может содержаться - мусор из памяти т.к. мы не инициализировали созданный объект значением. Мы же не знаем механизм создания структур в MQL ))
Да и не нужно нам знать внутреннее устройство MQL, чтобы понимать фундаментальную вещь:  если конструктор ещё не запускался, значит объект ещё не создан, поэтому доступаться к нему нельзя, это нонсенс! Пусть С++ допускает такие вещи, поскольку он работает с памятью, а не с объектами. Там главное что память выделена, а всё остальное уже мелочи.  Но здесь всё иначе.
 
Alexey Navoykov:
Да и не нужно нам знать внутреннее устройство MQL, чтобы понимать фундаментальную вещь:  если конструктор ещё не запускался, значит объект ещё не создан, поэтому доступаться к нему нельзя, это нонсенс! Пусть С++ допускает такие вещи, поскольку он работает с памятью, а не с объектами. Там главное что память выделена, а всё остальное уже мелочи.  Но здесь всё иначе.

если конструктор ещё не запускался, значит объект ещё не создан, поэтому доступаться к нему нельзя

 абсолютно согласен

 Пусть С++ допускает такие вещи, поскольку он работает с памятью, а не с объектами. Там главное что память выделена, а всё остальное уже мелочи.  Но здесь всё иначе.

MQL работает с пулом памяти и в нем так же как и в с++ при создании объектов память распределяется. Единственный момент когда память не распределяется, это создание указателя. При его создании память под объект не распределена до тех пор, пока явно этого не сделаем. А т.к. для структур в MQL выставлен запрет на использование их через указатели, то скорее всего этот указатель просто от нас скрыт в целях соблюдения стратегии безопасности принятой в MQ. Просто отнеситесь к типу string как к структуре и попробуйте по правилам инициализации объекта структуры инициализировать string в классе.

 
Alexey Navoykov:

Ну инициализация - это присвоение переменной некого начального значения, происходящая в её конструкторе.   Если мы говорим о конструкторе по умолчанию, то для простых типов там инициализация не производится.  Т.е. этот конструктор - просто пустышка.  А вот string и указатели инициализируется NULL.   И также все статические переменные и переменные глобальной видимости всегда инициализируются нулём, насколько я знаю.

Ну и как выше было уже сказано, конструкторы всех членов класса выполняются в порядке объявления этих членов.   А вот от порядка перечисления этих конструкторов в конструкторе самого класса это не зависит.  Т.е. например:

A() : a(0), b(0)  {  }

равносильно

A() : b(0), a(0)  {  }

Спасибо большое, теперь все понял!
 
Скрипт открывает позиции разными filling-типами маркет-ордеров, а затем распечатывает данные этих ордеров
#define TOSTRING(A) #A + " = " + (string)(A)

void OpenPosition( const ENUM_ORDER_TYPE_FILLING Filling )
{
  const double Price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // можно указать и ноль
  MqlTradeRequest Request = {0};

  Request.action = TRADE_ACTION_DEAL;

  Request.symbol = _Symbol;
  Request.volume = 1;
  Request.price = Price;

  Request.type = ORDER_TYPE_BUY;

  Request.type_filling = Filling;

  Request.comment = DoubleToString(Price, _Digits) + " " + EnumToString(Filling);

  MqlTradeResult Result;

  if (OrderSend(Request, Result))
  {
    Sleep(100); // ждем обновления истории
    
    if (HistoryOrderSelect(Result.order))
    {
      Print(TOSTRING(Result.order));
      Print(TOSTRING(EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order, ORDER_TYPE_FILLING))));
      Print(TOSTRING(HistoryOrderGetDouble(Result.order, ORDER_PRICE_OPEN)));
    }
  }
}

void OnStart()
{
  Print(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
  Print(TOSTRING(_Symbol));
  Print(TOSTRING(EnumToString((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE))));
  Print(TOSTRING(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE)) + "\n");
  
  OpenPosition(ORDER_FILLING_FOK);
  OpenPosition(ORDER_FILLING_IOC);
  OpenPosition(ORDER_FILLING_RETURN);
}

Вкладка история

 

Вывод в журнал

AccountInfoString(ACCOUNT_SERVER) = Swissquote-Server
_Symbol = EURUSD
EnumToString((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol,SYMBOL_TRADE_EXEMODE)) = SYMBOL_TRADE_EXECUTION_EXCHANGE
SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE) = 3

Result.order = 13961469
EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order,ORDER_TYPE_FILLING)) = ORDER_FILLING_FOK
HistoryOrderGetDouble(Result.order,ORDER_PRICE_OPEN) = 0.0
Result.order = 13961470
EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order,ORDER_TYPE_FILLING)) = ORDER_FILLING_IOC
HistoryOrderGetDouble(Result.order,ORDER_PRICE_OPEN) = 0.0
Result.order = 13961471
EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order,ORDER_TYPE_FILLING)) = ORDER_FILLING_RETURN
HistoryOrderGetDouble(Result.order,ORDER_PRICE_OPEN) = 0.0

По какой причине для ORDER_FILLING_FOK и ORDER_FILLING_IOC не требуется указание цены? Зачем во вкладке истории написано market (и так понятно, т.к. buy) и не указана цена (см. комментарий к ордеру)?

 

Просьба обратить внимание на торговые сервера своих клиентов.

 
fxsaber:

Просьба обратить внимание на торговые сервера своих клиентов.

Да даже на Metaquotes-Demo (1472) те же вопросы
AccountInfoString(ACCOUNT_SERVER) = MetaQuotes-Demo
_Symbol = RTS-12.16
EnumToString((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol,SYMBOL_TRADE_EXEMODE)) = SYMBOL_TRADE_EXECUTION_EXCHANGE
SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE) = 3

Result.order = 111132415
EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order,ORDER_TYPE_FILLING)) = ORDER_FILLING_FOK
HistoryOrderGetDouble(Result.order,ORDER_PRICE_OPEN) = 0.0
Result.order = 111132419
EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order,ORDER_TYPE_FILLING)) = ORDER_FILLING_IOC
HistoryOrderGetDouble(Result.order,ORDER_PRICE_OPEN) = 0.0
Result.order = 111132422
EnumToString((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(Result.order,ORDER_TYPE_FILLING)) = ORDER_FILLING_RETURN
HistoryOrderGetDouble(Result.order,ORDER_PRICE_OPEN) = 0.0

Мало того, что FOK и IOC-маркеты скользят (на скрине хорошо видно)! Так еще и каким-то неведомым образом терминал умудряется достать цену маркет-ордера во всплывающей подсказке (выделил красным). Откуда он берет эту инфу, если MQL5 четко выдает, что ORDER_PRICE_OPEN == 0?!

 
В СервисДеске убрали возможность добавлять картинки.
 
fxsaber:
В СервисДеске убрали возможность добавлять картинки.
Не "добавлять", а вставлять в текст. И раньше нельзя было. К заявке картинки всегда прикреплялись.
 
Vladimir Karputov:
Не "добавлять", а вставлять в текст. И раньше нельзя было. К заявке картинки всегда прикреплялись.
Зачем это терминологическое занудство? Нельзя в СД прикреплять картинки!
 
fxsaber:
Зачем это терминологическое занудство? Нельзя в СД прикреплять картинки!

Можно прикрепить картинку, очень даже можно:

 

 

и шаг два:

 

 

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