Попытался разобрать код примера советника Moving Average. Не понял что за margin.

 

Разбираю код примера Moving Average. Для начала решил сделать вывод информации о символе.

Насколько я понял SPREAD это разница в минимальных единицах (1.40269-1.40229)/0.00001=40.

Далее есть ACCOUNT_MARGIN_FREE что это? средства на счёте которые никуда не вложены?

Далее я решил посмотреть ценя покупки/продажи символа. Но что-то пошло не так.

OrderCalcMargin

Вычисляет размер маржи, необходимой для указанного типа ордера на текущем счете и при текущем рыночном окружении....

Получается, чтобы разместить ордер на покупку 1 единицы символа мне требуется в 1000 раз больше маржи чем его цена?

И что за Contract_size в формуле расчёта? В PositionOpen только поле volume которое судя по всему эквивалентно lots.


Это функция вывода информации в журнал.

void WriteI()
{
   Print("symbol          :",_Symbol);
   //Print("Info basis      :",SymbolInfoString(_Symbol,SYMBOL_BASIS));
   Print("Info DESCRIPTION:",SymbolInfoString(_Symbol,SYMBOL_DESCRIPTION));
   //Print("Info ISIN       :",SymbolInfoString(_Symbol,SYMBOL_ISIN));
   //Print("Info BANK       :",SymbolInfoString(_Symbol,SYMBOL_BANK));
   
   Print("Info DIGITS     :",SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   Print("Info SPREAD     :",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
   Print("Info TRADE_MODE :",stringify("ENUM_SYMBOL_TRADE_MODE",SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE)));
   Print("Info TRADEC_MODE:", SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE));
   Print("Info ACCMARG    :", AccountInfoDouble(ACCOUNT_MARGIN_FREE));
   
   
   double price=0.0;
   double margin=0.0;
//--- select lot size
   bool err=0;
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      err=1;
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      err=1;
      
   if(err==0){
      Print("BB Price:",price," Margin:",margin);
   }else{
      Print("Price ERR  :");
   }
   
   err=0;
   if(!SymbolInfoDouble(_Symbol,SYMBOL_BID,price))
      err=1;
   if(!OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1.0,price,margin))
      err=1;
      
   if(err==0){
      Print("SS Price:",price," Margin:",margin);
   }else{
      Print("Price ERR  :");
   }
   
      
}
 
Ваш вопрос по советнику из стандартной поставки \MQL5\Experts\Examples\Moving Average\Moving Average.mq5?
 
samrrr:

Разбираю код примера Moving Average. Для начала решил сделать вывод информации о символе.

Насколько я понял SPREAD это разница в минимальных единицах (1.40269-1.40229)/0.00001=40.

Далее есть ACCOUNT_MARGIN_FREE что это? средства на счёте которые никуда не вложены?

Далее я решил посмотреть ценя покупки/продажи символа. Но что-то пошло не так.

OrderCalcMargin

Вычисляет размер маржи, необходимой для указанного типа ордера на текущем счете и при текущем рыночном окружении....

Получается, чтобы разместить ордер на покупку 1 единицы символа мне требуется в 1000 раз больше маржи чем его цена?

И что за Contract_size в формуле расчёта? В PositionOpen только поле volume которое судя по всему эквивалентно lots.


Это функция вывода информации в журнал.


Margin

Margin Получает размер зарезервированных залоговых средств. double  Margin () const Возвращаемое значение Размер зарезервированных залоговых средств в валюте депозита.

Информация об инструменте

Структура результата проверки торгового запроса

CheckResultMargin

OrderCalcMargin

Поиск - MQL5.community
Поиск - MQL5.community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 

Да по \Experts\Examples\Moving Average\Moving Average.mq5

Если Margin - размер зарезервированных средств. то получается:

Предположим что покупаю 1 лот по цене 1.40269 и продаю позже по цене 1.40369.

Получается разница в 0.001 и для того, чтобы выполнить эту операцию необходимо 1402 свободных средств на счёте.

0.001/1402=0.00000071 это 0.000071% прибыли.

правильно?

 
samrrr:

Да по \Experts\Examples\Moving Average\Moving Average.mq5

Если Margin - размер зарезервированных средств. то получается:

Предположим что покупаю 1 лот по цене 1.40269 и продаю позже по цене 1.40369.

Получается разница в 0.001 и для того, чтобы выполнить эту операцию необходимо 1402 свободных средств на счёте.

0.001/1402=0.00000071 это 0.000071% прибыли.

правильно?

А где там в коде Margin?

 
Vladimir Karputov:

А где там в коде Margin?

в функции double TradeSizeOptimized(void).

 
samrrr:

в функции double TradeSizeOptimized(void).

Да, увидел. Так в чём именно вопрос? Только кратко - в такой-то строке не ясен параметр такой-то.

 
Неясно вообще что это и зачем. В коде по идее в начале рассчитывается размер максимального вложения но разве количество (lots) не должно считаться по формуле lots=текущий_баланс/цена?
 
samrrr:
Неясно вообще что это и зачем. В коде по идее в начале рассчитывается размер максимального вложения но разве количество (lots) не должно считаться по формуле lots=текущий_баланс/цена?
 

Конкретно в этих строках:

   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))

      return(0.0);

   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))

      return(0.0);

   if(margin<=0.0)

      return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);

Как тут производится вычисление lot?

Откуда куда идут данные понятно.

price цена выставления ордера ask.

Но что тут делает margin?

 
samrrr:

Конкретно в этих строках:

Как тут производится вычисление lot?

Откуда куда идут данные понятно.

price цена выставления ордера ask.

Но что тут делает margin?

Итак, смотрим на определение OrderCalcMargin:

bool  OrderCalcMargin( 
   ENUM_ORDER_TYPE       action,           // тип ордера 
   string                symbol,           // имя символа 
   double                volume,           // объем 
   double                price,            // цена открытия 
   double&               margin            // переменная для получения значения маржи 
   );

Обратите внимание, на переменную "margin" - она передаётся по ссылке, то есть это Ваша переменная, Вы её передаёте в функцию OrderCalcMargin и если OrderCalcMargin окончила работу с результатом "true", то в переменной "margin" окажется записанный размер маржи для типа ордера "action", символа "symbol", объёмом "volume" по цене "price".

То есть при успешном выполнении OrderCalcMargin запишет в переменную "margin" значение маржи.