OrderCalcMargin() - страница 3

 
prostotrader:

Ок, но мне неохота 8000 строк кода перелапачивать ;(

у меня больше 1000 строк не получается))

надо только заменить BUY на BUY_LIMIT, SELL на SELL_LIMIT,

а если неохота - держи запас по марже, тоже долгое время неохота было переделывать, но каждая копейка маржи должна работать, пришлось переделывать ))

 
Sergey Chalyshev:

у меня больше 1000 строк не получается))

надо только заменить BUY на BUY_LIMIT, SELL на SELL_LIMIT,

а если неохота - держи запас по марже, тоже долгое время неохота было переделывать, но каждая копейка маржи должна работать, пришлось переделывать ))

Спасибо, подумаю

 

Подумал, попробовал и пришел к выводу, что

не правильно считается маржа для рыночных ордеров в терминале.

Код:

//+------------------------------------------------------------------+
//|                                                  Test_margin.mq5 |
//|                                      Copyright 2020 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  double price_cur = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
  double cur_go;
  bool result = OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), 1, price_cur, cur_go);
  if(result == true)
  {
    Print("Текущее ГО = ", DoubleToString(cur_go));
    double max_go;
    double price_min = SymbolInfoDouble(Symbol(), SYMBOL_SESSION_PRICE_LIMIT_MAX);
    result = OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), 1, price_min, max_go);
    if(result == true)
    {
      Print("Максимальное ГО = ", DoubleToString(max_go));
      double midle_go;
      double price = NormalizeDouble((price_cur + price_min)/2, Digits());
      result = OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), 1, price, midle_go);
      if(result == true)
      {
        Print(" Среднее ГО = ", DoubleToString(midle_go));
      }
    }
  }   
  return(INIT_SUCCEEDED);
}

Результат:

2020.03.05 15:55:22.296 Test_margin (GOLD-3.20,M1)      Текущее ГО = 19824.62000000
2020.03.05 15:55:22.296 Test_margin (GOLD-3.20,M1)      Максимальное ГО = 19824.62000000
2020.03.05 15:55:22.296 Test_margin (GOLD-3.20,M1)      Среднее ГО = 19824.62000000

Вывод:

Так как цена везде одинаковая, то разработчики просто возвращают всегда максимальное ГО.

Это не правильно, я, трейдер, должен принимать решение о совершении сделки (не смотря, что это ордер по рынку).

А так, как есть, просто бессмысленная заморозка моих средств в момент сделки.

Если бы маржа считалась вариабельно (от цены), то я бы мог сам рассчитать проскальзывание рыночного ордера.

Н-р так:

double price = NormalizeDouble((price_cur + price_min)/2, Digits());
Т.е среднее значение цены в стакане.
 
Ага, маржи вроде нет, сова не откроет, а ручками терминал даёт открывать ещё.
 
Askr:
Ага, маржи вроде нет, сова не откроет, а ручками терминал даёт открывать ещё.

МТ5 ручками тоже не дает, а вот КВИК дает :)

 
prostotrader:

Потому, что парный трейдинг.

Уравнивающая позиция всегда покупается по рынку.

А если сел-лимит поставить с невыгодной ценой?