Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
да, постоянно, и при чем тут загрузка?
И еще один момент: в функции "volume" параметр "sl" относится к типу double, но в примере Вы передали в функцию тип int. Так какой, все-таки, тип должен иметь параметр "sl"?
При том, что после убыточной сделки баланс уменьшается ровно на количество процентов загрузки депозита, а не на 1 процент.
И еще один момент: в функции "volume" параметр "sl" относится к типу double, но в примере Вы передали в функцию тип int. Так какой, все-таки, тип должен иметь параметр "sl"?
приведите пример что функция считает не правильною, у меня всегда убыток составляет один процент, если ставлю 1%.Там поисходит неявное преобразование к типу double вам компилятор должен выдать предупреждение об этом, но это не является ошибкой. Можете явно преобразовать например так
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
приведите пример что функция считает не правильною, у меня всегда убыток составляет один процент, если ставлю 1%.Там поисходит неявное преобразование к типу double вам компилятор должен выдать предупреждение об этом, но это не является ошибкой. Можете явно преобразовать например так
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
Я, конечно, могу возвращать пятую часть лота, расчитанного функцией, но хочется понять, почему она неправильно расчитывает лот.
приведите пример из отчета сделок где она рассчитывает не правильно, я привел как видели у меня она рассчитывает правильно
стоп лосс сколько пунктов ставите.
стоп лосс сколько пунктов ставите.
Кажется, я понимаю к чему этот вопрос)
запустите этот скрипт у себя на счете и посмотрите в журнале что печатает.
//| 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 |
//| 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));
}
//+------------------------------------------------------------------+