Как получить величину маржи открытой позиции? - страница 2

 
jaffer wilson:

Я знаю это. Я тоже пробовал это. Вот проверьте это:

Но это также не помогает найти правильный результат, как я вижу в ToolBox.

Теперь вы можете предложить мне, что я могу сделать, пожалуйста?

Во-первых, Вы рассмотрели только два варианта, в то время как в документации приведено 13 вариантов.

Во-вторых, в первом варианте ошибка. В документации формула:

Margin:  Lots * Contract_Size / Leverage * Margin_Rate

а в приведенном коде:

Margin:  Lots * Contract_Size / (Leverage * Margin_Rate)
 
Ihor Herasko :

Во-первых, Вы рассмотрели только два варианта, в то время как в документации приведено 13 вариантов.

Во-вторых, в первом варианте ошибка. В документации формула:

а в приведенном коде:

Что ты имеешь в виду, можешь мне сказать? Какая там ошибка? Я знаю, что есть и другие. Но сначала я подумал, что если первые два будут успешно выполнены, я смогу кодировать для других.

О какой ошибке документации вы говорите?

Если в документации есть ошибка, что команда MetaQuotes делает с этим? Они спят?

Я не хочу обидеть. Но эта конкретная проблема заняла у меня 2 недели.

Не могли бы вы мне помочь пожалуйста? Можете ли вы исправить код, которым я поделился с вами? Пожалуйста, проверьте его на своей стороне после исправления.

 
jaffer wilson:

Какая там ошибка? 

Ну, как минимум, этот код не компилируется. Его пришлось "допиливать" хотя бы до этапа компиляции.

Получилось следующее (заметьте, привожу полный текст, желающим достаточно всего лишь скопировать его в редактор):

#property  strict

#define PRINT(A) Print(#A + " = " + (string)(A))

bool OrderCalcMargin_AtOpen(ENUM_ORDER_TYPE order_type, const string EA_Orig_Symbol, double volume, double price, double &margin)
  {
   bool calculation = false;
   double Initial = SymbolInfoDouble(EA_Orig_Symbol, SYMBOL_MARGIN_INITIAL), Maintain, numerator, denominator, multiply_factor;
   if(SymbolInfoMarginRate(EA_Orig_Symbol, order_type, Initial, Maintain) == false)
      return false;
      
   ENUM_SYMBOL_CALC_MODE symbol_calc_mode = ENUM_SYMBOL_CALC_MODE(SymbolInfoInteger(EA_Orig_Symbol, SYMBOL_TRADE_CALC_MODE));
   switch (symbol_calc_mode)
     {
      case SYMBOL_CALC_MODE_FOREX:
         numerator = volume  * SymbolInfoDouble(EA_Orig_Symbol, SYMBOL_TRADE_CONTRACT_SIZE);
         denominator = double(AccountInfoInteger(ACCOUNT_LEVERAGE)) * Initial;
         if(denominator == 0)
           {
            denominator = 1;
            Print("denominator was found to be Zero (0).");
           }
         multiply_factor = numerator / denominator;
         margin = price * multiply_factor;
         calculation = true;
         break;
      case SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE:
         margin = volume * SymbolInfoDouble(EA_Orig_Symbol, SYMBOL_TRADE_CONTRACT_SIZE) * Initial;
         calculation = true;
         break;
      default:
         Alert("Please check with developer regarding this type: ", EnumToString(symbol_calc_mode));
         ExpertRemove();
     }
   return calculation;
  }

void OnStart()
{
   double fMargin = 0.0;
   if (OrderCalcMargin_AtOpen(ORDER_TYPE_SELL, Symbol(), 0.1, 1.1809, fMargin))
      PRINT(fMargin);
}

Для проверки открыл позицию:

Вот результат работы скрипта:

2020.09.09 22:55:54.982 Test (EURUSD,M1)        fMargin = 118.09

Как видно, все совпадает, и в документации, действительно, ошибка.

 
Ihor Herasko :

Ну, как минимум, этот код не компилируется. Его пришлось "допиливать" хотя бы до этапа компиляции.

Получилось следующее (заметьте, привожу полный текст, желающим достаточно всего лишь скопировать его в редактор):

Для проверки открыл позицию:

Вот результат работы скрипта:

Как видно, все совпадает, и в документации, действительно, ошибка.

Спасибо за код. У меня есть запрос. Вы можете использовать AUDJPY или любую другую валюту с тем же методом расчета, что и EURUSD, и торговать, например, с лотом = 100. Тогда дайте мне знать, останется ли формула прежней и даст ли идеальный результат.

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

 

@Ihor Herasko Привет, Вы пробовали это на своей стороне, потому что это не работает на моей стороне. Если вы пробовали, возможно, у вас возникла проблема, с которой я столкнулся.