Watch how to download trading robots for free
Find us on Twitter!
Join our fan page
Interesting script?
So post a link to it -
let others appraise it
You liked the script? Try it in the MetaTrader 5 terminal
Libraries

OBz Trading Functions Library - library for MetaTrader 4

[Deleted] | English Русский
Views:
9143
Rating:
(22)
Published:
2016.10.13 16:45
\MQL4\Libraries\
MQL5 Freelance Need a robot or indicator based on this code? Order it on Freelance Go to Freelance

Library of trading functions (position size, open, close position etc.) from the EAs "Ocean Breeze" and "Graalino-Pro".

It can be of big help for novice traders as an example how to handle trading events.

It calculates the size of position from the RISK (%) given. Forget about pips, lots, ticks, digits etc. Take a pro-approach. It works on any financial instrument regardless of currency's name, leverage, lot digits, account's currency, broker etc.

The library works for several years at several different brokers on more than 50 currency pairs, metals, etc. This library is a Public Domain.

Example:

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

Translated from Russian by MetaQuotes Ltd.
Original code: https://www.mql5.com/ru/code/16208

Inside Bar Inside Bar

Indicator detects the Inside Bars and marks them high/low (no redraw).

Example of OnChartEvent() Function Example of OnChartEvent() Function

This is a great beginners' example of the function OnChartEvent() & creating objects on the chart to access them for some tasks.

Multi TimeFrame RSI Multi TimeFrame RSI

Shows multi timeframe (M1, M5, M15, M30, H1 , H4, D1) RSI indicator in a separate window.

Closed_WIN Closed_WIN

Closure of all winning positions. (You can indicate a specific instrument if you want to).