Помогите с расчетом объема

 
Салют!

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

double lot(double sl, double openPrice) {
   if(!AutoLot) return Lot;
   else {
      double _lot=0,
             balance           = AccountInfoDouble(ACCOUNT_BALANCE),
             freeMargin        = AccountInfoDouble(ACCOUNT_MARGIN_FREE),
             currLoad          = 100-(freeMargin*100/balance);
      if(currLoad>DepoLoading) {
         Print("Current load > DepoLoading");
         return 0;

      }
      double tickMoneyValue          = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_LOSS),
             oneLotMarginSize        = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL),
             tickSize          = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE),
             moneyRiskPerPosition = freeMargin*RiskPerPosition*0.01,
             stopSize          = MathAbs(openPrice-sl)/tickSize;
      if(RoundingLots)
         _lot              = MathRound(moneyRiskPerPosition/(tickMoneyValue*stopSize));
      else
         _lot              = moneyRiskPerPosition/(tickMoneyValue*stopSize);

      if(_lot*oneLotMarginSize>freeMargin) {
         PrintFormat("Lot(%f)*oneLotMarginSize > freeMargin", _lot);
         _lot =  MathFloor(freeMargin/oneLotMarginSize);
      }
      if(_lot<SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE)) _lot=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);

      Print("Lot: ", _lot);
      PrintFormat("Margin per position: %f \nTick size: %f \nTick value: %f \nMax lot: %f \nMin contract size: %f",
                  oneLotMarginSize,
                  tickSize,
                  tickMoneyValue,
                  freeMargin/oneLotMarginSize,
                  SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE));

      return _lot;
   }
}

В конце выводит выбранный лот, затем параметры счета:

2020.08.14 13:10:30.025 2020.08.04 10:00:02   Margin per position: 23294.000000 
2020.08.14 13:10:30.025 2020.08.04 10:00:02   Tick size: 10.000000 
2020.08.14 13:10:30.025 2020.08.04 10:00:02   Tick value: 14.735440 
2020.08.14 13:10:30.025 2020.08.04 10:00:02   Max lot: 4.292951 
2020.08.14 13:10:30.025 2020.08.04 10:00:02   Min contract size: 1.000000

Почему-то не хочет входить даже 3 лотом, хотя, согласно SYMBOL_MARGIN_INITIAL, максимальный лот равен 4.29 (для 100 000 баланса):

2020.08.14 13:10:30.025 2020.08.04 10:00:02   Max lot: 4.292951 (freeMargin/oneLotMarginSize)

Пишет ошибки:

2020.08.14 13:10:30.025 2020.08.04 10:00:02   current account state: Balance: 100000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 100000.00, Margin: 0.00, FreeMargin: 100000.00
2020.08.14 13:10:30.025 2020.08.04 10:00:02   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 100000.00, Margin: 104946.45, FreeMargin: -4946.45
2020.08.14 13:10:30.025 2020.08.04 10:00:02   not enough money [exchange buy 3 RTS-9.20 at 125950 sl: 125450 tp: 129950]
2020.08.14 13:10:30.025 2020.08.04 10:00:02   failed exchange buy 3 RTS-9.20 at 125950 sl: 125450 tp: 129950 [No money]
2020.08.14 13:10:30.025 2020.08.04 10:00:02   OrderSend error 4756

То есть, считает , что на лот нужно 34 982.15 !  Где это значение откопать? Пробовал заместо SYMBOL_MARGIN_INITIAL использовать SYMBOL_MARGIN_MAINTENANCE, но все равно что-то не идет. Подскажите как корректно это сделать.

 

Вход по рынку, умножайте ГО на 1,50 (грубо).

Точную формулу расчета можно посмотреть в материалах биржи:  https://fs.moex.com/files/4904

 
Dmi3:

Вход по рынку, умножайте ГО на 1,50 (грубо).

Точную формулу расчета можно посмотреть в материалах биржи:  https://fs.moex.com/files/4904

Из терминала это никак не вытащить?

 
Yevhenii Levchenko:

Из терминала это никак не вытащить?

Терминал вам дает все необходимые цифры для точного расчета необходимого ГО. Только смысла в этом нет, торгуйте лимитками, вот правильный ответ на ваш вопрос.

 

Здесь выкладывал скрипт (пример),

потренируйтесь, возможно поможет.

А вообще на форуме много чего интересного, только надо поискать)

Какой реальный процент ГО доступен для лимиток (Si, RTS)?
Какой реальный процент ГО доступен для лимиток (Si, RTS)?
  • 2016.11.16
  • www.mql5.com
Добрый день, уважаемые форумчане...
 
Sergey Chalyshev:

Здесь выкладывал скрипт (пример),

потренируйтесь, возможно поможет.

А вообще на форуме много чего интересного, только надо поискать)

Спасибо, Сергей! Там есть очень хорошее решение :)

OrderCalcMargin имею в виду...

Причина обращения: