Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 3117
- Рейтинг:
- голосов: 21
- Опубликован:
- 2016.09.16 16:30
Данная библиотека показывает, как надо профессионально вычислять размер торговой позиции в зависимости от риска по любому финансовому инструменту. Это очень удобно, так как трейдер не отвлекается на пипсы, тики, лоты и тому подобное.
Размер позиции вычисляется в зависимости от средней дневной волатильности каждого класса финансового инструмента.
Также эта библиотека наглядно показывает для новичков, как при открытии и закрытии позиций надо обрабатывать торговые события: реквоты, замирания торгового сервера и тому подобное.
Эта библиотека функций хорошо себя зарекомендовала на демо- и реальной торговле много месяцев у разных брокеров и на разных финансовых инструментах (более 50 валют и металлов).
Библиотека — Public Domain. Делайте с ней, что хотите.
//_________________________________________________ // | // Calc_Optimal_Pos_Size () | //_________________________________________________| double Calc_Optimal_Pos_Size(string Bond_Name, int Time_Frame, double Max_Risk, int Portfolio_Bonds, int Full_Expert_ID, bool Use_Adaptive_Pos_Size_Param, double First_Loss_Drop_Param, double Losses_Drop_Slope_Param, double Second_Profit_Drop_Param, double Recovery_Slope_Param, double Max_Drop_Param) { double Pos_Size; double Pos_Size_Portfolio; double Pos_Size_Risk; //................................................................. Pos_Size_Risk=Calc_Pos_Size_To_Risk(Bond_Name, Max_Risk); Pos_Size_Portfolio=Calc_Pos_Size_To_Portfolio(Bond_Name, Portfolio_Bonds); Pos_Size=MathMin(Pos_Size_Risk,Pos_Size_Portfolio); // ======================= USE ADAPTIVE POS SIZE =================================== if(Use_Adaptive_Pos_Size_Param==TRUE) { // Print ("Adaptive: risk init=" + DoubleToStr (Pos_Size, 4)); Pos_Size=Adjust_Pos_Size_To_History(Pos_Size, Bond_Name, Full_Expert_ID, First_Loss_Drop_Param, Losses_Drop_Slope_Param, Second_Profit_Drop_Param, Recovery_Slope_Param, Max_Drop_Param); // Print ("Adaptive: out=" + DoubleToStr (Pos_Size, 4)); } // ============== ADJUST POS SIZE TO BROKER's LIMITS ==================================== // Print ("Optim Pos size=", DoubleToStr (Pos_Size, 4)); Pos_Size=Adjust_Pos_Size_To_Broker(Bond_Name,Pos_Size); return (Pos_Size); }
//__________________________________________________ // | // Calc_Pos_Size_To_Risk () | //_________________________________________________| double Calc_Pos_Size_To_Risk(string Bond_Name, double Max_Risk) { double Equity_Drawdown; double Daily_Volatility; double Pos_Size; int Lot_Digits; double Stop_Loss_Points; double One_Point_Cost; double Tick_Value; double Margin_Init; double Min_Lot_Size; //........................................................................ if(TerminalInfoInteger(TERMINAL_CONNECTED)!=TRUE) { Pos_Size=0.0; return (Pos_Size); } //........................................................................ RefreshRates(); //................................................................. Min_Lot_Size=MarketInfo(Bond_Name,MODE_MINLOT); Tick_Value=MarketInfo(Bond_Name,MODE_TICKVALUE); Margin_Init=MarketInfo(Bond_Name,MODE_MARGININIT); if((MarketInfo(Bond_Name,MODE_MARGINCALCMODE)==2) && (Margin_Init!=0.0)) { Tick_Value=Tick_Value *MarketInfo(Bond_Name,MODE_MARGINREQUIRED)/Margin_Init; } // Print ("Tick val=", DoubleToStr(Tick_Value, 6)); //.......................................................................... Equity_Drawdown=MathMin(AccountEquity(),AccountBalance())*Max_Risk/100.0; //percent Daily_Volatility=Get_Daily_Volatility(Bond_Name); // Print ("Daily volat=", DoubleToStr (Daily_Volatility,5)); //.......................................................................... Stop_Loss_Points=MarketInfo(Bond_Name,MODE_BID)*Daily_Volatility /MarketInfo(Bond_Name,MODE_POINT); // Print ("Stop_Loss_Points=", DoubleToStr (Stop_Loss_Points, 2)); //.......................................................................... One_Point_Cost=Tick_Value/(MarketInfo(Bond_Name,MODE_TICKSIZE) /MarketInfo(Bond_Name,MODE_POINT)); // Print (" One_Point_Cost =", DoubleToStr (One_Point_Cost, 4)); //.......................................................................... if(One_Point_Cost==0.0) { Print("Error: One_Point_Cost=0.0: ",DoubleToStr(One_Point_Cost,6)); Print("Tick_Value= ",DoubleToStr(Tick_Value,6)); Print("Equity_Drawdown= ",DoubleToStr(Equity_Drawdown,6)); Print("Daily_Volat= ",DoubleToStr(Daily_Volatility,5)); Print("Stop_Loss_Points= ",DoubleToStr(Stop_Loss_Points,3)); Print("One_Point_Cost= ",DoubleToStr(One_Point_Cost,6)); return (0.0); } //.......................................................................... Pos_Size=Equity_Drawdown/(One_Point_Cost*Stop_Loss_Points); //.......................................................................... if(Pos_Size<Min_Lot_Size) { Pos_Size=Min_Lot_Size; } //............................................................................. Lot_Digits=Get_Lot_Digits(Bond_Name); // Print (" Lot_Digits =" + Lot_Digits); Pos_Size=NormalizeDouble(Pos_Size,Lot_Digits); // Print (" Pos_Size =", DoubleToStr (Pos_Size, 4)); //.......................................................................... return (Pos_Size); }
//______________________________________________________________ // | // Adjust_Pos_Size_To_History () | //______________________________________________________________| double Adjust_Pos_Size_To_History(double Pos_Size, string Bond_Name, int Full_Expert_ID, double First_Loss_Drop_Param, double Losses_Drop_Slope_Param, double Second_Profit_Drop_Param, double Recovery_Slope_Param, double Max_Drop_Param) { double PL_History; // positive profits OR negative losses PL_History=Calc_PL_History_Factor(Bond_Name,Full_Expert_ID); Pos_Size=Reduce_Pos_Size_To_PL_History(PL_History, Pos_Size, Bond_Name, First_Loss_Drop_Param, Losses_Drop_Slope_Param, Second_Profit_Drop_Param, Recovery_Slope_Param, Max_Drop_Param); return (Pos_Size); }

В индикаторе совмещено отображение краткосрочного и аккумулятивного индекса колебания цен в виде линии или гистограммы.

Индикатор показывает информацию по ордерам. Можно увидеть магик ордера, его профит и сколько времени ордер уже в рынке.