Ошибки, баги, вопросы - страница 2019

Anatoli Kazharski:

Да, это очень сильно мешает в некоторых случаях при разработке и отладке торговых стратегий.

Не заметил, чтобы переключение вкладок, как-то изменяло содержание списка истории:


Ест такое. Спасаюсь бегунком скорости и паузой.  
fxsaber:

Правой кнопкой и менять Сделки/Ордера.

Да, такие действия восстанавливают список истории сделок:


Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
На счете все реальные символы имеют вид "EURUSD.hello". После создания кастомного "EURUSD" не возникнет ли проблем при копировании со стороны сервиса Сигналов?

Просьба добавить следующие значения

ENUM_DEAL_REASON

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

Описание

DEAL_REASON_LIMIT

Сделка проведена в результате срабатывания лимитного ордера

DEAL_REASON_MARKET

Сделка проведена в результате срабатывания маркет-ордера

DEAL_REASON_STOP

Сделка проведена в результате срабатывания стоп-ордера


Казалось бы, это лишнее. Но бывают такие ситуации, когда ордер исполнился частично, породив сделку. DEAL_ORDER при этом найдется, но его не будет в таблице истории, т.к. ордер еще живой.

Т.е. чтобы узнать тип ордера, который вызвал сделку, не всегда поможет обращение в Истории ордеров. Дабы не городить огород с поиском ордеров среди "мертвых и живых", предлагаю просто добавить еще флаги исполнения - после уже существующих, дабы сохранить совместимость с ENUM_ORDER_REASON и ENUM_POSITION_REASON. При этом желательно добавить такие же флаги в ENUM_POSITION_REASON, чтобы была совместимость

POSITION_REASON_LIMIT  == DEAL_REASON_LIMIT
POSITION_REASON_MARKET == DEAL_REASON_MARKET
POSITION_REASON_STOP   == DEAL_REASON_STOP
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Сделка является отражением факта совершения торговой операции на основании ордера, содержащего торговый приказ. Каждая сделка описывается свойствами, позволяющими получить информацию о ней. Для чтения значений свойств используются функции вида Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая...

В соседней ветке https://www.mql5.com/ru/forum/216697/page3 поднялся вопрос про OrderCalcMargin


Тест: проверим 2 различных варианта расчета залога с подстановкой различных цен открытия.

#define TOSTRING(A) #A+" = "+(string)(A)
void OnStart()
  {
   double margin_1=999,price_1;

   Print(TOSTRING(price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print(TOSTRING(price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print(TOSTRING(price_1=10.0));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print(TOSTRING(price_1=1.0));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
  }

// Альтернатива OrderCalcMargin
bool MyOrderCalcMargin(const ENUM_ORDER_TYPE action,const string symbol,const double volume,const double price,double &margin)
  {
   double MarginInit,MarginMain;

   const bool Res=SymbolInfoMarginRate(symbol,action,MarginInit,MarginMain);

   margin=Res ? MarginInit*price*volume*SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE)/
          (SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE)*AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0;

   return(Res);
  }

Вот ЛОГ

LF      0       04:28:05.464    test (AUDJPY,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK) = 88.712
KP      0       04:28:05.464    test (AUDJPY,H1)        price_1= 88.712 margin_1= 26.19 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
CR      0       04:28:05.464    test (AUDJPY,H1)        price_1= 88.712 margin_1= 26.19399834 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
ED      0       04:28:05.464    test (AUDJPY,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID) = 88.7
PR      0       04:28:05.464    test (AUDJPY,H1)        price_1= 88.7 margin_1= 26.19 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
KS      0       04:28:05.464    test (AUDJPY,H1)        price_1= 88.7 margin_1= 26.1904551 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
EP      0       04:28:05.464    test (AUDJPY,H1)        price_1=10.0 = 10.0
HK      0       04:28:05.464    test (AUDJPY,H1)        price_1= 10.0 margin_1= 26.19 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
HH      0       04:28:05.464    test (AUDJPY,H1)        price_1= 10.0 margin_1= 2.95270069 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
KN      0       04:28:05.464    test (AUDJPY,H1)        price_1=1.0 = 1.0
FS      0       04:28:05.464    test (AUDJPY,H1)        price_1= 1.0 margin_1= 26.19 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
PR      0       04:28:05.464    test (AUDJPY,H1)        price_1= 1.0 margin_1= 0.29527007 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true

Функция OrderCalcMargin не учитывает при расчетах маржи цену открытия

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

Если котируемая валюта USD (валюта счета тоже USD), то расчетная маржа меняется в зависимости от цены открытия.

Лог для GBPUSD

KK      0       05:25:15.763    test (GBPUSD,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK) = 1.32354
CR      0       05:25:15.763    test (GBPUSD,H1)        price_1= 1.32354 margin_1= 44.12 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
DD      0       05:25:15.763    test (GBPUSD,H1)        price_1= 1.32354 margin_1= 44.118 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
GD      0       05:25:15.763    test (GBPUSD,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID) = 1.32341
LS      0       05:25:15.763    test (GBPUSD,H1)        price_1= 1.32341 margin_1= 44.11 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
NQ      0       05:25:15.763    test (GBPUSD,H1)        price_1= 1.32341 margin_1= 44.11366667 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
DG      0       05:25:15.763    test (GBPUSD,H1)        price_1=10.0 = 10.0
LM      0       05:25:15.763    test (GBPUSD,H1)        price_1= 10.0 margin_1= 333.33 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
NO      0       05:25:15.763    test (GBPUSD,H1)        price_1= 10.0 margin_1= 333.33333333 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
HM      0       05:25:15.763    test (GBPUSD,H1)        price_1=1.0 = 1.0
ED      0       05:25:15.763    test (GBPUSD,H1)        price_1= 1.0 margin_1= 33.33 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
OD      0       05:25:15.763    test (GBPUSD,H1)        price_1= 1.0 margin_1= 33.33333333 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true

Это Баг или так и должно быть?

OrderCalcMargin и проблема с ним связанная.
OrderCalcMargin и проблема с ним связанная.
  • 2017.10.04
  • www.mql5.com
Один советник работает на счёте MetaQuotes-Demo на семи валютных парах и на трёх парах реальном счёте робо. Итого 10 экземпляров советника запущено...
Kirill Belousov:

Функция OrderCalcMargin не учитывает при расчетах маржи цену открытия

Это Баг или так и должно быть?

Баг, конечно. Пишите в СД.

Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));

Эта строка работает, как надо, но мне пришлось проверить, т.к. приходится гадать порядок выполнения. Обсуждение этого момента здесь.

fxsaber:

Баг, конечно. Пишите в СД.

Эта строка работает, как надо, но мне пришлось проверить, т.к. приходится гадать порядок выполнения. Обсуждение этого момента здесь.

Порядок расчета выражений в Print() справа налево. Вроде как... Пока... Тоже проверял предварительно :)


Трудно быть уверенным, когда в справке MQL4/5 прямое противоречие:

Справочник MQL5Основы языкаФункцииПередача параметров 

Примечание

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


Справочник MQL5Основы языкаОперации и выраженияДругие операции 

Вызов функции с аргументами x1, x2,..., xn

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

Значением выражения является значение, возвращаемое функцией. Если тип возвращаемого значения функции есть void, то вызов такой функции нельзя помещать справа в операции присвоения. Обратите внимание, что порядок выполнения выражений x1,..., xn гарантируется.


Пока ориентируюсь на передачу параметров в обратном порядке.

Kirill Belousov:

В соседней ветке https://www.mql5.com/ru/forum/216697/page3 поднялся вопрос про OrderCalcMargin


Тест: проверим 2 различных варианта расчета залога с подстановкой различных цен открытия.

Вот ЛОГ

Функция OrderCalcMargin не учитывает при расчетах маржи цену открытия

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

Если котируемая валюта USD (валюта счета тоже USD), то расчетная маржа меняется в зависимости от цены открытия.

Лог для GBPUSD

Это Баг или так и должно быть?

Наверное так должно быть, потому что в расчёте, в частности AUDJPY участвуют AUDUSD и USDJPY котировки которых неизменны в момент расчёта.

А вот эта мысль толкает меня на проверку... На счёте MetaQuotes-Demo в обзоре рынка GBPUSD присутствует, а на счёте робо нет...

Alexey Viktorov:

Наверное так должно быть, потому что в расчёте, в частности AUDJPY участвуют AUDUSD и USDJPY котировки которых неизменны в момент расчёта.

А вот эта мысль толкает меня на проверку... На счёте MetaQuotes-Demo в обзоре рынка GBPUSD присутствует, а на счёте робо нет...

Как раз хотел Вам сказать - что там баг.

Я уже воспроизвел Вашу ситуацию с Margin=0 при подсчете OrderCalcMargin

Просто еще не опубликовал.