[РЕШЕНО]OrderCalcMargin и проблема с ним связанная. - страница 3

 
Alexey Viktorov:

Потому, что Alert из другого места. А в функцию точно поступает или ORDER_TYPE_BUY или ORDER_TYPE_SELL

И в настройках всё одно и то-же. Даже магики одинаковые.


Если Alert из другого места, то зачем Вы его в распечатку вставляете?

Алексей, приведите полный код функции проверки, а то гаданием занимаемся. 

P.S. Магики на картинках НЕ ОДИНАКОВЫЕ :)

 
Kirill Belousov:
Алексей, приведите полный код функции проверки, а то гаданием занимаемся. 

Там смотреть-то нечего

bool calculateMargin(double lots, ENUM_ORDER_TYPE orderType, double price, double & freeMargin, double & margin)
{
 ResetLastError();
 ENUM_ORDER_TYPE m_orderType;
 switch(orderType)
  {
   case ORDER_TYPE_BUY:
   case ORDER_TYPE_BUY_LIMIT:
   case ORDER_TYPE_BUY_STOP:
   case ORDER_TYPE_BUY_STOP_LIMIT:
    m_orderType = ORDER_TYPE_BUY;
     break;
   case ORDER_TYPE_SELL:
   case ORDER_TYPE_SELL_LIMIT:
   case ORDER_TYPE_SELL_STOP:
   case ORDER_TYPE_SELL_STOP_LIMIT:
    m_orderType = ORDER_TYPE_SELL;
     break;
   default: return(false);
  }
   freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
  bool calcMargin = false;
  int k = 0;
   do
    {
     calcMargin = OrderCalcMargin(m_orderType, _Symbol, lots, price, margin);
     k++;
    }
   while(!calcMargin && k < 7);
  bool rez = (calcMargin && margin > 0 && freeMargin > margin);
   if(!rez)
    {
     Print(_Symbol, " m_orderType ", EnumToString(m_orderType));
     Print(_Symbol, " lots ", lots);
     Print(_Symbol, " price ", price);
     Print(_Symbol, " freeMargin ", freeMargin, " margin ", margin);
     Print(_Symbol, " ", k, " error ", _LastError);
    }
 return(rez);
}/*******************************************************************/


К следующему понедельнику заготовлен такой вариант

   do
    {
     calcMargin = OrderCalcMargin(m_orderType, _Symbol, lots, price, margin);
     k++;
    }
   while(/*!calcMargin && */margin <= 0 && k < 7);

И, я извиняюсь, удалил одну строку распечатки

2017.10.02 03:59:58.952 Lazy_Locker (GBPJPY.m,H1)       GBPJPY.m 1 error 0

Без кода обязательно вызвала-бы вопрос "что такое 1". А это то, что с первой попытки получили мржу 0 и вывалились из цикла.

 
Kirill Belousov:

Если Alert из другого места, то зачем Вы его в распечатку вставляете?

Алексей, приведите полный код функции проверки, а то гаданием занимаемся. 

P.S. Магики на картинках НЕ ОДИНАКОВЫЕ :)

Ааа. Такие глаза  плохо видят.

 

Вместо OrderSend делайте (OrderCheck && OrderSend). Такое решение всегда пройдет Маркет.

 
fxsaber:

Вместо OrderSend делайте (OrderCheck && OrderSend). Такое решение всегда пройдет Маркет.

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

 
Alexey Viktorov:

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

Вместе с сабжем вызывайте OrderCheck, затем делайте распечатку Request и Check структур, а так же показания этой функции

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.02.27 18:40

// Альтернатива 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);  
}
 
fxsaber:

Вместе с сабжем вызывайте OrderCheck, затем делайте распечатку Request и Check структур, а так же показания этой функции

Спасибо. Честное слово не хочу показаться невежей, но

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderCalcMargin и проблема с ним связанная.

Alexey Viktorov, 2017.10.04 16:43

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


 
Alexey Viktorov:

Спасибо. Честное слово не хочу показаться невежей, но

Так это был рецепт, чтобы разобраться и достичь цели ветки.

Вы настолько мало выводите в логи, что по ним можно только гадать. Предложил вывести в лог несколько больше информации. Какую - выше написано.

 
Alexey Viktorov:

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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Kirill Belousov, 2017.10.05 02:40

В соседней ветке 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

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


 
Kirill Belousov:

Да, уже прочёл


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alexey Viktorov, 2017.10.05 07:01

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

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


Сейчас отменю приготовленное исправление


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderCalcMargin и проблема с ним связанная.

Alexey Viktorov, 2017.10.04 16:37


К следующему понедельнику заготовлен такой вариант

   do
    {
     calcMargin = OrderCalcMargin(m_orderType, _Symbol, lots, price, margin);
     k++;
    }
   while(/*!calcMargin && */margin <= 0 && k < 7);
и открою в окне обзора рынка GBPUSD