Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мне нужна маржа для форексных валютных пар, как это сделать?
OrderCalcMargin
Спасибо, сейчас проверю. Я тоже кое-что нашел в документации на 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)
где:
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);
}
***********************
А класс CSymbolInfo получает оценку в 10 блевотных пакетиков за реализацию вот такого безобразия: чтобы получить свойство символа, нужно вызвать следующую многоэтажную функцию, которая обновляет все!
***********************
Погодь ругаться-то. Всё верно делается Refres() позволяет получить за один раз все свойства. А для обновления цен другая функция: RefreshRates().
Мне не нужны все свойства, незачем тратить время на их полное обновление.
Подход с не работает, вот кусок кода, получаю код ошибки 4014 -
ERR_FUNCTION_NOT_ALLOWED
4014
Системная функция не разрешена для вызова
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
да вроде норм работает
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);
}
да вроде норм работает
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);
}
Интересно, а какой тип счета и что выводит-то?
альпари демо,хэдж, 211 с копейками результат
2016.11.25 16:56:13.666 **** 212.02
альпари демо,хэдж, 211 с копейками результат
2016.11.25 16:56:13.666 **** 212.02
В виде скрипта у меня тоже работает, а вот в индикаторе нет. Попробовал, выводит чушь. То есть МК запретили использовать данную функцию в индюках, так как она определяет маржу для посылки ордера!!!
Ну и на фига так делать?
Придется все же вычислять маржу по формуле...
Сегодня мне перестал нравиться МТ5... сразу два маразма обнаружено за день
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);
}
В виде скрипта у меня тоже работает, а вот в индикаторе нет.
из справки еще
Торговые функции могут использоваться в экспертах и скриптах. Торговые функции могут быть вызваны только в том случае, если в свойствах соответствующего эксперта или скрипта включена галочка "Разрешить советнику торговать".
а OrderCalcMargin это торговая.