Почему не работают функции определения маржи? - страница 2

 
Alexey Volchanskiy:
Мне нужна маржа для форексных валютных пар, как это сделать?
OrderCalcMargin
OrderCalcMargin Вычисляет размер маржи, необходимой для указанного типа ордера на текущем счете и при текущем рыночном окружении без учета текущих отложенных ордеров и открытых позиций. Позволяет оценить размер маржи для планируемой торговой операции. Значение возвращается в валюте счета. bool  OrderCalcMargin ( ENUM_ORDER_TYPE   action,   // тип ордера string   symbol,   // имя символа double   volume,   // объем double   price,   // цена открытия double& margin   // переменная для получения значения маржи ); Параметры action [in] Тип ордера, может принимать значения из перечисления ENUM_ORDER_TYPE. symbol [in] Имя финансового инструмента. volume [in] Объем торговой операции. price [in] Цена открытия. margin [out] Переменная, в которую будет записан необходимый размер маржи в случае успешного выполнения функции. Вычисление производится как если бы на текущем счете не было отложенных ордеров и открытых позиций. Значение маржи зависит от многих факторов и может меняться при...
Документация | 2015.12.03 14:00
 
Vladimir Karputov:
OrderCalcMargin
OrderCalcMargin Вычисляет размер маржи, необходимой для указанного типа ордера на текущем счете и при текущем рыночном окружении без учета текущих отложенных ордеров и открытых позиций. Позволяет оценить размер маржи для планируемой торговой операции. Значение возвращается в валюте счета. bool  OrderCalcMargin ( ENUM_ORDER_TYPE   action,   // тип ордера string   symbol,   // имя символа double   volume,   // объем double   price,   // цена открытия double& margin   // переменная для получения значения маржи ); Параметры action [in] Тип ордера, может принимать значения из перечисления ENUM_ORDER_TYPE. symbol [in] Имя финансового инструмента. volume [in] Объем торговой операции. price [in] Цена открытия. margin [out] Переменная, в которую будет записан необходимый размер маржи в случае успешного выполнения функции. Вычисление производится как если бы на текущем счете не было отложенных ордеров и открытых позиций. Значение маржи зависит от многих факторов и может меняться при...
Документация | 2015.12.03 14:00

Спасибо, сейчас проверю. Я тоже кое-что нашел в документации на SymbolInfoDouble, проверю и этот вариант. 

Для получения информации о способе вычисления величины залоговых средств по инструменту (размера маржинальных требований) предназначено перечисление ENUM_SYMBOL_CALC_MODE.

ENUM_SYMBOL_CALC_MODE

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

Описание

Формула

SYMBOL_CALC_MODE_FOREX

Forex mode – расчет прибыли и маржи дляФорекс

Margin:  Lots*Contract_Size/Leverage

Profit:   (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_FUTURES

Futures mode – расчет залога и прибыли дляфьючерсов

Margin: Lots *InitialMargin*Percentage/100

Profit:  (close_price-open_price)*TickPrice/TickSize*Lots

SYMBOL_CALC_MODE_CFD

CFD mode – расчет залога и прибыли для CFD

Margin: Lots *ContractSize*MarketPrice*Percentage/100

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDINDEX

CFD index mode – расчет залога и прибыли для CFD на индексы

Margin: (Lots*ContractSize*MarketPrice)*TickPrice/TickSize

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDLEVERAGE

CFD Leverage mode – расчет залога и прибыли для CFD при торговле с плечом

Margin: (Lots*ContractSize*MarketPrice*Percentage)/Leverage

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_EXCH_STOCKS

Exchange mode – расчет залога и прибыли для торговли ценными бумагами на бирже

Margin: Lots*ContractSize*OpenPrice

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_EXCH_FUTURES

Futures mode –  расчет залога и прибыли для торговли фьючерсными контрактами на бирже

Margin: Lots*InitialMargin или Lots*MaintenanceMargin

Profit:  (close_price-open_price)*Lots*TickPrice/TickSize

SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS

FORTS Futures mode –  расчет залога и прибыли для торговлифьючерсными контрактамина FORTS. Размер маржи может уменьшаться на величину отклонения MarginDiscount по следующим правилам:

1. Если цена длинной позиции (ордера на покупку) меньше расчетной цены, то MarginDiscount = Lots*((PriceSettle-PriceOrder)*TickPrice/TickSize)

2. Если цена короткой позиций (ордера на продажу) больше расчетной цены, то MarginDiscount = Lots*((PriceOrder-PriceSettle)*TickPrice/TickSize)

где:

    • PriceSettle – расчетная (клиринговая) цена предыдущей сессии;
    • PriceOrder – средневзвешенная цена позиции или цена открытия, указанная в ордере (заявке);
    • TickPrice – цена тика (стоимость изменения цены на один пункт);
    • TickSize – размер тика (минимальный шаг изменения цены)

Margin: Lots*InitialMargin или Lots*MaintenanceMargin

Profit:  (close_price-open_price)*Lots*TickPrice/TickSize

SYMBOL_CALC_MODE_SERV_COLLATERAL

Collateral mode - инструмент используется в качестве неторгуемого актива на торговом счете. Рыночная стоимость открытой позиции рассчитывается на основании объема, текущей цены рынка,  размера контракта и коэффициента ликвидности. Стоимость учитывается в Активах (Assets), которые суммируются с собственными средствами (Equity). Тем самым открытые позиции по такому инструменту увеличивают размер свободных средств (Free Margin)  и служат дополнительным обеспечением под открытые позиции по торгуемым инструментам

Margin: нет

Profit:  нет

Рыночная стоимость: Lots*ContractSize*MarketPrice*LiqudityRate

 

А класс  CSymbolInfo получает оценку в 10 блевотных пакетиков за реализацию вот такого безобразия: чтобы получить свойство символа, нужно вызвать следующую многоэтажную функцию, которая обновляет все!

//+------------------------------------------------------------------+
//| Refresh cached data                                              |
//+------------------------------------------------------------------+
bool CSymbolInfo::Refresh(void)
  {
   long tmp=0;
//---
   if(!SymbolInfoDouble(m_name,SYMBOL_POINT,m_point))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE,m_tick_value))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_PROFIT,m_tick_value_profit))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_LOSS,m_tick_value_loss))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_SIZE,m_tick_size))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_CONTRACT_SIZE,m_contract_size))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_MIN,m_lots_min))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_MAX,m_lots_max))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_STEP,m_lots_step))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_LIMIT,m_lots_limit))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_SWAP_LONG,m_swap_long))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_SWAP_SHORT,m_swap_short))
      return(false);
   if(!SymbolInfoInteger(m_name,SYMBOL_DIGITS,tmp))
      return(false);
   m_digits=(int)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_ORDER_MODE,tmp))
      return(false);
   m_order_mode=(int)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_TRADE_EXEMODE,tmp))
      return(false);
   m_trade_execution=(ENUM_SYMBOL_TRADE_EXECUTION)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_TRADE_CALC_MODE,tmp))
      return(false);
   m_trade_calcmode=(ENUM_SYMBOL_CALC_MODE)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_TRADE_MODE,tmp))
      return(false);
   m_trade_mode=(ENUM_SYMBOL_TRADE_MODE)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_SWAP_MODE,tmp))
      return(false);
   m_swap_mode=(ENUM_SYMBOL_SWAP_MODE)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_SWAP_ROLLOVER3DAYS,tmp))
      return(false);
   m_swap3=(ENUM_DAY_OF_WEEK)tmp;
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_INITIAL,m_margin_initial))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_MAINTENANCE,m_margin_maintenance))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_LONG,m_margin_long))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_SHORT,m_margin_short))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_LIMIT,m_margin_limit))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_STOP,m_margin_stop))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_STOPLIMIT,m_margin_stoplimit))
      return(false);
   if(!SymbolInfoInteger(m_name,SYMBOL_EXPIRATION_MODE,tmp))
      return(false);
   m_trade_time_flags=(int)tmp;
   if(!SymbolInfoInteger(m_name,SYMBOL_FILLING_MODE,tmp))
      return(false);
   m_trade_fill_flags=(int)tmp;
//--- succeed
   return(true);
  }


 ***********************

 
Alexey Volchanskiy:

А класс  CSymbolInfo получает оценку в 10 блевотных пакетиков за реализацию вот такого безобразия: чтобы получить свойство символа, нужно вызвать следующую многоэтажную функцию, которая обновляет все!


 ***********************

Погодь ругаться-то. Всё верно делается Refres() позволяет получить за один раз все свойства.  А для обновления цен другая функция: RefreshRates().
 
Vladimir Karputov:
Погодь ругаться-то. Всё верно делается Refres() позволяет получить за один раз все свойства.  А для обновления цен другая функция: RefreshRates().

Мне не нужны все свойства, незачем тратить время на их полное обновление.

Подход с не работает, вот кусок кода, получаю код ошибки 4014 - 

ERR_FUNCTION_NOT_ALLOWED

4014

Системная функция не разрешена для вызова


   double marginBuy = 0, marginSell = 0;
   m_symbolInfo.RefreshRates();
   m_symbolInfo.Refresh();
   ResetLastError();
   if(!OrderCalcMargin(ORDER_TYPE_BUY, _Symbol, 1, m_symbolInfo.Ask(), marginBuy))
      Print("Error in OrderCalcMargin(ORDER_TYPE_BUY... = )", GetLastError(), "  Ask=", DoubleToString(m_symbolInfo.Ask(), _Digits));
   ResetLastError();
   if(!OrderCalcMargin(ORDER_TYPE_SELL, _Symbol, 1, m_symbolInfo.Bid(), marginSell))
      Print("Error in OrderCalcMargin(ORDER_TYPE_SELL... = )", GetLastError(), "  Bid=", DoubleToString(m_symbolInfo.Bid(), _Digits));

 И вот вывод, Bid и Ask получаю нормально, а функция для форекса не работает. Буду пробовать второй вариант с самостоятельным расчетом маржи. Вот зачем, скажите, MQ убрали из терминала расчеты для форекса? На бирже дай бог на 5-ке торгует 1% пользователей. Опять наполеоновские планы насчет западных бирж, а форекс пошел в зад.

2016.11.25 16:24:51.701 showimportantparams (EURUSD.m,M1) Error in OrderCalcMargin(ORDER_TYPE_BUY... = )4014  Ask=1.05973

2016.11.25 16:24:51.701 showimportantparams (EURUSD.m,M1) Error in OrderCalcMargin(ORDER_TYPE_SELL... = )4014  Bid=1.05956

2016.11.25 16:24:51.742 showimportantparams (EURUSD.m,M1) Error in OrderCalcMargin(ORDER_TYPE_BUY... = )4014  Ask=1.05971

2016.11.25 16:24:51.742 showimportantparams (EURUSD.m,M1) Error in OrderCalcMargin(ORDER_TYPE_SELL... = )4014  Bid=1.05955

 

да вроде норм работает

#property script_show_inputs
input string pair1 = "EURUSD";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double marg;
   OrderCalcMargin(ORDER_TYPE_BUY,pair1,1,SymbolInfoDouble(pair1,SYMBOL_ASK),marg);
   Print(marg);
  }
 
ivanivan_11:

да вроде норм работает

#property script_show_inputs
input string pair1 = "EURUSD";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double marg;
   OrderCalcMargin(ORDER_TYPE_BUY,pair1,1,SymbolInfoDouble(pair1,SYMBOL_ASK),marg);
   Print(marg);
  }
Интересно, а какой тип счета и что выводит-то?
 
Alexey Volchanskiy:
Интересно, а какой тип счета и что выводит-то?

альпари демо,хэдж, 211 с копейками результат

2016.11.25 16:56:13.666    ****   212.02

 
ivanivan_11:

альпари демо,хэдж, 211 с копейками результат

2016.11.25 16:56:13.666    ****   212.02

В виде скрипта у меня тоже работает, а вот в индикаторе нет. Попробовал, выводит чушь. То есть МК запретили использовать данную функцию в индюках, так как она определяет маржу для посылки ордера!!!

Ну и на фига так делать?  

Придется все же вычислять маржу по формуле...

Сегодня мне перестал нравиться МТ5... сразу два маразма обнаружено за день 

 

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   double marg;
   OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1,SymbolInfoDouble(Symbol(),SYMBOL_ASK),marg);
   Print(marg);
   return(rates_total);
}
2016.11.25 17:27:20.083 showimportantparams (EURUSD.m,M1) 1.236804412547309e-318

 
Alexey Volchanskiy:

В виде скрипта у меня тоже работает, а вот в индикаторе нет.


из справки еще

Торговые функции могут использоваться в экспертах и скриптах. Торговые функции могут быть вызваны только в том случае, если в свойствах соответствующего эксперта или скрипта включена галочка "Разрешить советнику торговать".

а OrderCalcMargin это торговая.

Причина обращения: