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);
//---
}