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

 

Пытаюсь подсчитать реальный размер риска и соответственно лота, для валют получается вроде, а для 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 )
 

Я так.

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_);

}
 
Mr_Goods:

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

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

please help )

Функция Point () может некорректно рассчитывать значения для экзотических пар
и инструментов не относящихся в валютным парам (к примеру, золото).

Посмотри на сайте любого ДЦ размер 1 лота для своей CFD и подставь вместо Point().

Для EUR/USD=100000, а для Bitcoin=1.
 
flatON:

спасибо
 

flatON:

Функция Point () может некорректно рассчитывать значения для экзотических пар
и инструментов не относящихся в валютным парам (к примеру, золото).

Посмотри на сайте любого ДЦ размер 1 лота для своей CFD и подставь вместо Point().

Для EUR/USD=100000, а для Bitcoin=1.

Ах, какая не хорошая функция... :(

А если серьёзно, то чтобы вы её вольно или невольно не забижали, всё же уточню попутно, не вдаваясь в расчёты по коду выше:

В отрывке кода от автора темы не функция Point(), а предопределённая переменная Point:

...  
double rick_1_pose = (points * (Point * AccountInfoInteger(ACCOUNT_LEVERAGE)));// usd
...

Предопределённые переменые Point и _Point, а так же функция Point() - идентичны по выводимым ими значениям (т.е., выводят одинаковые значения).

Тестовый скрипт:

#property version   "1.00"
#property strict
#define TEST_PRINT_THREE(x,y,z)         Print(__LINE__,", ",__FUNCTION__,\
                                        ", ",(#x)," = ",(x),", ",(#y)," = ",(y),\
                                        ", ",(#z)," = ",(z))
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int dig=Digits();
//---
   TEST_PRINT_THREE(DoubleToString(Point,dig),//переменная: Справочник MQL4  / Предопределенные переменные / Point 
                    DoubleToString(_Point,dig),//переменная с deprecated статусом: Справочник MQL4  / Предопределенные переменные / _Point 
                    DoubleToString(Point(),dig));//функция: Справочник MQL4  / Проверка состояния / Point 
  }
//+------------------------------------------------------------------+

Работа этого тестового скрипта на графике GOLD, H1 - золото (скрин вывода им записи во вкладку торгового терминала "Эксперты"):


Файлы:
 

P./S.: Т.е., выводимые тестовым скриптом через переменные и функцию размеры пункта равны между собой и соответствуют графику:


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