Функция усреднения Помогите доработать

AlexeNP

Гуру форума
Вот этот вариан с выбором мне очень нравится.
при фикс лоте 0 есть шаг усреднения,но опять же нет увеличения лота
при проценте от депозита 1 появился шаг усреднения,но нет так же увеличения лота
сейчас разберемся потихоньку)
добавим несколько глобальных переменных
и будет все у нас выглядеть примерно так

input double Lot=0;
input uchar MoneyManagment=0,//0 - фикс. 1 - процент 2 - усреднение
KLot=1,
RiskPercent=10;
double _Lot,k_lot,risk_percent;

внутри функции OnInit()
определим значения
_Lot=MathMax(Lot,SymbolInfoDouble(NULL,SYMBOL_VOLUME_MIN));
risk_percent=MathMin(MathMax(1,RiskPercent),50)/100;
k_lot=MathMax(1,(int)(_Lot/SymbolInfoDouble(NULL,SYMBOL_VOLUME_STEP)))*SymbolInfoDouble(NULL,SYMBOL_VOLUME_STEP);

то есть - лот не ниже минимального, процент риска 1 - 50 (можно и поменять), ну и шаг усреднения лота раситываем в зависимости от начального лота

функция расчета лота у нас станет тогда

double CalculateLot(int order_type)//Тип ордера
{
//---
double lot=_Lot,
lot_min=SymbolInfoDouble(NULL,SYMBOL_VOLUME_MIN),
lot_max=SymbolInfoDouble(NULL,SYMBOL_VOLUME_MAX),
lot_step=SymbolInfoDouble(NULL,SYMBOL_VOLUME_STEP);

if(MoneyManagment==1)
lot=AccountInfoDouble(ACCOUNT_BALANCE)*risk_percent/(AccountInfoDouble(ACCOUNT_MARGIN_FREE)-AccountFreeMarginCheck(NULL,order_type,1))+CountTrades()*lot_step;
if(MoneyManagment==2)
lot=lot+CountTrades()*k_lot/KLot;

if(lot<lot_min)
lot=lot_min;
if(lot>lot_max)
lot=lot_max;
int step=(int)((lot-lot_min)/lot_step);

return(lot_min+step*lot_step);
//---
}
 

rus008

Почетный гражданин
сейчас разберемся потихоньку)
добавим несколько глобальных переменных
и будет все у нас выглядеть примерно так

input double Lot=0;
input uchar MoneyManagment=0,//0 - фикс. 1 - процент 2 - усреднение
KLot=1,
RiskPercent=10;
double _Lot,k_lot,risk_percent;

внутри функции OnInit()
определим значения
_Lot=MathMax(Lot,SymbolInfoDouble(NULL,SYMBOL_VOLUME_MIN));
risk_percent=MathMin(MathMax(1,RiskPercent),50)/100;
k_lot=MathMax(1,(int)(_Lot/SymbolInfoDouble(NULL,SYMBOL_VOLUME_STEP)))*SymbolInfoDouble(NULL,SYMBOL_VOLUME_STEP);

то есть - лот не ниже минимального, процент риска 1 - 50 (можно и поменять), ну и шаг усреднения лота раситываем в зависимости от начального лота

функция расчета лота у нас станет тогда

double CalculateLot(int order_type)//Тип ордера
{
//---
double lot=_Lot,
lot_min=SymbolInfoDouble(NULL,SYMBOL_VOLUME_MIN),
lot_max=SymbolInfoDouble(NULL,SYMBOL_VOLUME_MAX),
lot_step=SymbolInfoDouble(NULL,SYMBOL_VOLUME_STEP);

if(MoneyManagment==1)
lot=AccountInfoDouble(ACCOUNT_BALANCE)*risk_percent/(AccountInfoDouble(ACCOUNT_MARGIN_FREE)-AccountFreeMarginCheck(NULL,order_type,1))+CountTrades()*lot_step;
if(MoneyManagment==2)
lot=lot+CountTrades()*k_lot/KLot;

if(lot<lot_min)
lot=lot_min;
if(lot>lot_max)
lot=lot_max;
int step=(int)((lot-lot_min)/lot_step);

return(lot_min+step*lot_step);
//---
}
Постарался детально показать на скринах.
То что Lot 0 открывается мин лот и нет усреднения- это не важно.
 

Вложения

  • Screenshot_64.png
    Screenshot_64.png
    4,1 КБ · Просмотры: 18
  • Screenshot_65.png
    Screenshot_65.png
    37,9 КБ · Просмотры: 19
  • Screenshot_66.png
    Screenshot_66.png
    32,3 КБ · Просмотры: 19
  • Screenshot_67.png
    Screenshot_67.png
    27,1 КБ · Просмотры: 15
  • Screenshot_68.png
    Screenshot_68.png
    4,7 КБ · Просмотры: 15
  • Screenshot_71.png
    Screenshot_71.png
    17,2 КБ · Просмотры: 14
  • Screenshot_70.png
    Screenshot_70.png
    20,4 КБ · Просмотры: 10
  • Screenshot_69.png
    Screenshot_69.png
    18,7 КБ · Просмотры: 13

AlexeNP

Гуру форума
Постарался детально показать на скринах.
То что Lot 0 открывается мин лот и нет усреднения- это не важно.
не знаю чего там у тебя за химия... надо разбираться)
вот по быстрому накатал советник - все ММ работают в соответствии с предписанием)
 

Вложения

  • EURUSDH1.png
    EURUSDH1.png
    41 КБ · Просмотры: 23
  • EURUSDH2.png
    EURUSDH2.png
    43 КБ · Просмотры: 23
  • rus008.mq4
    10,4 КБ · Просмотры: 14
Верх