Фиксированный процент от депозита - страница 2

 
Sergey Gritsay:
да, постоянно, и при чем тут загрузка? 
При том, что после убыточной сделки баланс уменьшается ровно на количество процентов загрузки депозита, а не на 1 процент. 
И еще один момент: в функции "volume" параметр  "sl" относится к типу double, но в примере Вы передали в функцию тип int. Так какой, все-таки, тип должен иметь параметр "sl"? 
 
Igor Knyazkov:
При том, что после убыточной сделки баланс уменьшается ровно на количество процентов загрузки депозита, а не на 1 процент. 
И еще один момент: в функции "volume" параметр  "sl" относится к типу double, но в примере Вы передали в функцию тип int. Так какой, все-таки, тип должен иметь параметр "sl"? 

приведите пример что функция считает не правильною, у меня всегда убыток составляет один процент, если ставлю 1%.Там поисходит неявное преобразование к типу double вам компилятор должен выдать предупреждение об этом, но это не является ошибкой. Можете явно преобразовать например так

         if(Risk!=0.0)Volume=volume(_Symbol,Risk,(double)StopLoss);
         else Volume=NormalizeVolume(_Symbol,Lot);

 Вот пример из отчета, стартовый баланс 100000 . В комментарии сделки указан расчетный стоплосс и объем сделки. Как видите убыток всегда составляет около 1%. неточность думаю обусловлена спредом при закрытии.

 

Сделки
Время   Сделка  Символ  Тип     Направление     Объем   Цена    Ордер   Комиссия        Своп    Прибыль Баланс  Комментарий
2016.12.01 00:00:00     1               balance                                 0.00    0.00    100 000.00      100 000.00      
2016.12.01 16:29:27     2       EURUSD  sell    in      2.72    1.06029 2       0.00    0.00    0.00    100 000.00      sl = 368.00: volume = 2.72
2016.12.01 20:57:56     3       EURUSD  buy     out     2.72    1.06393 3       0.00    0.00    -990.08 99 009.92       sl 1.06393
2016.12.01 20:57:59     4       EURUSD  buy     in      2.69    1.06401 4       0.00    0.00    0.00    99 009.92       sl = 368.00: volume = 2.69
2016.12.02 06:02:14     5       EURUSD  sell    out     2.69    1.06893 5       0.00    -1.88   1 323.48        100 331.52      tp 1.06893
2016.12.02 12:10:20     6       EURUSD  sell    in      2.76    1.06409 6       0.00    0.00    0.00    100 331.52      sl = 364.00: volume = 2.76
2016.12.02 18:09:28     7       EURUSD  buy     out     2.76    1.06773 7       0.00    0.00    -1 004.64       99 326.88       sl 1.06771
2016.12.02 18:16:51     8       EURUSD  buy     in      2.73    1.06778 8       0.00    0.00    0.00    99 326.88       sl = 364.00: volume = 2.73
2016.12.05 00:01:18     9       EURUSD  sell    out     2.73    1.06180 9       0.00    -1.91   -1 632.54       97 692.43       sl 1.06407
2016.12.05 13:14:07     10      EURUSD  buy     in      1.47    1.06629 10      0.00    0.00    0.00    97 692.43       sl = 665.00: volume = 1.47
2016.12.05 13:23:35     11      EURUSD  sell    out     1.47    1.07124 11      0.00    0.00    727.65  98 420.08       tp 1.07122
2016.12.06 13:41:53     12      EURUSD  sell    in      3.35    1.07559 12      0.00    0.00    0.00    98 420.08       sl = 294.00: volume = 3.35
2016.12.06 19:03:58     13      EURUSD  buy     out     3.35    1.07055 13      0.00    0.00    1 688.40        100 108.48      tp 1.07055
2016.12.07 12:06:33     14      EURUSD  sell    in      4.88    1.07118 14      0.00    0.00    0.00    100 108.48      sl = 205.00: volume = 4.88
2016.12.07 14:46:39     15      EURUSD  buy     out     4.88    1.07322 15      0.00    0.00    -995.52 99 112.96       sl 1.07322
2016.12.07 14:46:41     16      EURUSD  buy     in      4.83    1.07328 16      0.00    0.00    0.00    99 112.96       sl = 205.00: volume = 4.83
2016.12.08 05:49:12     17      EURUSD  sell    out     4.83    1.07838 17      0.00    -10.14  2 463.30        101 566.12      tp 1.07833
0.00    -13.93  1 580.05        101 566.12      
 
Sergey Gritsay:

приведите пример что функция считает не правильною, у меня всегда убыток составляет один процент, если ставлю 1%.Там поисходит неявное преобразование к типу double вам компилятор должен выдать предупреждение об этом, но это не является ошибкой. Можете явно преобразовать например так

         if(Risk!=0.0)Volume=volume(_Symbol,Risk,(double)StopLoss);
         else Volume=NormalizeVolume(_Symbol,Lot);

 Вот пример из отчета, стартовый баланс 100000 . В комментарии сделки указан расчетный стоплосс и объем сделки. Как видите убыток всегда составляет около 1%. неточность думаю обусловлена спредом при закрытии.

 

Сделки
Время   Сделка  Символ  Тип     Направление     Объем   Цена    Ордер   Комиссия        Своп    Прибыль Баланс  Комментарий
2016.12.01 00:00:00     1               balance                                 0.00    0.00    100 000.00      100 000.00      
2016.12.01 16:29:27     2       EURUSD  sell    in      2.72    1.06029 2       0.00    0.00    0.00    100 000.00      sl = 368.00: volume = 2.72
2016.12.01 20:57:56     3       EURUSD  buy     out     2.72    1.06393 3       0.00    0.00    -990.08 99 009.92       sl 1.06393
2016.12.01 20:57:59     4       EURUSD  buy     in      2.69    1.06401 4       0.00    0.00    0.00    99 009.92       sl = 368.00: volume = 2.69
2016.12.02 06:02:14     5       EURUSD  sell    out     2.69    1.06893 5       0.00    -1.88   1 323.48        100 331.52      tp 1.06893
2016.12.02 12:10:20     6       EURUSD  sell    in      2.76    1.06409 6       0.00    0.00    0.00    100 331.52      sl = 364.00: volume = 2.76
2016.12.02 18:09:28     7       EURUSD  buy     out     2.76    1.06773 7       0.00    0.00    -1 004.64       99 326.88       sl 1.06771
2016.12.02 18:16:51     8       EURUSD  buy     in      2.73    1.06778 8       0.00    0.00    0.00    99 326.88       sl = 364.00: volume = 2.73
2016.12.05 00:01:18     9       EURUSD  sell    out     2.73    1.06180 9       0.00    -1.91   -1 632.54       97 692.43       sl 1.06407
2016.12.05 13:14:07     10      EURUSD  buy     in      1.47    1.06629 10      0.00    0.00    0.00    97 692.43       sl = 665.00: volume = 1.47
2016.12.05 13:23:35     11      EURUSD  sell    out     1.47    1.07124 11      0.00    0.00    727.65  98 420.08       tp 1.07122
2016.12.06 13:41:53     12      EURUSD  sell    in      3.35    1.07559 12      0.00    0.00    0.00    98 420.08       sl = 294.00: volume = 3.35
2016.12.06 19:03:58     13      EURUSD  buy     out     3.35    1.07055 13      0.00    0.00    1 688.40        100 108.48      tp 1.07055
2016.12.07 12:06:33     14      EURUSD  sell    in      4.88    1.07118 14      0.00    0.00    0.00    100 108.48      sl = 205.00: volume = 4.88
2016.12.07 14:46:39     15      EURUSD  buy     out     4.88    1.07322 15      0.00    0.00    -995.52 99 112.96       sl 1.07322
2016.12.07 14:46:41     16      EURUSD  buy     in      4.83    1.07328 16      0.00    0.00    0.00    99 112.96       sl = 205.00: volume = 4.83
2016.12.08 05:49:12     17      EURUSD  sell    out     4.83    1.07838 17      0.00    -10.14  2 463.30        101 566.12      tp 1.07833
0.00    -13.93  1 580.05        101 566.12      
Я, конечно, могу возвращать пятую часть лота, расчитанного  функцией, но хочется понять, почему она неправильно расчитывает лот.
 
Igor Knyazkov:
Я, конечно, могу возвращать пятую часть лота, расчитанного  функцией, но хочется понять, почему она неправильно расчитывает лот.
приведите пример из отчета сделок где она рассчитывает не правильно, я привел как видели у меня она рассчитывает правильно
 
Sergey Gritsay:
приведите пример из отчета сделок где она рассчитывает не правильно, я привел как видели у меня она рассчитывает правильно
 
Igor Knyazkov:
стоп лосс сколько пунктов ставите.
 
Sergey Gritsay:
стоп лосс сколько пунктов ставите.
40 пунктов
 
Sergey Gritsay:
стоп лосс сколько пунктов ставите.
Кажется, я понимаю к чему этот вопрос)
 
Igor Knyazkov:
Кажется, я понимаю к чему этот вопрос)

запустите этот скрипт у себя на счете и посмотрите в журнале что печатает.

//+------------------------------------------------------------------+
//|                                                       test02.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   volume(_Symbol,1.0,100);
  }
//+------------------------------------------------------------------+
double volume(string symbol,double risk,double sl)
  {
   double lot=0.0;
   double procent=0.0;
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   //double balans=0.0;
   double tc = SymbolInfoDouble(symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double tv = SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE_LOSS);
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   double LotStep=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   double balans=AccountInfoDouble(ACCOUNT_BALANCE);

   procent=(balans/100.0)*risk;

   switch((ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(symbol,SYMBOL_TRADE_CALC_MODE))
     {
      case SYMBOL_CALC_MODE_FOREX:
         if(sl!=0 && tv!=0)
           {
            Print("balans = ",balans," :sl = ",sl,": tv = ",tv);
            Print("(sl*tv) =" ,(sl*tv));
            Print("procent =" ,procent);          
            lot=procent/(sl*tv);
            Print("lot=procent/(sl*tv) =" ,lot);
           }
         break;
      case SYMBOL_CALC_MODE_FUTURES:if(sl!=0 && point!=0 && tv!=0 && ts!=0) lot=procent/(sl*point*(tv/ts));break;
      case SYMBOL_CALC_MODE_CFD:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_CFDINDEX:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_CFDLEVERAGE:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_EXCH_STOCKS:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES:if(sl!=0 && point!=0 && tv!=0 && ts!=0) lot=procent/(sl*point*(tv/ts));break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:if(sl!=0 && point!=0 && tv!=0 && ts!=0) lot=procent/(sl*point*(tv/ts));break;
     }
   return(NormalizeVolume(symbol,lot));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NormalizeVolume(string symbol,double lot)
  {
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double volume_step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   int volume_digits=(int)(MathLog(1.0/volume_step)/MathLog(10.0));

   if(lot<MinLot)lot=MinLot;
   if(lot>MaxLot)lot=MaxLot;

   return(NormalizeDouble(lot,volume_digits));
  }
//+------------------------------------------------------------------+
...
Файлы:
test02.mq5  4 kb
 
Sergey Gritsay:

запустите этот скрипт у себя на счете и посмотрите в журнале что печатает.

//+------------------------------------------------------------------+
//|                                                       test02.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   volume(_Symbol,1.0,100);
  }
//+------------------------------------------------------------------+
double volume(string symbol,double risk,double sl)
  {
   double lot=0.0;
   double procent=0.0;
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   //double balans=0.0;
   double tc = SymbolInfoDouble(symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double tv = SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE_LOSS);
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   double LotStep=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   double balans=AccountInfoDouble(ACCOUNT_BALANCE);

   procent=(balans/100.0)*risk;

   switch((ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(symbol,SYMBOL_TRADE_CALC_MODE))
     {
      case SYMBOL_CALC_MODE_FOREX:
         if(sl!=0 && tv!=0)
           {
            Print("balans = ",balans," :sl = ",sl,": tv = ",tv);
            Print("(sl*tv) =" ,(sl*tv));
            Print("procent =" ,procent);          
            lot=procent/(sl*tv);
            Print("lot=procent/(sl*tv) =" ,lot);
           }
         break;
      case SYMBOL_CALC_MODE_FUTURES:if(sl!=0 && point!=0 && tv!=0 && ts!=0) lot=procent/(sl*point*(tv/ts));break;
      case SYMBOL_CALC_MODE_CFD:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_CFDINDEX:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_CFDLEVERAGE:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_EXCH_STOCKS:if(sl!=0 && point!=0 && tc!=0) lot=procent/(sl*point*tc);break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES:if(sl!=0 && point!=0 && tv!=0 && ts!=0) lot=procent/(sl*point*(tv/ts));break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:if(sl!=0 && point!=0 && tv!=0 && ts!=0) lot=procent/(sl*point*(tv/ts));break;
     }
   return(NormalizeVolume(symbol,lot));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NormalizeVolume(string symbol,double lot)
  {
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double volume_step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   int volume_digits=(int)(MathLog(1.0/volume_step)/MathLog(10.0));

   if(lot<MinLot)lot=MinLot;
   if(lot>MaxLot)lot=MaxLot;

   return(NormalizeDouble(lot,volume_digits));
  }
//+------------------------------------------------------------------+
...
Запустить именно как скрипт? У меня демо-счет. Я на нем тестирую. Или вставить этот код в робота?