double AccountMargin( )
Возвращает сумму залоговых средств, используемых для поддержания открытых позиций на текущем счете.
Пример:
Print("Сумма залоговых средств = ", AccountMargin());
Залог ссервака идёт... у каждого ДЦ свой.
double AccountFreeMarginCheck( string symbol, int cmd, double volume)
Возвращает размер свободных средств, которые останутся после открытия указанной позиции по текущей цене на текущем счете. Если свободных средств не хватает, то будет сгенерирована ошибка 134 (ERR_NOT_ENOUGH_MONEY).
Параметры:symbol - Наименование финансового инструмента, с которым должна проводиться торговая операция.
cmd - Торговая операция. Может быть либо OP_BUY, либо OP_SELL.
volume - Количество лотов.
Пример:
if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)<=0 || GetLastError()==134) return;
Ну тут то всё понятно...
Читали ... тоже умные, но вот беда как реализовать то что описано тут.... https://forum.mql4.com/ru/5014
AccountMargin() - Возвращает сумму залоговых средств, используемых для поддержания открытых позиций на текущем счете.
А нужно для конкретной пары что-бы возвращалось значение. А вернуть мы можем зная формулу расчёта.
Напишите формулу....
Если Дц устанавливает свой залог для каждой пары, то залог значит можно запросить с сервера и получив ответ в виде значения подставить в формулу. А формулки то нету опять таки.
Есть функция:
Параметры:
Пример: if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)<=0 || GetLastError()==134) return; |
В этой функции есть параметры валюты, опреции и объём, но цена то опять возвращается для всего счета.
Цель разделив начальный депозит на равное количество поддепозитов и каждому эксперту на счете выделить поддепозит.
Грубо говоря нужно что-бы выбор динамического лота был не для всего счета, а подсчета выделенного эксперту, так же нужно учитывать убыток или прирост к этому поддепозиту и от этого плясать.
Как это сделать если незнаешь формулу расчёта AccountMargin()
И опять разработчики молчат.
Rosh, Renat ответьте пожалуйста. Хотя бы на вопрос возможно ли реализовать задуманное.
В программировании ничего невозможного нет! :-)
У тебя есть:
цены на все валюты - MarketInfo
плечо - AccountLeverage
количество лотов.
Подсчитать сколько сделка отхватит маржи - ерунда.
Труднее, конечно, разделить оставшиеся средства по выделенным экспертам, т.к. только одному богу известно сколько их у тебя и какие у тебя планы в отношении каждого эксперта. Ну ладно, начнем с двух. Объявляем два массива дабл и отправляем в каждый по половине свободных средств. И начинаем сопровождать. Т.е отслеживать, как только открылся ордер по одной валюте, сняли часть из массива, закрылся ордер - проверили на какой валюте и добавили в массив.
А заниматься извратом (выдумывать специально для тебя никому кроме тебя ненужную функцию) я думаю, разработчики не станут.
Но, может я и ошибаюсь.:-)
Наверно MarketInfo(Символ,MODE_MARGINMAINTENANCE)*СуммуЛотовПоСимволу
Еще есть MODE_MARGINHEDGED, надо экспериментировать
//<method 21>
int air.Ticker.Compute.1
(//<0>
){//<28>
if ( ( MarketInfo ( avs.Ticker.Symbol , MODE_PROFITCALCMODE ) == ac.Forex )
&& ( MarketInfo ( avs.Ticker.Symbol , MODE_MARGINCALCMODE ) == ac.Forex )
&& ( StringLen ( avs.Ticker.Symbol ) == 6 ) && ( StringFind ( avs.Ticker.Symbol , "#" ) == -1 )
&& ( StringFind ( avs.Ticker.Symbol , "@" ) == -1 ) && ( StringFind ( avs.Ticker.Symbol , "_" ) == -1 ) )
{ avs.Ticker.QuoteBase = StringSubstr ( avs.Ticker.Symbol , 0 , 3 ) ;
avs.Ticker.QuoteValue = StringSubstr ( avs.Ticker.Symbol , 3 , 3 ) ; }
else { avs.Ticker.QuoteBase = avs.Ticker.Symbol ;
avs.Ticker.QuoteValue = AccountCurrency () ; }
if ( AccountCurrency () == avs.Ticker.QuoteValue )
{ avs.Ticker.ConversionBase = avs.Ticker.QuoteBase ;
avi.Ticker.Conversion = ac.Direct ; }
else if ( AccountCurrency () == avs.Ticker.QuoteBase )
{ avs.Ticker.ConversionBase = avs.Ticker.QuoteValue ;
avi.Ticker.Conversion = ac.Inverse ; }
else { avs.Ticker.ConversionBase = avs.Ticker.QuoteBase ;
avs.Ticker.ConversionSymbol = StringConcatenate ( avs.Ticker.QuoteBase , AccountCurrency () ) ;
if ( MarketInfo ( avs.Ticker.ConversionSymbol , MODE_MARGINREQUIRED ) > 0 )
avi.Ticker.Conversion = ac.DirectCross ;
else { avs.Ticker.ConversionSymbol = StringConcatenate ( AccountCurrency () , avs.Ticker.QuoteBase ) ;
if ( MarketInfo ( avs.Ticker.ConversionSymbol , MODE_MARGINREQUIRED ) > 0 )
avi.Ticker.Conversion = ac.InverseCross ;
else avi.Ticker.Conversion = ac.Invalid ; } }
avs.Ticker.ConversionName = ais.Core.Conversion ( avi.Ticker.Conversion ) ;
}//</method 21>
//<method 22>
int air.Ticker.Compute.2
(//<0>
){//<31>
avd.Ticker.QuoteAsk = MarketInfo ( avs.Ticker.Symbol , MODE_ASK ) ;
avd.Ticker.QuoteBid = MarketInfo ( avs.Ticker.Symbol , MODE_BID ) ;
avd.Ticker.QuoteTick = MarketInfo ( avs.Ticker.Symbol , MODE_TICKSIZE ) ;
avd.Ticker.QuotePoint = MarketInfo ( avs.Ticker.Symbol , MODE_POINT ) ;
avi.Ticker.Spread = MarketInfo ( avs.Ticker.Symbol , MODE_SPREAD ) ;
avi.Ticker.Stops = MarketInfo ( avs.Ticker.Symbol , MODE_STOPLEVEL ) ;
avd.Ticker.MaximumLots = MarketInfo ( avs.Ticker.Symbol , MODE_MAXLOT ) ;
avd.Ticker.MinimumLots = MarketInfo ( avs.Ticker.Symbol , MODE_MINLOT ) ;
avd.Ticker.LotStep = MarketInfo ( avs.Ticker.Symbol , MODE_LOTSTEP ) ;
avd.Ticker.NominalLot = MarketInfo ( avs.Ticker.Symbol , MODE_LOTSIZE ) ;
avd.Ticker.NominalTick = MarketInfo ( avs.Ticker.Symbol , MODE_TICKVALUE ) ;
avd.Ticker.NominalMargin = MarketInfo ( avs.Ticker.Symbol , MODE_MARGINREQUIRED ) ;
avi.Ticker.QuoteDigits = MarketInfo ( avs.Ticker.Symbol , MODE_DIGITS ) ;
avi.Ticker.SymbolState = MarketInfo ( avs.Ticker.Symbol , MODE_TRADEALLOWED ) ;
avi.Ticker.SymbolPermit = ! aib.Core.PortIsExist ( StringConcatenate ( ac.ExclusionName , avs.Ticker.Symbol ) ) ;
avi.Ticker.Latency = TimeCurrent () - MarketInfo ( avs.Ticker.Symbol , MODE_TIME ) ;
avd.Ticker.NominalLeverage = AccountLeverage () ;
if ( ( avd.Ticker.QuoteAsk == 0 )
|| ( avd.Ticker.QuoteBid == 0 )
|| ( avd.Ticker.QuoteTick == 0 )
|| ( avd.Ticker.QuotePoint == 0 )
|| ( avd.Ticker.MinimumLots == 0 )
|| ( avd.Ticker.NominalTick == 0 )
|| ( avd.Ticker.NominalMargin == 0 )
|| ( avi.Ticker.Conversion == 4 ) )
{ avi.Ticker.Conversion = ac.Invalid ;
avs.Ticker.ConversionName = ais.Core.Conversion ( avi.Ticker.Conversion ) ;
avb.Ticker.Validity = ! True ; }
else avb.Ticker.Validity = True ;
}//</method 22>
//<method 23>
int air.Ticker.Compute.3
(//<0>
){//<26>
avi.Ticker.Point = 1 ;
avd.Ticker.MaximalMargin = avd.Ticker.NominalMargin * avd.Ticker.MaximumLots ;
avd.Ticker.MinimalMargin = avd.Ticker.NominalMargin * avd.Ticker.MinimumLots ;
avd.Ticker.MinimalTick = avd.Ticker.NominalTick * avd.Ticker.MinimumLots ;
avd.Ticker.MinimalPoint = avd.Ticker.MinimalTick * avd.Ticker.QuotePoint / avd.Ticker.QuoteTick ;
avd.Ticker.MinimalSpread = avi.Ticker.Spread * avd.Ticker.MinimalPoint ;
avd.Ticker.MinimalStops = avi.Ticker.Stops * avd.Ticker.MinimalPoint ;
avi.Ticker.Position = MathRound ( avd.Ticker.MinimalMargin / avd.Ticker.MinimalPoint ) ;
avd.Ticker.QuotePosition = avi.Ticker.Position * avd.Ticker.QuotePoint ;
avd.Ticker.QuoteSpread = avi.Ticker.Spread * avd.Ticker.QuotePoint ;
avd.Ticker.QuoteStops = avi.Ticker.Stops * avd.Ticker.QuotePoint ;
avd.Ticker.RelativeTick = avd.Ticker.QuoteTick / avd.Ticker.QuotePosition ;
avd.Ticker.RelativePoint = avd.Ticker.QuotePoint / avd.Ticker.QuotePosition ;
avd.Ticker.RelativeSpread = avd.Ticker.QuoteSpread / avd.Ticker.QuotePosition ;
avd.Ticker.RelativeStops = avd.Ticker.QuoteStops / avd.Ticker.QuotePosition ;
avd.Ticker.MarginLimit = aid.Core.ReadEquityPort ( ac.LimitMargin ) ;
avd.Ticker.MarginReserve = - aid.Core.ReadPort ( ac.LimitReserve ) * avd.Ticker.MarginLimit ;
avd.Ticker.VARLimit = avd.Ticker.MarginReserve / 2 ; // For Testing Purpose Only
}//</method 23>
//<method 24>
int air.Ticker.Compute.4
(//<0>
){//<24>
if ( avi.Ticker.Conversion == ac.Direct )
{ avi.Ticker.ConversionDigits = avi.Ticker.QuoteDigits ;
avd.Ticker.ConversionAsk = avd.Ticker.QuoteAsk ;
avd.Ticker.ConversionBid = avd.Ticker.QuoteBid ;
avd.Ticker.RealLeverage = avd.Ticker.QuoteAsk * avd.Ticker.NominalLot / avd.Ticker.NominalMargin ; }
else if ( avi.Ticker.Conversion == ac.DirectCross )
{ avi.Ticker.ConversionDigits = MarketInfo ( avs.Ticker.ConversionSymbol , MODE_DIGITS ) ;
avd.Ticker.ConversionAsk = MarketInfo ( avs.Ticker.ConversionSymbol , MODE_ASK ) ;
avd.Ticker.ConversionBid = MarketInfo ( avs.Ticker.ConversionSymbol , MODE_BID ) ;
avd.Ticker.RealLeverage = ( avd.Ticker.ConversionAsk + avd.Ticker.ConversionBid ) / 2
* avd.Ticker.NominalLot / avd.Ticker.NominalMargin ; }
else if ( avi.Ticker.Conversion == ac.Inverse )
{ avi.Ticker.ConversionDigits = 8 - avi.Ticker.QuoteDigits ;
avd.Ticker.ConversionAsk = 1.0 / avd.Ticker.QuoteBid ;
avd.Ticker.ConversionBid = 1.0 / avd.Ticker.QuoteAsk ;
avd.Ticker.RealLeverage = avd.Ticker.NominalLot / avd.Ticker.NominalMargin ; }
else { avi.Ticker.ConversionDigits = 8 - MarketInfo ( avs.Ticker.ConversionSymbol , MODE_DIGITS ) ;
avd.Ticker.ConversionAsk = 1.0 / MarketInfo ( avs.Ticker.ConversionSymbol , MODE_BID ) ;
avd.Ticker.ConversionBid = 1.0 / MarketInfo ( avs.Ticker.ConversionSymbol , MODE_ASK ) ;
avd.Ticker.RealLeverage = ( avd.Ticker.ConversionAsk + avd.Ticker.ConversionBid ) / 2
* avd.Ticker.NominalLot / avd.Ticker.NominalMargin ; }
}//</method 24>
Пояснение. Данный код предназначен для проверки "AccountLeverage ()"
Пример:
Расчетная стоимость стандартного контракта = AccountLeverage () * avd.Ticker.NominalMargin
Действительная стоимость стандартного контракта = avd.Ticker.RealLeverage * avd.Ticker.NominalMargin
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствую всех. Потратил 2 часа на поиски, перечитал кучу веток на форуме, так и не нашел ответ на следующие вопросы.
1. Формула расчета AccountMargin()
2. Формула расчета AccountFreeMarginCheck()
Как правило если такой вопрос возникает, фурумчани ответа не знают, а разработчики молчат. Как быть?