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

Раздел: Язык программирования MQL4
Автор темы: rus008
Создана: 2021-03-20 15:59
Ответов: 23 | Просмотров: 3974
Страница 2 из 2
Источник: https://forexsystemru.com/threads/89860/page-2

---

## AlexeNP — 2021-03-20 23:03

> Цитата (rus008):
> Вот этот вариан с выбором мне очень нравится.
> при фикс лоте 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 — 2021-03-21 00:30

> Цитата (AlexeNP):
> сейчас разберемся потихоньку)
> добавим несколько глобальных переменных
> и будет все у нас выглядеть примерно так
>
> 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 открывается мин лот и нет усреднения- это не важно.

## AlexeNP — 2021-03-21 10:24

> Цитата (rus008):
> Постарался детально показать на скринах.
> То что Lot 0 открывается мин лот и нет усреднения- это не важно.

не знаю чего там у тебя за химия... надо разбираться)
вот по быстрому накатал советник - все ММ работают в соответствии с предписанием)

## rus008 — 2021-03-21 11:43

> Цитата (AlexeNP):
> не знаю чего там у тебя за химия... надо разбираться)
> вот по быстрому накатал советник - все ММ работают в соответствии с предписанием)

Спасибо! Буду из него химичить свой советник)))))

