Скачать MetaTrader 5

Размер лота от депозита

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
reposlav
31
reposlav  

Всем привет!

Пытаюсь рассчитать размер лота в зависимости от размера депозита.

Получается что-то подобное:

double relativeSl = MathAbs(currentPrice - stopLoss);
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); // размер пункта
double equity = AccountInfoDouble(ACCOUNT_EQUITY); // текущий депозит
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); // стоимость пункта
double risk = 0.04; // риск на сделку в процентах
double volume = NormalizeDouble((equity  * point) / (relativeSl * (1 / risk) * tickValue), 2);

Все правильно высчитывается на форексе, но на металлах (XAUUSD, XAGUSD) риск увеличивается в 10 раз. Если я установил риск в 4%, то на металлах он будет 40%. Что я не учел?

Nikolay Gaylis
6905
Nikolay Gaylis  
reposlav:

Всем привет!

Пытаюсь рассчитать размер лота в зависимости от размера депозита.

Получается что-то подобное:

Все правильно высчитывается на форексе, но на металлах (XAUUSD, XAGUSD) риск увеличивается в 10 раз. Если я установил риск в 4%, то на металлах он будет 40%. Что я не учел?


У меня так

Lot=NormalizeDouble((AccountInfoDouble(ACCOUNT_BALANCE)/100000)*LotSize,2);
Только не от депозита,а от текущего баланса
Aleksey Semenov
5192
Aleksey Semenov  
Nikolay Gaylis:

У меня так

Только не от депозита,а от текущего баланса
чтож вы плохому то людей учите, стоимость лота на каждом символе разная, надо ж по человечески вычислять, автор - тут где-то правильная формула валялась, можно поискать или погуглить
George Merts
5234
George Merts  

Между прочим, у меня тоже на металлах подобная фигня была. Я так и не нашел, в чем проблема.

Alekseu Fedotov
1174
Alekseu Fedotov  

Предлагаю такую штуку   10% от депо


(balanc*0.1)*leverage)/(close*lotsize)


по именам переменных можно понять

откуда какие значения вытаскивать

close = iClose(NULL,0,0);

Alexander_K2
809
Alexander_K2  

Примеры:

Для пары AUDCAD 

         Balance=AccountBalance();

         double VAsk=MarketInfo("AUDUSD.I",MODE_ASK);

         Lots=NormalizeDouble((Balance/(VAsk*10.0))*0.01,2);

Для пары AUDUSD

         Balance=AccountBalance();

         Lots=NormalizeDouble((Balance/(Ask*10.0))*0.01,2);

Для пары CADJPY

         Balance=AccountBalance();

         double VAsk=1/MarketInfo("USDCAD.I",MODE_ASK);

         Lots=NormalizeDouble((Balance/(VAsk*10.0))*0.01,2);

Удачи!


Nikolay Gaylis
6905
Nikolay Gaylis  
Aleksey Semenov:
чтож вы плохому то людей учите, стоимость лота на каждом символе разная, надо ж по человечески вычислять, автор - тут где-то правильная формула валялась, можно поискать или погуглить

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

LotSize

тоже на каждом символе разный

Оптимизация уже покажет какой процент от баланса использовать безопаснее...

Олег avtomat
6422
Олег avtomat  
это МТ4

double  все эти переменные; 

      part=GlobalVariableGet("part");

      Balance=AccountBalance();
 
      minLot=MarketInfo(instrument,MODE_MINLOT);
      stpLot=MarketInfo(instrument,MODE_LOTSTEP);
      maxLot=MarketInfo(instrument,MODE_MAXLOT);

      MarginSize=MarketInfo(instrument,MODE_MARGINREQUIRED);

      workLotsB=(Balance/MarginSize)*part;
      if( workLotsB<minLot )   LotsB=NormalizeDouble(minLot,2); else
      if( workLotsB>maxLot )   LotsB=NormalizeDouble(maxLot,2); else
                               LotsB=NormalizeDouble(workLotsB,2);

Alexey Viktorov
20923
Alexey Viktorov  
reposlav:

Всем привет!

Пытаюсь рассчитать размер лота в зависимости от размера депозита.

Получается что-то подобное:

Все правильно высчитывается на форексе, но на металлах (XAUUSD, XAGUSD) риск увеличивается в 10 раз. Если я установил риск в 4%, то на металлах он будет 40%. Что я не учел?

Вот это

double risk = 0.04; // риск на сделку в процентах

риск не в процентах. Это больше похоже на подгонку ответа в этой строке

double volume = NormalizeDouble((equity  * point) / (relativeSl * (1 / risk) * tickValue), 2); // 1/risk = 25

также не понятно для чего. Этот risk надо использовать для определения какой суммой решено рискнуть. В результате формула будет выглядеть так

double volume = NormalizeDouble((equity * risk * point) / (relativeSl * tickValue), 2);
reposlav
31
reposlav  
Alexey Viktorov:

Вот это

риск не в процентах. Это больше похоже на подгонку ответа в этой строке

также не понятно для чего. Этот risk надо использовать для определения какой суммой решено рискнуть. В результате формула будет выглядеть так


Ваша формула - то же самое, что и моя. Умножить на 0.04 и делить на 25(1/0.04) - это одно и то же) Хотя ваш вариант лучше хотя бы потому, что операция деления дороже, чем операция умножения.

Aleksey Semenov:
чтож вы плохому то людей учите, стоимость лота на каждом символе разная, надо ж по человечески вычислять, автор - тут где-то правильная формула валялась, можно поискать или погуглить

Гуглил, но, к сожалению, ничего путного не нашел. В некоторых формулах используют tick size, но как его сюда всунуть - без понятия.

В общем, проблема не в самом расчете объема сделки, а в вычислении стоимости пипса в валюте депозита. Как раз стоимость пипса вычисляется для металлов неверно.

Vladimir Zubov
6919
Vladimir Zubov  

У меня такая функция была, ещё под MQL4 но это не важно, задаётся размер стоп лосс и риск который получим при стопе, возвращает лот. Работала и работает отлично.

//+------------------------------------------------------------------------+
//+- Расчет лота в зависимости от расстояния до StopLoss (c) BeerGod 2015 -+
//+------------------------------------------------------------------------+
double LotSize(int SL, double MR)// SL-StopLoss MR-MaxRisk
{
   if (SL == 0) return(0); // исключение деления на ноль
   double Free    =AccountBalance();
   double LotVal  =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта 1 лота
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
   double Lot     =MathFloor((Free*MR/100)/(SL*LotVal)/Step)*Step;
   if(Lot<Min_Lot)  Lot=Min_Lot;
   if(Lot>Max_Lot)  Lot=Max_Lot;
   return(Lot);
}
//End
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий