Особенности языка mql5, тонкости и приёмы работы - страница 8

 

В Справке же написано

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

 
fxsaber:

В Справке же написано

При всём уважении, намерен вернуть вас назад к чтению

 

P.S. 

Можно получить, но если рассчитываем по AUDCAD, то залог получим в валюте AUD, а счёт то долларовый. Если подставить цену AUDUSD, то получим нужный размер маржи, но это не универсально и паскудно, потому, что есть счета с префиксами и суффиксами, и тут начинается целая история. Так-же может просто не быть открытой пары в обзоре рынка, и расчёт накроется "медным тазом"

Программа которая работает с деньгами (утверждение разработчиков), не может эти деньги посчитать. Старый, плохой и медленный мт4 мог работать с деньгами, а новый и модный мт5 не может.  Как так? 

 
fxsaber

Вот по формуле со ссылки:

Считаем к примеру залог по CADJPY, получаем залог в CAD

SymbolInfoDouble("CADJPY",SYMBOL_TRADE_CONTRACT_SIZE) / AccountInfoInteger(ACCOUNT_LEVERAGE)*0.7625 // СADUSD

Там где 0.7625, это цена CADUSD, но в терминале даже нет такой пары, чтоб её применить в расчёте.

Неужели так сложно перенести методом "copypaste" функцию расчёта "MODE_MARGINREQUIRED" в мт5, тем самым облегчить жизнь разработчикам.

 
Artyom Trishkin:
Хотелось бы расчёт, не зависимый от типа программы.
Разрабы считают, что вычисление маржи (и кое-что еще из инф. функций) - это торговая функция и в индикаторах должна быть запрещена. Я заводил серьезную ветку на эту тему - модераторы ее мгновенно порезали, как всегда, анонимно. Теперь мне на это плевать, выложил в КБ кастрированный индикатор без маржи.
 
Vitaly Muzichenko:

При всём уважении, намерен вернуть вас назад к чтению

Признаю, был невнимателен. Мне расчет маржи как-то всегда был за ненадобностью. Тем более - в индикаторах. Где это может быть нужно в индикаторах?

 

Думаю, решение очень простое. Освобожусь - придумаю. 

 
Vitaly Muzichenko:

Можно получить, но если рассчитываем по AUDCAD, то залог получим в валюте AUD, а счёт то долларовый. Если подставить цену AUDUSD, то получим нужный размер маржи, но это не универсально и паскудно, потому, что есть счета с префиксами и суффиксами, и тут начинается целая история. Так-же может просто не быть открытой пары в обзоре рынка, и расчёт накроется "медным тазом"

А что вернет четверка, если AUDUSD нет в обзоре рынка?

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

 
Andrey Khatimlianskii:

А что вернет четверка, если AUDUSD нет в обзоре рынка?

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

Четвёрка вернёт "MODE_MARGINREQUIRED" )

 

Alexey Volchanskiy:
Разрабы считают, что вычисление маржи (и кое-что еще из инф. функций) - это торговая функция и в индикаторах должна быть запрещена. Я заводил серьезную ветку на эту тему - модераторы ее мгновенно порезали, как всегда, анонимно. Теперь мне на это плевать, выложил в КБ кастрированный индикатор без маржи.

Правда торговая? ))) Хотя да, отжигать не запрещено. Интересно чем она торгует, открывает или закрывает, или просто модифицирует ордера?

 

fxsaber:

Признаю, был невнимателен. Мне расчет маржи как-то всегда был за ненадобностью. Тем более - в индикаторах. Где это может быть нужно в индикаторах?

Думаю, решение очень простое. Освобожусь - придумаю. 

Кроме МА и стохастика, есть ещё информационные индикаторы. Не все торгуют ботами, к примеру нужно с информационного индикатора узнать залог перед совершением сделки (соблюсти ММ), высчитать лот и посмотреть, подходит ли он по условиям к вашей ТС, или всё-же не входить в сделку и подождать другой сигнал. И это всего единичный пример использования.

 
fxsaber:

Думаю, решение очень простое. Освобожусь - придумаю.

Решение пришло сразу.
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
  MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick) ? Tick.ask * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) /
        (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
Это расчет для FOREX. Остальное - по аналогии.
 
fxsaber:
Решение пришло сразу.
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
  MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick) ? Tick.ask * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) * SymbolInfoDouble(Symb, SYMBOL_TRADE_CONTRACT_SIZE) *
         SymbolInfoDouble(Symb, SYMBOL_POINT) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
Это расчет для FOREX. Остальное - по аналогии.
Спасибо большое, остался баг с йеновыми парами
 
Vitaly Muzichenko:
Спасибо большое, остался баг с йеновыми парами
Да, перемудрил немного. Теперь все правильно.
Причина обращения: