Как подсчитать размер лота исходя из размера риска

 

Пытаюсь подсчитать реальный размер риска и соответственно лота, для валют получается вроде, а для CFD такой скрипт не подходит

где, что я упустил ? :

points - расстояние в пунктах от входа до стопа, т.е. риск в пунктах
rick_1_pose - риск в $ на 1 минимальный лот
allowed_risk - заданный риск в долларах, который высчитывается как процент от депозита


if (direction == OP_BUY)
   {
      double points = (price - sl )*MathPow(10, Digits()) + MarketInfo(Symbol(),MODE_SPREAD) *2; // points
      double rick_1_pose = (points * (Point * AccountInfoInteger(ACCOUNT_LEVERAGE)));// usd 
      double allowed_risk = AccountBalance( ) / 100 * risk_percent; // usd
      lots = MathRound(allowed_risk / rick_1_pose) * MarketInfo(Symbol(),MODE_MINLOT);

please help )

 
andrey egorov:

Пытаюсь подсчитать реальный размер риска и соответственно лота, для валют получается вроде, а для CFD такой скрипт не подходит

где, что я упустил ? :

please help )

Под МТ4 пишете? Переделайте Point на Point() , это устаревшая переменная, как и Digits дает странные результаты, сам на это натыкался после выпуска 600-й версии МТ4

 
ACCOUNT_LEVERAGE - это плечо по умлочанию для счета целиком, однако у каждого символа может быть специфическое плечо по торговому контракту. В частности у CFD - другое плечо. Вот ссылка на какой-то файл с функцией определения плеча по символу (сам не проверял) - http://forum.mql4.com/20319#432856.
Live account Leverage - MQL4 forum
  • www.mql5.com
Live account Leverage - MQL4 forum
 

Я так считал.

double Stop_points=40; //SL
double Lot_perc_by_stop=4; //risk%
/////////////////////////////////////////////////////////

double perc_lot_by_stop_f(double Stop_points,double Lot_perc_by_stop)

{

double lose_on_stop_lose=Stop_points*(MarketInfo(Symbol(),MODE_TICKVALUE)/100);

double propotion=(AccountBalance()/100*Lot_perc_by_stop)/lose_on_stop_lose;

double Loto_=MarketInfo(Symbol(),MODE_MINLOT)*propotion;

if(Loto_>MarketInfo(Symbol(),MODE_MAXLOT)) Loto_=MarketInfo(Symbol(),MODE_MAXLOT);
if(Loto_<MarketInfo(Symbol(),MODE_MINLOT)) Loto_=MarketInfo(Symbol(),MODE_MINLOT);


return(Loto_);

}
 
Vasyl Nosal:

Я так считал.

Спасибо,

скажите, а какую роль при этом играет "/100" - это плечо или еще что-то

или плечо не учитывается ?

 
andrey egorov:

Спасибо,

скажите, а какую роль при этом играет "/100" - это плечо или еще что-то

или плечо не учитывается ?

Честно,я завтыкал. Это функция расчёта лота в зависимости от СЛ.

/100 это  /100%

 
Vasyl Nosal:

Честно,я завтыкал. Это функция расчёта лота в зависимости от СЛ.

/100 это  /100%

я имел ввиду в строке

double lose_on_stop_lose=Stop_points*(MarketInfo(Symbol(),MODE_TICKVALUE)/100);
 
andrey egorov:

я имел ввиду в строке

А. Это перевод в центы.
 

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

Действие  краткое описание Значение
1 риск в points 173
2 USD / point 0,01
3 размер лота акций 100
4 риск в points за целый лот 17300
5 риск usd за целый лот 173
6 мин лот 0,01
7 риск  в usd за мин лот 1,73
8 мин плечо 10
9 usd за мин лот с плечом 17,3
10 usd депозит 10000
11 риск % за сделку 1
12 риск usd 100
13 минимальных лотов 5,78
14 Указать в OrderSend 0,06
Файлы:
 
Alexey Volchanskiy:

Под МТ4 пишете? Переделайте Point на Point() , это устаревшая переменная, как и Digits дает странные результаты, сам на это натыкался после выпуска 600-й версии МТ4

Спасибо, переделаю
 
andrey egorov:

...

или плечо не учитывается ?

Зачем плечо учитывать?
Причина обращения: