1000 вопросов, а ответов разработчики не дают. Почему?

 

Приветствую всех. Потратил 2 часа на поиски, перечитал кучу веток на форуме, так и не нашел ответ на следующие вопросы.


1. Формула расчета AccountMargin()

2. Формула расчета AccountFreeMarginCheck()


Как правило если такой вопрос возникает, фурумчани ответа не знают, а разработчики молчат. Как быть?

 

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;

Ну тут то всё понятно... 

 
BARS >>:

double AccountMargin( )

Ну тут то всё понятно...

Читали ... тоже умные, но вот беда как реализовать то что описано тут.... https://forum.mql4.com/ru/5014


AccountMargin() - Возвращает сумму залоговых средств, используемых для поддержания открытых позиций на текущем счете.


А нужно для конкретной пары что-бы возвращалось значение. А вернуть мы можем зная формулу расчёта.


Напишите формулу....

 
BARS >>:
ДЦ сам устанавливает свой залог конкретно и для каждой пары...

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

Есть функция:

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;

В этой функции есть параметры валюты, опреции и объём, но цена то опять возвращается для всего счета.


Цель разделив начальный депозит на равное количество поддепозитов и каждому эксперту на счете выделить поддепозит.

Грубо говоря нужно что-бы выбор динамического лота был не для всего счета, а подсчета выделенного эксперту, так же нужно учитывать убыток или прирост к этому поддепозиту и от этого плясать.


Как это сделать если незнаешь формулу расчёта AccountMargin()

 

И опять разработчики молчат.

Rosh, Renat ответьте пожалуйста. Хотя бы на вопрос возможно ли реализовать задуманное.

 

В программировании ничего невозможного нет! :-)

У тебя есть:

цены на все валюты - MarketInfo

плечо - AccountLeverage

количество лотов.

Подсчитать сколько сделка отхватит маржи - ерунда.

Труднее, конечно, разделить оставшиеся средства по выделенным экспертам, т.к. только одному богу известно сколько их у тебя и какие у тебя планы в отношении каждого эксперта. Ну ладно, начнем с двух. Объявляем два массива дабл и отправляем в каждый по половине свободных средств. И начинаем сопровождать. Т.е отслеживать, как только открылся ордер по одной валюте, сняли часть из массива, закрылся ордер - проверили на какой валюте и добавили в массив.

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

Но, может я и ошибаюсь.:-)

 

Наверно MarketInfo(Символ,MODE_MARGINMAINTENANCE)*СуммуЛотовПоСимволу

Еще есть MODE_MARGINHEDGED, надо экспериментировать

 
Модуль AD3.MQ4:


//<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

 
Ais, это что за язык такой?
 
MQL4
Причина обращения: