Как вычислить маржу? - страница 7

 
Janis Ozols:

Мне пришлось написать костыль, на каждом тике проверяющий эквивалентность расчётного значения залоговой маржи фактическому и в случае значительного расхождения незамедлительно закрывающий последний открытый ордер и блокирующий дальнейшие попытки открытия новых. Эта система успешно работала вплоть до 16 июня.

Но в итоге всё закончилось тем, что брокер сгинул вместе с моими деньгами. Его название начиналось на Fort и заканчивалось на FS.

достаточно было отслеживать изменение плеча.
 
Renat Akhtyamov #:

ок

попробуйте теперь так

void OnStart()

{

   double LEVERAGE = NormalizeDouble( MarketInfo("EURUSD",MODE_LOTSIZE)/MarketInfo("USDCHF",MODE_MARGINREQUIRED),0);

   double M = MarketInfo( "USDRUB" ,MODE_LOTSIZE)/ LEVERAGE; // M=CC/ КП

   Print(" М = ",M);

   Print("LEVERAGE = ",LEVERAGE);

   Print("VOL = ",MarketInfo( "USDRUB" ,MODE_LOTSIZE));

}

printf("ACCOUNT_LEVERAGE =  %d",AccountInfoInteger(ACCOUNT_LEVERAGE));

 
Anton Tiukov #:

printf("ACCOUNT_LEVERAGE =  %d",AccountInfoInteger(ACCOUNT_LEVERAGE));

Для крипты, не всегда указывается плечо корретно.

Иногда приходится так:

//+-----------------------------------------------------------------------------+
//|  Описание : Максимальный размер риска в долларах США (для криптовалют)      |
//|             Maximum exposure in USD (for crypto)                            |
//|             За базовую цену берется максимальная цена недельной свечи       |
//|             Для расщета плеча используем текущую актуальную цену            |
//+-----------------------------------------------------------------------------+
int MaximumExposure(string CryptoName)
  {
   int      RoundingStep = 2500; //шаг округления результата, соврадает с DukasCopy
   int      MaxExposure = 0;
   int      W1 = iHighest(CryptoName,PERIOD_W1,MODE_HIGH,2,0); // номер свечи с максимальной недельной ценой
   double   CryptoPriceW1 = iHigh(CryptoName,PERIOD_W1,W1);
   int      StopOut = (int)AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
   double   CurrentMarketPrices = MarketInfo(CryptoName,MODE_BID);
   double   FreeMarginRequired = MarketInfo(CryptoName,MODE_MARGINREQUIRED);

   if(StopOut==0) //исключение деления на ноль, пока не загрузились данные
      StopOut=1;
   if(FreeMarginRequired==0) //исключение деления на ноль, пока не загрузились данные
      FreeMarginRequired=1;

   double   CryptoLeverage = NormalizeDouble((CurrentMarketPrices/FreeMarginRequired),0);
   double   MarginCryptoPriceW1 = (CryptoPriceW1/CryptoLeverage);

   MaxExposure = (int) MathRound((((MarginCryptoPriceW1*StopOut)/100)*CryptoLeverage)*(100/StopOut));
   MaxExposure = (int) MathFloor(MaxExposure/RoundingStep)*RoundingStep; // округляем до шага

   return (int)(MaxExposure);
  }
//--- End ---
//+-----------------------------------------------------------------------------+
//|  Описание : CFD Margin requirements                                         |
//|             CFD значение маржи в процентах                                  |
//|  100/(current market prices/Free margin required to open 1 lot for buying)  |
//+-----------------------------------------------------------------------------+
int CFDMarginRequirements(string CryptoName)
  {
   double   CFDMR = 0;
   double   CMP = MarketInfo(CryptoName,MODE_BID);
   double   FMP = MarketInfo(CryptoName,MODE_MARGINREQUIRED);

   if(FMP==0) //исключение деления на ноль, пока не загрузились данные
      FMP=1;

   CFDMR = NormalizeDouble((100/(CMP/FMP)),0);

   return (int)(CFDMR);
  }
//--- End ---
//+-----------------------------------------------------------------------------+
//|  Описание : CFD Leverage                                                    |
//+-----------------------------------------------------------------------------+
int CFDLeverage(string CryptoName)
  {
   double   CFDLVR = 0;
   double   CMP = MarketInfo(CryptoName,MODE_BID);
   double   FMP = MarketInfo(CryptoName,MODE_MARGINREQUIRED);

   if(FMP==0) //исключение деления на ноль, пока не загрузились данные
      FMP=1;

   CFDLVR = NormalizeDouble((CMP/FMP),0);

   return (int)(CFDLVR);
  }

//--- End ---