diff --git a/Experts/2MA_Cross.ex5 b/Experts/2MA_Cross.ex5 index 7219401..86efe91 100644 Binary files a/Experts/2MA_Cross.ex5 and b/Experts/2MA_Cross.ex5 differ diff --git a/Experts/2MA_Cross.mq5 b/Experts/2MA_Cross.mq5 index c3b4195..1645153 100644 --- a/Experts/2MA_Cross.mq5 +++ b/Experts/2MA_Cross.mq5 @@ -1,17 +1,20 @@ #property copyright "Copyright 2017-2021, Artur Zas" // GNU General Public License v3.0 -> https://github.com/9nix6/Median-and-Turbo-Renko-indicator-bundle/blob/master/LICENSE #property link "https://www.az-invest.eu" -#property version "1.17" +#define VERSION "1.20" +#property version VERSION #property description "Example EA: Trading based on 2 moving average crossover." -#property description "MA1 & MA2 need to be enabled on the inicator creating the chart." +#property description "MA1 && MA2 need to be enabled on the inicator creating the chart." #property description "MA1 - Fast moving average" #property description "MA2 - Slow moving average" +#property description " " +#property description "GNU General Public License v3.0" +//#define RANGEBAR_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/rangebars-for-metatrader-5 //#define ULTIMATE_RENKO_LICENSE // uncomment when used on Ultimate Renko chart from https://www.az-invest.eu/ultimate-renko-indicator-generator-for-metatrader-5 //#define VOLUMECHART_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/Tick-chart-and-volume-chart-for-mt5 -//#define RANGEBAR_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/rangebars-for-metatrader-5 //#define SECONDSCHART_LICENSE // uncomment when used on a Seconds TF bar chart from https://www.az-invest.eu/seconds-timeframe-chart-for-metatrader-5 -//#define LINEBREAKCHART_LICENSE // uncomment when used on a Line Break chart from https://www.az-invest.eu +//#define LINEBREAKCHART_LICENSE // uncomment when used on a Line Break chart from https://www.az-invest.eu/linebreak-chart-for-metatrader-5 // // Uncomment only ONE of the 5 directives listed below and recompile // ----------------------------------------------------------------- @@ -21,14 +24,14 @@ //#define EA_ON_XTICK_CHART // Use EA on XTick Chart (obsolete) //#define EA_ON_TICK_VOLUME_CHART // Use EA on Tick & Volume Bar Chart //#define EA_ON_SECONDS_CHART // Use EA on Seconds Interval chart -//#define EA_ON_LINEBREAK_CHART // Use EA on LineBreak charts +//#define EA_ON_LINEBREAK_CHART // Use EA on LineBreak charts //#define DEVELOPER_VERSION // used when I develop ;) should always be commented out // Uncomment the directive below and recompile if EA is used with P-Renko BR Ultimate // ---------------------------------------------------------------------------------- // -// #define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version +//#define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version // // Uncomment the directive below and recompile for use in a backtest only @@ -65,6 +68,7 @@ #include #include +#include enum ENUM_TRADE_DIRECTION { @@ -74,22 +78,30 @@ enum ENUM_TRADE_DIRECTION }; #ifdef SHOW_INDICATOR_INPUTS - input group "EA parameters" + input group "### EA parameters" #endif input double Lots = 0.1; // Traded lots input uint StopLoss = 100; // Stop Loss (in points) -input uint TakeProfit = 250; // Take profit (in points) +input uint TakeProfit = 300; // Take profit (in points) input ENUM_TRADE_DIRECTION ValidTradeDirection = TRADE_DIRECTION_ALL; // Valid trading type input bool ForceSR = false; // Force Stop & Reverse input bool ReverseOnMACrossInsideGap = true; // Reverse trade if MA cross inside a gap -input bool CloseTradeAfterTradingHours = true; // Close trade after trading hours -input ulong DeviationPoints = 0; // Maximum defiation (in points) -input double ManualTickSize = 0.000; // Tick Size (0 = auto detect) +input group "### Trading schedule (Non stop if start = 0 & end = 0)" input string Start="9:00"; // Start trading at input string End="17:55"; // End trading at +input bool CloseTradeAfterTradingHours = false; // Close trade after trading hours +input group "### Trade management"; +input int InpBEPoints = 0; // BreakEven (Points) [ 0 = OFF ] +input int InpTrailByPoints = 0; // Trail by (Points) [ 0 = OFF ] +input int InpTrailStartPoints = 150; // Start trailing after (Points) +input int InpPartialCloseAtProfitPoints = 0; // Partial close at (Points) [ 0 = OFF ] +input int InpPartialClosePercentage = 50; // Partial close % +input group "### Misc"; input ulong MagicNumber=5150; // Assign trade ID +input ulong DeviationPoints = 0; // Maximum deviation (in points) +input double ManualTickSize = 0.000; // Tick Size (0 = auto detect) input int NumberOfRetries = 50; // Maximum number of retries -input int BusyTimeout_ms = 1000; // Wait [ms] before retry on bussy errors +input int BusyTimeout_ms = 1000; // Wait [ms] before retry on busy errors input int RequoteTimeout_ms = 250; // Wait [ms] before retry on requotes // Global data buffers @@ -106,8 +118,10 @@ int numberOfBars = 3; CMarketOrder *marketOrder = NULL; CTimeControl *timeControl = NULL; +CTradeManager *tradeManager = NULL; ulong currentTicket; +CTradeManagerState tradeManagerState; ENUM_POSITION_TYPE currentPositionType; ENUM_POSITION_TYPE signal; ENUM_POSITION_TYPE validation; @@ -191,7 +205,25 @@ int OnInit() timeControl.SetValidTraingHours(Start,End); - return(INIT_SUCCEEDED); + // + // Init TradeManager + // + + CTradeManagerParameters params2; + { + params2.BEPoints = InpBEPoints; + params2.TrailByPoints = InpTrailByPoints; + params2.TrailStartPoints = InpTrailStartPoints; + params2.PartialCloseAtProfitPoints = InpPartialCloseAtProfitPoints; + params2.PartialClosePercentage = InpPartialClosePercentage; + } + + if(tradeManager == NULL) + { + tradeManager = new CTradeManager(params2, marketOrder); + } + + return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ //| Expert deinitialization function | @@ -223,7 +255,13 @@ void OnDeinit(const int reason) delete customBars; customBars = NULL; } - + + if(tradeManager != NULL) + { + delete tradeManager; + tradeManager = NULL; + } + Comment(""); } //+------------------------------------------------------------------+ @@ -231,20 +269,15 @@ void OnDeinit(const int reason) //+------------------------------------------------------------------+ void OnTick() { - if(marketOrder == NULL || customBars == NULL || timeControl == NULL) + if(marketOrder == NULL || customBars == NULL || timeControl == NULL || tradeManager == NULL) return; - if(customBars.IsNewBar()) + // trade management + + if(marketOrder.IsOpen(currentTicket, _Symbol, MagicNumber)) { - if(timeControl.IsScheduleEnabled()) - { - Comment("EA trading schedule ON ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()); - } - else - { - Comment("EA trading schedule OFF"); - } - + // checks done on every tick + if(!timeControl.IsTradingTimeValid()) { if(marketOrder.IsOpen(currentTicket,_Symbol,MagicNumber)) @@ -258,6 +291,22 @@ void OnTick() return; } + + tradeManager.Manage(currentTicket, tradeManagerState); + } + + // Signal handler + + if(customBars.IsNewBar()) + { + if(timeControl.IsScheduleEnabled()) + { + Comment("EA trading schedule ON ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()); + } + else + { + Comment("EA trading schedule OFF"); + } // // Get moving average values for current, last completed bar and the bar before that... @@ -280,19 +329,21 @@ void OnTick() if(timeControl.IsScheduleEnabled()) { Comment("EA trading schedule ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()+ - "\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ - "\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+ + // "\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ + // "\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+ "\n MA cross signal = "+marketOrder.PositionTypeToString(signal)+ "\n MA validation = "+marketOrder.PositionTypeToString(validation)+ + "\n Trade manager: "+tradeManager.ToString()+ "\n"); } else { Comment("EA trading schedule not used. Trading is enabled."+ - "\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ - "\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+ + // "\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ + // "\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+ "\n MA cross signal = "+marketOrder.PositionTypeToString(signal)+ "\n MA validation = "+marketOrder.PositionTypeToString(validation)+ + "\n Trade manager: "+tradeManager.ToString()+ "\n"); } @@ -306,6 +357,7 @@ void OnTick() { PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket); marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + tradeManagerState.Clear(); } } return; @@ -313,8 +365,10 @@ void OnTick() else if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_BUY,MagicNumber)) { if(IsTradeDirectionValid(POSITION_TYPE_BUY)) + { marketOrder.Long(_Symbol,Lots,StopLoss,TakeProfit); - + tradeManagerState.Clear(); + } return; } } @@ -328,6 +382,7 @@ void OnTick() { PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket); marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + tradeManagerState.Clear(); } } return; @@ -335,8 +390,10 @@ void OnTick() else if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_SELL,MagicNumber)) { if(IsTradeDirectionValid(POSITION_TYPE_SELL)) + { + tradeManagerState.Clear(); marketOrder.Short(_Symbol,Lots,StopLoss,TakeProfit); - + } return; } } @@ -357,18 +414,20 @@ void OnTick() // reverse position on signal change inside gap. PrintFormat("Reversing %s position on signal change inside gap (ticket:%d)", _Symbol, currentTicket); marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + tradeManagerState.Clear(); } else { // close position on signal change inside gap. PrintFormat("Closing %s position on signal change inside gap (ticket:%d)", _Symbol, currentTicket); marketOrder.Close(currentTicket); + tradeManagerState.Clear(); } } } } } - } + } } // diff --git a/Experts/PriceMA_Cross.ex5 b/Experts/PriceMA_Cross.ex5 index 53a26f2..5e697f1 100644 Binary files a/Experts/PriceMA_Cross.ex5 and b/Experts/PriceMA_Cross.ex5 differ diff --git a/Experts/PriceMA_Cross.mq5 b/Experts/PriceMA_Cross.mq5 index 64d6bb5..6838ffd 100644 --- a/Experts/PriceMA_Cross.mq5 +++ b/Experts/PriceMA_Cross.mq5 @@ -1,15 +1,18 @@ #property copyright "Copyright 2017-2021, Artur Zas" // GNU General Public License v3.0 -> https://github.com/9nix6/Median-and-Turbo-Renko-indicator-bundle/blob/master/LICENSE #property link "https://www.az-invest.eu" -#property version "1.09" -#property description "Example EA: Trading based on moving average & price crossover." +#define VERSION "1.10" +#property version VERSION +#property description "Example EA: Trading based on moving average && price crossover." #property description "MA1 needs to be enabled on the inicator creating the chart." +#property description " " +#property description "GNU General Public License v3.0" +//#define RANGEBAR_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/rangebars-for-metatrader-5 //#define ULTIMATE_RENKO_LICENSE // uncomment when used on Ultimate Renko chart from https://www.az-invest.eu/ultimate-renko-indicator-generator-for-metatrader-5 //#define VOLUMECHART_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/Tick-chart-and-volume-chart-for-mt5 -//#define RANGEBAR_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/rangebars-for-metatrader-5 //#define SECONDSCHART_LICENSE // uncomment when used on a Seconds TF bar chart from https://www.az-invest.eu/seconds-timeframe-chart-for-metatrader-5 -//#define LINEBREAKCHART_LICENSE // uncomment when used on a Line Break chart from https://www.az-invest.eu +//#define LINEBREAKCHART_LICENSE // uncomment when used on a Line Break chart from https://www.az-invest.eu/linebreak-chart-for-metatrader-5 // // Uncomment only ONE of the 5 directives listed below and recompile @@ -20,14 +23,14 @@ //#define EA_ON_XTICK_CHART // Use EA on XTick Chart (obsolete) //#define EA_ON_TICK_VOLUME_CHART // Use EA on Tick & Volume Bar Chart //#define EA_ON_SECONDS_CHART // Use EA on Seconds Interval chart -//#define EA_ON_LINEBREAK_CHART // Use EA on LineBreak charts +//#define EA_ON_LINEBREAK_CHART // Use EA on LineBreak charts //#define DEVELOPER_VERSION // used when I develop ;) should always be commented out // Uncomment the directive below and recompile if EA is used with P-Renko BR Ultimate // ---------------------------------------------------------------------------------- // -// #define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version +//#define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version // // Uncomment the directive below and recompile for use in a backtest only @@ -64,6 +67,7 @@ #include #include +#include enum ENUM_TRADE_DIRECTION { @@ -79,18 +83,26 @@ input double Lots = 0.1; // Trade input uint StopLoss = 0; // Stop Loss input uint TakeProfit = 0; // Take profit input int ConfirmationBars = 1; // Signal confirmation bars -input int PrevSignalBars = 1; // Prev signal confirmation bars +input int PrevSignalBars = 1; // Prev. signal confirmation bars input ENUM_TRADE_DIRECTION ValidTradeDirection = TRADE_DIRECTION_ALL; // Valid trading type input bool CloseTradeOnSignalChange = true; // Close trade on signal change input bool ForceSR = false; // Force Stop & Reverse -input bool CloseTradeAfterTradingHours = true; // Close trade after trading hours -input ulong DeviationPoints = 0; // Maximum defiation (in points) -input double ManualTickSize = 0.000; // Tick Size (0 = auto detect) +input group "### Trading schedule (Non stop if start = 0 & end = 0)" input string Start="9:00"; // Start trading at input string End="17:55"; // End trading at +input bool CloseTradeAfterTradingHours = true; // Close trade after trading hours +input group "### Trade management"; +input int InpBEPoints = 0; // BreakEven (Points) [ 0 = OFF ] +input int InpTrailByPoints = 0; // Trail by (Points) [ 0 = OFF ] +input int InpTrailStartPoints = 150; // Start trailing after (Points) +input int InpPartialCloseAtProfitPoints = 0; // Partial close at (Points) [ 0 = OFF ] +input int InpPartialClosePercentage = 50; // Partial close % +input group "### Misc"; input ulong MagicNumber=8888; // Assign trade ID +input ulong DeviationPoints = 0; // Maximum defiation (in points) +input double ManualTickSize = 0.000; // Tick Size (0 = auto detect) input int NumberOfRetries = 50; // Maximum number of retries -input int BusyTimeout_ms = 1000; // Wait [ms] before retry on bussy errors +input int BusyTimeout_ms = 1000; // Wait [ms] before retry on busy errors input int RequoteTimeout_ms = 250; // Wait [ms] before retry on requotes // Global data buffers @@ -107,10 +119,12 @@ int _prevSignalBars; // EA variables -CMarketOrder *marketOrder; -CTimeControl *timeControl; +CMarketOrder *marketOrder = NULL; +CTimeControl *timeControl = NULL; +CTradeManager *tradeManager = NULL; ulong currentTicket; +CTradeManagerState tradeManagerState; ENUM_POSITION_TYPE currentPositionType; ENUM_POSITION_TYPE signal; ENUM_POSITION_TYPE validation; @@ -168,6 +182,8 @@ int OnInit() } customBars.Init(); + if(customBars.GetHandle() == INVALID_HANDLE) + return(INIT_FAILED); signal = POSITION_TYPE_NONE; _confirmationBars = (ConfirmationBars < 1) ? 1 : ConfirmationBars; @@ -195,6 +211,24 @@ int OnInit() timeControl.SetValidTraingHours(Start,End); + // + // Init TradeManager + // + + CTradeManagerParameters params2; + { + params2.BEPoints = InpBEPoints; + params2.TrailByPoints = InpTrailByPoints; + params2.TrailStartPoints = InpTrailStartPoints; + params2.PartialCloseAtProfitPoints = InpPartialCloseAtProfitPoints; + params2.PartialClosePercentage = InpPartialClosePercentage; + } + + if(tradeManager == NULL) + { + tradeManager = new CTradeManager(params2, marketOrder); + } + return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ @@ -228,6 +262,12 @@ void OnDeinit(const int reason) customBars = NULL; } + if(tradeManager != NULL) + { + delete tradeManager; + tradeManager = NULL; + } + Comment(""); } //+------------------------------------------------------------------+ @@ -235,20 +275,15 @@ void OnDeinit(const int reason) //+------------------------------------------------------------------+ void OnTick() { - if(marketOrder == NULL) + if(marketOrder == NULL || customBars == NULL || timeControl == NULL || tradeManager == NULL) return; - - if(customBars.IsNewBar()) + + // trade management + + if(marketOrder.IsOpen(currentTicket, _Symbol, MagicNumber)) { - if(timeControl.IsScheduleEnabled()) - { - Comment("EA trading schedule ON ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()); - } - else - { - Comment("EA trading schedule OFF"); - } - + // checks done on every tick + if(!timeControl.IsTradingTimeValid()) { if(marketOrder.IsOpen(currentTicket,_Symbol,MagicNumber)) @@ -262,7 +297,23 @@ void OnTick() return; } - + + tradeManager.Manage(currentTicket, tradeManagerState); + } + + // Signal handler + + if(customBars.IsNewBar()) + { + if(timeControl.IsScheduleEnabled()) + { + Comment("EA trading schedule ON ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()); + } + else + { + Comment("EA trading schedule OFF"); + } + // // Get MqlRateInfo & moving average values for current, last completed bar and the bar before that... // @@ -283,17 +334,19 @@ void OnTick() if(timeControl.IsScheduleEnabled()) { Comment("EA trading schedule ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()+ - "\n MA_1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ - "\n Close[2]: "+DoubleToString(RateInfo[2].close,_Digits)+" [1]: "+DoubleToString(RateInfo[1].close,_Digits)+ + //"\n MA_1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ + //"\n Close[2]: "+DoubleToString(RateInfo[2].close,_Digits)+" [1]: "+DoubleToString(RateInfo[1].close,_Digits)+ "\n Price & MA cross signal = "+marketOrder.PositionTypeToString(signal)+ + "\n Trade manager: "+tradeManager.ToString()+ "\n"); } else { Comment("EA trading schedule not used. Trading is enabled."+ - "\n MA_1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ - "\n Close[2]: "+DoubleToString(RateInfo[2].close,_Digits)+" [1]: "+DoubleToString(RateInfo[1].close,_Digits)+ + //"\n MA_1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+ + //"\n Close[2]: "+DoubleToString(RateInfo[2].close,_Digits)+" [1]: "+DoubleToString(RateInfo[1].close,_Digits)+ "\n Price & MA cross signal = "+marketOrder.PositionTypeToString(signal)+ + "\n Trade manager: "+tradeManager.ToString()+ "\n"); } diff --git a/Experts/RangeBars_ExampleEA.ex5 b/Experts/RangeBars_ExampleEA.ex5 index ba913e6..bfffdff 100644 Binary files a/Experts/RangeBars_ExampleEA.ex5 and b/Experts/RangeBars_ExampleEA.ex5 differ diff --git a/Experts/RangeBars_ExampleEA2.ex5 b/Experts/RangeBars_ExampleEA2.ex5 index dd36d3d..d247d9d 100644 Binary files a/Experts/RangeBars_ExampleEA2.ex5 and b/Experts/RangeBars_ExampleEA2.ex5 differ diff --git a/Include/AZ-INVEST/SDK/CommonSettings.mqh b/Include/AZ-INVEST/SDK/CommonSettings.mqh index 9c400f7..a825a37 100644 Binary files a/Include/AZ-INVEST/SDK/CommonSettings.mqh and b/Include/AZ-INVEST/SDK/CommonSettings.mqh differ diff --git a/Include/AZ-INVEST/SDK/CustomChartInputs.mqh b/Include/AZ-INVEST/SDK/CustomChartInputs.mqh index e28699e..98a7714 100644 Binary files a/Include/AZ-INVEST/SDK/CustomChartInputs.mqh and b/Include/AZ-INVEST/SDK/CustomChartInputs.mqh differ diff --git a/Include/AZ-INVEST/SDK/CustomChartInputsBR.mqh b/Include/AZ-INVEST/SDK/CustomChartInputsBR.mqh index 7b88ab9..63bec66 100644 Binary files a/Include/AZ-INVEST/SDK/CustomChartInputsBR.mqh and b/Include/AZ-INVEST/SDK/CustomChartInputsBR.mqh differ diff --git a/Include/AZ-INVEST/SDK/CustomChartSettingsBase.mqh b/Include/AZ-INVEST/SDK/CustomChartSettingsBase.mqh index 3ab0686..6913b17 100644 Binary files a/Include/AZ-INVEST/SDK/CustomChartSettingsBase.mqh and b/Include/AZ-INVEST/SDK/CustomChartSettingsBase.mqh differ diff --git a/Include/AZ-INVEST/SDK/ICustomChartSettings.mqh b/Include/AZ-INVEST/SDK/ICustomChartSettings.mqh index 8175664..264ccb6 100644 Binary files a/Include/AZ-INVEST/SDK/ICustomChartSettings.mqh and b/Include/AZ-INVEST/SDK/ICustomChartSettings.mqh differ diff --git a/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh b/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh index 851ec50..5791bda 100644 --- a/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh +++ b/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh @@ -12,38 +12,32 @@ #ifdef SHOW_INDICATOR_INPUTS #ifdef MQL5_MARKET_DEMO // hardcoded values - int barSizeInTicks = 180; // Range bar size (in ticks) - ENUM_BOOL atrEnabled = false; // Enable ATR based bar size calculation - ENUM_TIMEFRAMES atrTimeFrame = PERIOD_D1; // Use ATR period - int atrPeriod = 14; // ATR period - int atrPercentage = 10; // Use percentage of ATR - int showNumberOfDays = 7; // Show history for number of days - ENUM_BOOL resetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day + double InpBarSize = 180; // Range bar size + ENUM_BAR_SIZE_CALC_MODE InpBarSizeCalcMode = BAR_SIZE_ABSOLUTE_TICKS; // Bar size calculation + int InpShowNumberOfDays = 7; // Show history for number of days + ENUM_TIMEFRAMES InpAtrTimeFrame = PERIOD_D1; // ATR timeframe setting + int InpAtrPeriod = 14; // ATR period setting + ENUM_BOOL InpResetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day #else // user defined settings - - - input int barSizeInTicks = 100; // Range bar size (in ticks) - input int showNumberOfDays = 5; // Show history for number of days - - input group "### ATR based bar size calculation" - input ENUM_BOOL atrEnabled = false; // Enable ATR based bar size calculation - input ENUM_TIMEFRAMES atrTimeFrame = PERIOD_D1; // Use ATR period - input int atrPeriod = 14; // ATR period - input int atrPercentage = 10; // Use percentage of ATR - - input group "### Chart synchronization" - input ENUM_BOOL resetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day + + input double InpBarSize = 100; // Range bar size + input ENUM_BAR_SIZE_CALC_MODE InpBarSizeCalcMode = BAR_SIZE_ABSOLUTE_TICKS;// Bar size calculation + input int InpShowNumberOfDays = 5; // Show history for number of days + input group "### ATR bar size calculation settings" + input ENUM_TIMEFRAMES InpAtrTimeFrame = PERIOD_D1; // ATR timeframe setting + input int InpAtrPeriod = 14; // ATR period setting + input group "### Chart synchronization" + input ENUM_BOOL InpResetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day #endif #else // don't SHOW_INDICATOR_INPUTS - int barSizeInTicks = 180; // Range bar size (in ticks) - ENUM_BOOL atrEnabled = false; // Enable ATR based bar size calculation - ENUM_TIMEFRAMES atrTimeFrame = PERIOD_D1; // Use ATR period - int atrPeriod = 14; // ATR period - int atrPercentage = 10; // Use percentage of ATR - int showNumberOfDays = 7; // Show history for number of days - ENUM_BOOL resetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day + double InpBarSize = 180; // Range bar size + ENUM_BAR_SIZE_CALC_MODE InpBarSizeCalcMode = BAR_SIZE_ABSOLUTE_TICKS;// Bar size calculation + int InpShowNumberOfDays = 7; // Show history for number of days + ENUM_TIMEFRAMES InpAtrTimeFrame = PERIOD_D1; // ATR timeframe setting + int InpAtrPeriod = 14; // ATR period setting + ENUM_BOOL InpResetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day #endif // @@ -52,15 +46,18 @@ // #include +#define SETNAME_BAR_SIZE_CALC_MODE "barSizeCalcMode" +#define SETNAME_ATR_TIMEFRAME "atrTimeFrame" +#define SETNAME_ATR_PERIOD "atrPeriod" + struct RANGEBAR_SETTINGS { - int barSizeInTicks; - ENUM_BOOL atrEnabled; - ENUM_TIMEFRAMES atrTimeFrame; - int atrPeriod; - int atrPercentage; - int showNumberOfDays; - ENUM_BOOL resetOpenOnNewTradingDay; + double barSize; + ENUM_BAR_SIZE_CALC_MODE barSizeCalcMode; + ENUM_TIMEFRAMES atrTimeFrame; + int atrPeriod; + int showNumberOfDays; + ENUM_BOOL resetOpenOnNewTradingDay; }; @@ -109,12 +106,10 @@ uint CRangeBarCustomChartSettigns::CustomChartSettingsFromFile(int file_handle) void CRangeBarCustomChartSettigns::SetCustomChartSettings() { - settings.barSizeInTicks = barSizeInTicks; - - settings.atrEnabled = atrEnabled; - settings.atrTimeFrame = atrTimeFrame; - settings.atrPeriod = atrPeriod; - settings.atrPercentage = atrPercentage; - settings.showNumberOfDays = showNumberOfDays; - settings.resetOpenOnNewTradingDay = resetOpenOnNewTradingDay; + settings.barSize = InpBarSize; + settings.barSizeCalcMode = InpBarSizeCalcMode; + settings.showNumberOfDays = InpShowNumberOfDays; + settings.atrTimeFrame = InpAtrTimeFrame; + settings.atrPeriod = InpAtrPeriod; + settings.resetOpenOnNewTradingDay = InpResetOpenOnNewTradingDay; } diff --git a/Include/AZ-INVEST/SDK/RangeBars.mqh b/Include/AZ-INVEST/SDK/RangeBars.mqh index 9662a0e..a6497c2 100644 --- a/Include/AZ-INVEST/SDK/RangeBars.mqh +++ b/Include/AZ-INVEST/SDK/RangeBars.mqh @@ -1,8 +1,8 @@ -#property copyright "Copyright 2018-2020, Level Up Software" +#property copyright "Copyright 2018-2021, Level Up Software" #property link "http://www.az-invest.eu" #ifdef DEVELOPER_VERSION - #define RANGEBAR_INDICATOR_NAME "RangeBars\\RangeBarsOverlay300" + #define RANGEBAR_INDICATOR_NAME "RangeBars\\RangeBarsOverlay316" #else #ifdef RANGEBAR_LICENSE #ifdef MQL5_MARKET_VERSION @@ -193,23 +193,23 @@ int RangeBars::Init() RANGEBAR_SETTINGS s = rangeBarSettings.GetCustomChartSettings(); CHART_INDICATOR_SETTINGS cis = rangeBarSettings.GetChartIndicatorSettings(); + ALERT_INFO_SETTINGS als = rangeBarSettings.GetAlertInfoSettings(); rangeBarsHandle = iCustom(this.rangeBarsSymbol, _Period, RANGEBAR_INDICATOR_NAME, - s.barSizeInTicks, + s.barSize, + s.barSizeCalcMode, s.showNumberOfDays, "=", - s.atrEnabled, s.atrTimeFrame, s.atrPeriod, - s.atrPercentage, "=", s.resetOpenOnNewTradingDay, "=", - showPivots, - pivotPointCalculationType, + als.showPivots, + als.pivotPointCalculationType, "=", - AlertMeWhen, - AlertNotificationType, + InpAlertMeWhen, + InpAlertNotificationType, "=", cis.MA1lineType, cis.MA1period, diff --git a/Include/AZ-INVEST/SDK/TradeFunctions.mqh b/Include/AZ-INVEST/SDK/TradeFunctions.mqh index 5525e7e..d16d0b8 100644 --- a/Include/AZ-INVEST/SDK/TradeFunctions.mqh +++ b/Include/AZ-INVEST/SDK/TradeFunctions.mqh @@ -1,5 +1,5 @@ // -// Copyright 2017-2018, Artur Zas +// Copyright 2017-2021, Artur Zas // https://www.az-invest.eu // https://www.mql5.com/en/users/arturz // @@ -732,8 +732,26 @@ bool CMarketOrder::ClosePartial(ulong ticket, double lots) while(!IsStopped() && !result) { - result = ctrade.PositionClosePartial(ticket, NormalizeLots(symbol,lots)); + if(_IsNettingAccount()) // Netting account type + { + // open opposite position with volume = "lots" to do a parial close + + ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + if(type == POSITION_TYPE_BUY) + { + result = this.Short(symbol,lots,0,0); + } + else if(type == POSITION_TYPE_SELL) + { + result = this.Long(symbol,lots,0,0); + } + } + else // Hedging account type + { + result = ctrade.PositionClosePartial(ticket, lots); + } + if(result) { Sleep(500); @@ -1072,5 +1090,3 @@ void CMarketOrder::SetTradeId(ulong tradeId) ctrade.SetExpertMagicNumber(tradeId); } - - \ No newline at end of file diff --git a/Include/AZ-INVEST/SDK/TradeManager.mqh b/Include/AZ-INVEST/SDK/TradeManager.mqh new file mode 100644 index 0000000..17d48a5 --- /dev/null +++ b/Include/AZ-INVEST/SDK/TradeManager.mqh @@ -0,0 +1,266 @@ +// +// Copyright 2018-2021, Artur Zas +// https://www.az-invest.eu +// https://www.mql5.com/en/users/arturz +// + +#include + +class CTradeManagerState +{ + public: + + void Clear() { DoneBreakEven = false; TrailStarted = false; DonePartialClose = false; }; + + // Break Even + bool DoneBreakEven; + + // Trailing Stop + bool TrailStarted; + + // Partial Close + bool DonePartialClose; +}; + +struct CTradeManagerParameters +{ + // Break Even + int BEPoints; + + // Trailing Stop + int TrailByPoints; + int TrailStartPoints; + + // Partial Close + int PartialCloseAtProfitPoints; + int PartialClosePercentage; +}; + +class CTradeManager +{ + private: + + bool initialized; + CMarketOrder *orderHandler; + CTradeManagerParameters inputs; + + ENUM_ORDER_TYPE __type; + double __open; + double __lots; + string __symbol; + double __tp; + double __sl; + double __bid; + double __ask; + + public: + + CTradeManager(); + CTradeManager(CTradeManagerParameters ¶ms, CMarketOrder *orderHalder); + ~CTradeManager(); + + bool IsInitialized() { return this.initialized; }; + bool Initialize(CTradeManagerParameters ¶ms, CMarketOrder *orderHalder); + bool Manage(ulong ticket, CTradeManagerState &_state); + string ToString(); + + private: + + bool GetTradeInfo(ulong ticket); + bool BreakEven(ulong ticket); + bool OkToTrailTheStop(ulong ticket); + bool TrailTheStop(ulong ticket); + bool PartialClose(ulong ticket, double lots); + double GetPartialCloseLotSize(); + bool IsDistanceFromOpenReached(double distancePriceDiff); + ENUM_ORDER_TYPE GetType(ulong ticket); +}; + + +CTradeManager::CTradeManager(void) +{ + this.orderHandler = NULL; + this.initialized = false; +} + +CTradeManager::CTradeManager(CTradeManagerParameters ¶ms,CMarketOrder *_orderHandler) +{ + this.orderHandler = NULL; + this.initialized = false; + Initialize(params, _orderHandler); +} + +CTradeManager::~CTradeManager(void) +{ + +} + +bool CTradeManager::GetTradeInfo(ulong ticket) +{ + __type = GetType(ticket); + __open = PositionGetDouble(POSITION_PRICE_OPEN); + if(__open == 0) + return false; + + __lots = PositionGetDouble(POSITION_VOLUME); + __symbol = PositionGetString(POSITION_SYMBOL); + __tp = PositionGetDouble(POSITION_TP); + __sl = PositionGetDouble(POSITION_SL); + __bid = SymbolInfoDouble(__symbol,SYMBOL_BID); + __ask = SymbolInfoDouble(__symbol,SYMBOL_ASK); + + return true; +} + +bool CTradeManager::Initialize(CTradeManagerParameters ¶ms, CMarketOrder *_orderHandler) +{ + // Dependency injection + this.orderHandler = _orderHandler; + if(this.orderHandler == NULL) + { + Print(__FUNCTION__," failed on orderHandler == NULL"); + return false; + } + + // + this.inputs = params; + + // normalize inputs + this.inputs.PartialClosePercentage = MathMin(MathAbs(this.inputs.PartialClosePercentage), 100); + + // + this.initialized = true; + return initialized; +} + +bool CTradeManager::Manage(ulong ticket, CTradeManagerState &_state) +{ + if(!GetTradeInfo(ticket)) + return false; // trade info not available + + if(!_state.DonePartialClose) + { + _state.DonePartialClose = PartialClose(ticket, GetPartialCloseLotSize()); + } + + if(!_state.DoneBreakEven) + { + if(BreakEven(ticket)) + _state.DoneBreakEven = true; + } + + if(!_state.TrailStarted) + { + _state.TrailStarted = OkToTrailTheStop(ticket); + } + + if(_state.TrailStarted) + { + TrailTheStop(ticket); + } + + return true; +} + +bool CTradeManager::PartialClose(ulong ticket, double lots) +{ + if(this.inputs.PartialCloseAtProfitPoints == 0 || lots == 0) + return false; // nothing to do + + double _partialCloseDistance = SymbolInfoDouble(__symbol,SYMBOL_POINT) * this.inputs.PartialCloseAtProfitPoints; + if(!IsDistanceFromOpenReached(_partialCloseDistance)) + return false; + + return orderHandler.ClosePartial(ticket, lots); +} + +bool CTradeManager::BreakEven(ulong ticket) +{ + if(this.inputs.BEPoints == 0) + return false; // nothing to do + + double _beDistance = SymbolInfoDouble(__symbol,SYMBOL_POINT) * this.inputs.BEPoints; + if(!IsDistanceFromOpenReached(_beDistance)) + return false; + + return orderHandler.Modify(ticket,__open,__tp); +} + +bool CTradeManager::OkToTrailTheStop(ulong ticket) +{ + if(this.inputs.TrailByPoints == 0) + return false; // nothing to do + + double _startDistance = SymbolInfoDouble(__symbol,SYMBOL_POINT) * this.inputs.TrailStartPoints; + if(!IsDistanceFromOpenReached(_startDistance)) + return false; + + return true; +} + +bool CTradeManager::TrailTheStop(ulong ticket) +{ + if(this.inputs.TrailByPoints == 0) + return false; // nothing to do + + double _trailDistance = SymbolInfoDouble(__symbol,SYMBOL_POINT) * this.inputs.TrailByPoints; + double _sl = __sl; + bool okToModify = false; + + if(__type == ORDER_TYPE_BUY) + { + _sl = (__bid - _trailDistance); + if(_sl > __sl) + okToModify = true; + } + else if(__type == ORDER_TYPE_SELL) + { + _sl = (__ask + _trailDistance); + if(_sl < __sl) + okToModify = true; + } + + if(okToModify) + return orderHandler.Modify(ticket,_sl,__tp); + + return false; +} + +ENUM_ORDER_TYPE CTradeManager::GetType(ulong ticket) +{ + ENUM_POSITION_TYPE _pType; + orderHandler.GetPositionType(ticket,_pType); + + return orderHandler.TradeBias((ENUM_ORDER_TYPE)_pType); +} + +double CTradeManager::GetPartialCloseLotSize() +{ + double lotsToClose = (__lots * inputs.PartialClosePercentage) / 100; + return NormalizeLots(__symbol, lotsToClose); +} + +bool CTradeManager::IsDistanceFromOpenReached(double distancePriceDiff) +{ + if(__type == ORDER_TYPE_BUY) + { + if((__bid - distancePriceDiff) >= __open) + return true; + } + else if(__type == ORDER_TYPE_SELL) + { + if((__ask + distancePriceDiff) <= __open) + return true; + } + + return false; +} + +string CTradeManager::ToString() +{ + string _be = (inputs.BEPoints > 0) ? "[BE ON] " : "[BE off] "; + string _trail = (inputs.TrailByPoints > 0) ? "[Trail ON] ": "[Trail off] "; + string _partial = (inputs.PartialCloseAtProfitPoints > 0) ? "[Partial "+(string)inputs.PartialClosePercentage+"%] ": "[Partial off] "; + + return _be+_trail+_partial; +} \ No newline at end of file diff --git a/Indicators/RangeBars/ADX Cross Alerts.ex5 b/Indicators/RangeBars/ADX Cross Alerts.ex5 index 12e1f3a..c08feb7 100644 Binary files a/Indicators/RangeBars/ADX Cross Alerts.ex5 and b/Indicators/RangeBars/ADX Cross Alerts.ex5 differ diff --git a/Indicators/RangeBars/ADX.ex5 b/Indicators/RangeBars/ADX.ex5 index 2bc2088..6007875 100644 Binary files a/Indicators/RangeBars/ADX.ex5 and b/Indicators/RangeBars/ADX.ex5 differ diff --git a/Indicators/RangeBars/ATP.ex5 b/Indicators/RangeBars/ATP.ex5 index b531018..2b583fc 100644 Binary files a/Indicators/RangeBars/ATP.ex5 and b/Indicators/RangeBars/ATP.ex5 differ diff --git a/Indicators/RangeBars/ATR.ex5 b/Indicators/RangeBars/ATR.ex5 index bf22ae9..b61eb48 100644 Binary files a/Indicators/RangeBars/ATR.ex5 and b/Indicators/RangeBars/ATR.ex5 differ diff --git a/Indicators/RangeBars/ATR.mq5 b/Indicators/RangeBars/ATR.mq5 index 2934312..3faa75f 100644 --- a/Indicators/RangeBars/ATR.mq5 +++ b/Indicators/RangeBars/ATR.mq5 @@ -14,7 +14,7 @@ #property indicator_color1 DodgerBlue #property indicator_label1 "ATR" //--- input parameters -input int InpAtrPeriod=14; // ATR period +input int Inp_AtrPeriod=14; // ATR period //--- indicator buffers double ExtATRBuffer[]; double ExtTRBuffer[]; @@ -33,12 +33,12 @@ int ExtPeriodATR; void OnInit() { //--- check for input value - if(InpAtrPeriod<=0) + if(Inp_AtrPeriod<=0) { ExtPeriodATR=14; - printf("Incorrect input parameter InpAtrPeriod = %d. Indicator will use value %d for calculations.",InpAtrPeriod,ExtPeriodATR); + printf("Incorrect input parameter InpAtrPeriod = %d. Indicator will use value %d for calculations.",Inp_AtrPeriod,ExtPeriodATR); } - else ExtPeriodATR=InpAtrPeriod; + else ExtPeriodATR=Inp_AtrPeriod; //--- indicator buffers mapping SetIndexBuffer(0,ExtATRBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS); diff --git a/Indicators/RangeBars/AroonOscillator.ex5 b/Indicators/RangeBars/AroonOscillator.ex5 index 9207f0a..e34f8d5 100644 Binary files a/Indicators/RangeBars/AroonOscillator.ex5 and b/Indicators/RangeBars/AroonOscillator.ex5 differ diff --git a/Indicators/RangeBars/AwesomeOscillator.ex5 b/Indicators/RangeBars/AwesomeOscillator.ex5 index 26d2a95..776d3dc 100644 Binary files a/Indicators/RangeBars/AwesomeOscillator.ex5 and b/Indicators/RangeBars/AwesomeOscillator.ex5 differ diff --git a/Indicators/RangeBars/BB_MACD.ex5 b/Indicators/RangeBars/BB_MACD.ex5 index d26eb64..b67dad9 100644 Binary files a/Indicators/RangeBars/BB_MACD.ex5 and b/Indicators/RangeBars/BB_MACD.ex5 differ diff --git a/Indicators/RangeBars/BollingerBandsMacd.ex5 b/Indicators/RangeBars/BollingerBandsMacd.ex5 index 2c27a01..0456bd5 100644 Binary files a/Indicators/RangeBars/BollingerBandsMacd.ex5 and b/Indicators/RangeBars/BollingerBandsMacd.ex5 differ diff --git a/Indicators/RangeBars/CCI(alternative).ex5 b/Indicators/RangeBars/CCI(alternative).ex5 index 4d174ba..229bd5f 100644 Binary files a/Indicators/RangeBars/CCI(alternative).ex5 and b/Indicators/RangeBars/CCI(alternative).ex5 differ diff --git a/Indicators/RangeBars/CCI.ex5 b/Indicators/RangeBars/CCI.ex5 index 8c404f6..98fa4d2 100644 Binary files a/Indicators/RangeBars/CCI.ex5 and b/Indicators/RangeBars/CCI.ex5 differ diff --git a/Indicators/RangeBars/ChaikinVolatility.ex5 b/Indicators/RangeBars/ChaikinVolatility.ex5 index 4d6a2d3..9b88f97 100644 Binary files a/Indicators/RangeBars/ChaikinVolatility.ex5 and b/Indicators/RangeBars/ChaikinVolatility.ex5 differ diff --git a/Indicators/RangeBars/ColorHMA.ex5 b/Indicators/RangeBars/ColorHMA.ex5 index f4d8da6..cfcbfe8 100644 Binary files a/Indicators/RangeBars/ColorHMA.ex5 and b/Indicators/RangeBars/ColorHMA.ex5 differ diff --git a/Indicators/RangeBars/DT_Oscillator.ex5 b/Indicators/RangeBars/DT_Oscillator.ex5 index cd4ff92..3c2d198 100644 Binary files a/Indicators/RangeBars/DT_Oscillator.ex5 and b/Indicators/RangeBars/DT_Oscillator.ex5 differ diff --git a/Indicators/RangeBars/DidiIndex.ex5 b/Indicators/RangeBars/DidiIndex.ex5 index 33d9069..5e9efa2 100644 Binary files a/Indicators/RangeBars/DidiIndex.ex5 and b/Indicators/RangeBars/DidiIndex.ex5 differ diff --git a/Indicators/RangeBars/DonchianChannel.ex5 b/Indicators/RangeBars/DonchianChannel.ex5 index 2a25110..95de63c 100644 Binary files a/Indicators/RangeBars/DonchianChannel.ex5 and b/Indicators/RangeBars/DonchianChannel.ex5 differ diff --git a/Indicators/RangeBars/Envelopes.ex5 b/Indicators/RangeBars/Envelopes.ex5 index 81fa4c6..9c7fda2 100644 Binary files a/Indicators/RangeBars/Envelopes.ex5 and b/Indicators/RangeBars/Envelopes.ex5 differ diff --git a/Indicators/RangeBars/Fractals.ex5 b/Indicators/RangeBars/Fractals.ex5 index 78afe33..87c9d41 100644 Binary files a/Indicators/RangeBars/Fractals.ex5 and b/Indicators/RangeBars/Fractals.ex5 differ diff --git a/Indicators/RangeBars/GMMA.ex5 b/Indicators/RangeBars/GMMA.ex5 index 6f06b64..648c92e 100644 Binary files a/Indicators/RangeBars/GMMA.ex5 and b/Indicators/RangeBars/GMMA.ex5 differ diff --git a/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 b/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 index 41ba70e..0ca1ad2 100644 Binary files a/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 and b/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 differ diff --git a/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 b/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 index ca5b8ef..ca233de 100644 Binary files a/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 and b/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 differ diff --git a/Indicators/RangeBars/HA_Smoothed.ex5 b/Indicators/RangeBars/HA_Smoothed.ex5 index 2bfe8e5..b110bf1 100644 Binary files a/Indicators/RangeBars/HA_Smoothed.ex5 and b/Indicators/RangeBars/HA_Smoothed.ex5 differ diff --git a/Indicators/RangeBars/HalfTrend.ex5 b/Indicators/RangeBars/HalfTrend.ex5 index f46b2ce..46810e0 100644 Binary files a/Indicators/RangeBars/HalfTrend.ex5 and b/Indicators/RangeBars/HalfTrend.ex5 differ diff --git a/Indicators/RangeBars/Heiken_Ashi.ex5 b/Indicators/RangeBars/Heiken_Ashi.ex5 index f53d99a..cd12a76 100644 Binary files a/Indicators/RangeBars/Heiken_Ashi.ex5 and b/Indicators/RangeBars/Heiken_Ashi.ex5 differ diff --git a/Indicators/RangeBars/Ichimoku.ex5 b/Indicators/RangeBars/Ichimoku.ex5 index 2d79198..a063dfe 100644 Binary files a/Indicators/RangeBars/Ichimoku.ex5 and b/Indicators/RangeBars/Ichimoku.ex5 differ diff --git a/Indicators/RangeBars/KeltnerChannel.ex5 b/Indicators/RangeBars/KeltnerChannel.ex5 index 52c8f17..09b24ea 100644 Binary files a/Indicators/RangeBars/KeltnerChannel.ex5 and b/Indicators/RangeBars/KeltnerChannel.ex5 differ diff --git a/Indicators/RangeBars/LRMA.ex5 b/Indicators/RangeBars/LRMA.ex5 index 7f8eceb..fd4159e 100644 Binary files a/Indicators/RangeBars/LRMA.ex5 and b/Indicators/RangeBars/LRMA.ex5 differ diff --git a/Indicators/RangeBars/LinearRegression.ex5 b/Indicators/RangeBars/LinearRegression.ex5 index d69d059..c92a2d7 100644 Binary files a/Indicators/RangeBars/LinearRegression.ex5 and b/Indicators/RangeBars/LinearRegression.ex5 differ diff --git a/Indicators/RangeBars/MA.ex5 b/Indicators/RangeBars/MA.ex5 index 7b2ad43..489b0e5 100644 Binary files a/Indicators/RangeBars/MA.ex5 and b/Indicators/RangeBars/MA.ex5 differ diff --git a/Indicators/RangeBars/MACD.ex5 b/Indicators/RangeBars/MACD.ex5 index a53e0df..bc2f961 100644 Binary files a/Indicators/RangeBars/MACD.ex5 and b/Indicators/RangeBars/MACD.ex5 differ diff --git a/Indicators/RangeBars/MACD_Line.ex5 b/Indicators/RangeBars/MACD_Line.ex5 index 7499334..d83cdac 100644 Binary files a/Indicators/RangeBars/MACD_Line.ex5 and b/Indicators/RangeBars/MACD_Line.ex5 differ diff --git a/Indicators/RangeBars/Momentum.ex5 b/Indicators/RangeBars/Momentum.ex5 index 0ca9736..ba8b2b1 100644 Binary files a/Indicators/RangeBars/Momentum.ex5 and b/Indicators/RangeBars/Momentum.ex5 differ diff --git a/Indicators/RangeBars/NRTR.ex5 b/Indicators/RangeBars/NRTR.ex5 index 18e8dee..bd3d1c2 100644 Binary files a/Indicators/RangeBars/NRTR.ex5 and b/Indicators/RangeBars/NRTR.ex5 differ diff --git a/Indicators/RangeBars/OBV.ex5 b/Indicators/RangeBars/OBV.ex5 index f743d20..9b09a55 100644 Binary files a/Indicators/RangeBars/OBV.ex5 and b/Indicators/RangeBars/OBV.ex5 differ diff --git a/Indicators/RangeBars/OscillatorCandles.ex5 b/Indicators/RangeBars/OscillatorCandles.ex5 index 3389e26..21bbbff 100644 Binary files a/Indicators/RangeBars/OscillatorCandles.ex5 and b/Indicators/RangeBars/OscillatorCandles.ex5 differ diff --git a/Indicators/RangeBars/ParabolicSAR.ex5 b/Indicators/RangeBars/ParabolicSAR.ex5 index 524658d..54f56f5 100644 Binary files a/Indicators/RangeBars/ParabolicSAR.ex5 and b/Indicators/RangeBars/ParabolicSAR.ex5 differ diff --git a/Indicators/RangeBars/ProVolume.ex5 b/Indicators/RangeBars/ProVolume.ex5 index 950afe3..98a86e0 100644 Binary files a/Indicators/RangeBars/ProVolume.ex5 and b/Indicators/RangeBars/ProVolume.ex5 differ diff --git a/Indicators/RangeBars/QQE.ex5 b/Indicators/RangeBars/QQE.ex5 index ba8bb00..7fd769c 100644 Binary files a/Indicators/RangeBars/QQE.ex5 and b/Indicators/RangeBars/QQE.ex5 differ diff --git a/Indicators/RangeBars/ROC.ex5 b/Indicators/RangeBars/ROC.ex5 index 59d018c..222f4a9 100644 Binary files a/Indicators/RangeBars/ROC.ex5 and b/Indicators/RangeBars/ROC.ex5 differ diff --git a/Indicators/RangeBars/RSI.ex5 b/Indicators/RangeBars/RSI.ex5 index e49b7bc..69f93e4 100644 Binary files a/Indicators/RangeBars/RSI.ex5 and b/Indicators/RangeBars/RSI.ex5 differ diff --git a/Indicators/RangeBars/RVI.ex5 b/Indicators/RangeBars/RVI.ex5 index 041af84..d173375 100644 Binary files a/Indicators/RangeBars/RVI.ex5 and b/Indicators/RangeBars/RVI.ex5 differ diff --git a/Indicators/RangeBars/StdDev.ex5 b/Indicators/RangeBars/StdDev.ex5 index 89bfd91..55219fe 100644 Binary files a/Indicators/RangeBars/StdDev.ex5 and b/Indicators/RangeBars/StdDev.ex5 differ diff --git a/Indicators/RangeBars/Stochastic.ex5 b/Indicators/RangeBars/Stochastic.ex5 index ab66c92..2f2c733 100644 Binary files a/Indicators/RangeBars/Stochastic.ex5 and b/Indicators/RangeBars/Stochastic.ex5 differ diff --git a/Indicators/RangeBars/T3.ex5 b/Indicators/RangeBars/T3.ex5 index 0261a3d..8b6f4bf 100644 Binary files a/Indicators/RangeBars/T3.ex5 and b/Indicators/RangeBars/T3.ex5 differ diff --git a/Indicators/RangeBars/TDI.ex5 b/Indicators/RangeBars/TDI.ex5 index dd8b2d3..cf92553 100644 Binary files a/Indicators/RangeBars/TDI.ex5 and b/Indicators/RangeBars/TDI.ex5 differ diff --git a/Indicators/RangeBars/TMA_CenteredBands.ex5 b/Indicators/RangeBars/TMA_CenteredBands.ex5 index 1979e62..69bda48 100644 Binary files a/Indicators/RangeBars/TMA_CenteredBands.ex5 and b/Indicators/RangeBars/TMA_CenteredBands.ex5 differ diff --git a/Indicators/RangeBars/TRIX.ex5 b/Indicators/RangeBars/TRIX.ex5 index bd139f6..3aec3e5 100644 Binary files a/Indicators/RangeBars/TRIX.ex5 and b/Indicators/RangeBars/TRIX.ex5 differ diff --git a/Indicators/RangeBars/TimeLine.ex5 b/Indicators/RangeBars/TimeLine.ex5 index 34da04c..3068e77 100644 Binary files a/Indicators/RangeBars/TimeLine.ex5 and b/Indicators/RangeBars/TimeLine.ex5 differ diff --git a/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 b/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 index 2800b0a..1243740 100644 Binary files a/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 and b/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 differ diff --git a/Indicators/RangeBars/VWAP_lite.ex5 b/Indicators/RangeBars/VWAP_lite.ex5 index 1e8e261..97543a2 100644 Binary files a/Indicators/RangeBars/VWAP_lite.ex5 and b/Indicators/RangeBars/VWAP_lite.ex5 differ diff --git a/Indicators/RangeBars/Volatility.ex5 b/Indicators/RangeBars/Volatility.ex5 index e9f644a..71481cb 100644 Binary files a/Indicators/RangeBars/Volatility.ex5 and b/Indicators/RangeBars/Volatility.ex5 differ diff --git a/Indicators/RangeBars/Volume_Average_percent.ex5 b/Indicators/RangeBars/Volume_Average_percent.ex5 index 33cd755..bc61a04 100644 Binary files a/Indicators/RangeBars/Volume_Average_percent.ex5 and b/Indicators/RangeBars/Volume_Average_percent.ex5 differ diff --git a/Indicators/RangeBars/Volumes.ex5 b/Indicators/RangeBars/Volumes.ex5 index d0e63c7..5848a2a 100644 Binary files a/Indicators/RangeBars/Volumes.ex5 and b/Indicators/RangeBars/Volumes.ex5 differ diff --git a/Indicators/RangeBars/WPR.ex5 b/Indicators/RangeBars/WPR.ex5 index 0e9ddec..a348f9f 100644 Binary files a/Indicators/RangeBars/WPR.ex5 and b/Indicators/RangeBars/WPR.ex5 differ diff --git a/Indicators/RangeBars/WeisWaves.ex5 b/Indicators/RangeBars/WeisWaves.ex5 index 4a296ce..bbbb474 100644 Binary files a/Indicators/RangeBars/WeisWaves.ex5 and b/Indicators/RangeBars/WeisWaves.ex5 differ diff --git a/Indicators/RangeBars/ZigZag.ex5 b/Indicators/RangeBars/ZigZag.ex5 index 54c2385..64b73ac 100644 Binary files a/Indicators/RangeBars/ZigZag.ex5 and b/Indicators/RangeBars/ZigZag.ex5 differ