diff --git a/Experts/2MA_Cross.ex5 b/Experts/2MA_Cross.ex5 new file mode 100644 index 0000000..7219401 Binary files /dev/null and b/Experts/2MA_Cross.ex5 differ diff --git a/Experts/2MA_Cross.mq5 b/Experts/2MA_Cross.mq5 new file mode 100644 index 0000000..c3b4195 --- /dev/null +++ b/Experts/2MA_Cross.mq5 @@ -0,0 +1,419 @@ +#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" +#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 - Fast moving average" +#property description "MA2 - Slow moving average" + +//#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 +// +// Uncomment only ONE of the 5 directives listed below and recompile +// ----------------------------------------------------------------- +// +#define EA_ON_RANGE_BARS // Use EA on RangeBar chart +//#define EA_ON_RENKO // Use EA on Renko charts +//#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 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 + +// +// Uncomment the directive below and recompile for use in a backtest only +// ---------------------------------------------------------------------- +// +// #define SHOW_INDICATOR_INPUTS + +// Include all needed files + +#ifdef EA_ON_RANGE_BARS + #include + RangeBars *customBars = NULL; +#endif +#ifdef EA_ON_RENKO + #include + MedianRenko *customBars = NULL; +#endif +#ifdef EA_ON_XTICK_CHART + #include + TickChart *customBars = NULL; +#endif +#ifdef EA_ON_TICK_VOLUME_CHART + #include + TickChart *customBars = NULL; +#endif +#ifdef EA_ON_SECONDS_CHART + #include + SecondsChart *customBars = NULL; +#endif +#ifdef EA_ON_LINEBREAK_CHART + #include + LineBreakChart *customBars = NULL; +#endif + +#include +#include + +enum ENUM_TRADE_DIRECTION +{ + TRADE_DIRECTION_BUY = POSITION_TYPE_BUY, // Buy + TRADE_DIRECTION_SELL = POSITION_TYPE_SELL, // Sell + TRADE_DIRECTION_ALL = 1000, // Buy & Sell +}; + +#ifdef SHOW_INDICATOR_INPUTS + 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 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 string Start="9:00"; // Start trading at +input string End="17:55"; // End trading at +input ulong MagicNumber=5150; // Assign trade ID +input int NumberOfRetries = 50; // Maximum number of retries +input int BusyTimeout_ms = 1000; // Wait [ms] before retry on bussy errors +input int RequoteTimeout_ms = 250; // Wait [ms] before retry on requotes + +// Global data buffers + +double MA1[]; // Buffer for moving average 1 +double MA2[]; // Buffer for moving average 2 + +// Read 3 rates & 3 MA values starting from current (uncompleted) bar + +int startAtBar = 0; +int numberOfBars = 3; + +// EA variables + +CMarketOrder *marketOrder = NULL; +CTimeControl *timeControl = NULL; + +ulong currentTicket; +ENUM_POSITION_TYPE currentPositionType; +ENUM_POSITION_TYPE signal; +ENUM_POSITION_TYPE validation; + +#ifdef EA_ON_RANGE_BARS + static int _MA1 = RANGEBAR_MA1; + static int _MA2 = RANGEBAR_MA2; +#endif +#ifdef EA_ON_RENKO + static int _MA1 = RENKO_MA1; + static int _MA2 = RENKO_MA2; +#endif +#ifdef EA_ON_XTICK_CHART + static int _MA1 = TICKCHART_MA1; + static int _MA2 = TICKCHART_MA2; +#endif +#ifdef EA_ON_TICK_VOLUME_CHART + static int _MA1 = VOLUMECHART_MA1; + static int _MA2 = VOLUMECHART_MA2; +#endif +#ifdef EA_ON_SECONDS_CHART + static int _MA1 = SECONDS_MA1; + static int _MA2 = SECONDS_MA2; +#endif +#ifdef EA_ON_LINEBREAK_CHART + static int _MA1 = LINEBREAK_MA1; + static int _MA2 = LINEBREAK_MA2; +#endif + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + if(customBars == NULL) + { + #ifdef EA_ON_RANGE_BARS + customBars = new RangeBars(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_RENKO + customBars = new MedianRenko(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_XTICK_CHART + customBars = new TickChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_TICK_VOLUME_CHART + customBars = new TickChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_SECONDS_CHART + customBars = new SecondsChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_LINEBREAK_CHART + customBars = new LineBreakChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + } + + customBars.Init(); + if(customBars.GetHandle() == INVALID_HANDLE) + return(INIT_FAILED); + + signal = POSITION_TYPE_NONE; + + CMarketOrderParameters params; + { + params.m_async_mode = false; + params.m_magic = MagicNumber; + params.m_deviation = DeviationPoints; + params.m_type_filling = ORDER_FILLING_FOK; + + params.numberOfRetries = NumberOfRetries; + params.busyTimeout_ms = BusyTimeout_ms; + params.requoteTimeout_ms = RequoteTimeout_ms; + } + + marketOrder = new CMarketOrder(params); + + if(timeControl == NULL) + { + timeControl = new CTimeControl(); + } + + timeControl.SetValidTraingHours(Start,End); + + return(INIT_SUCCEEDED); +} +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + customBars.Deinit(); + + // delete TimeControl class + + if(timeControl != NULL) + { + delete timeControl; + timeControl = NULL; + } + + // delete MarketOrder class + + if(marketOrder != NULL) + { + delete marketOrder; + marketOrder = NULL; + } + + // delete MedianRenko class + + if(customBars != NULL) + { + delete customBars; + customBars = NULL; + } + + Comment(""); +} +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + if(marketOrder == NULL || customBars == NULL || timeControl == NULL) + return; + + 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"); + } + + if(!timeControl.IsTradingTimeValid()) + { + if(marketOrder.IsOpen(currentTicket,_Symbol,MagicNumber)) + { + if(currentTicket > 0 && CloseTradeAfterTradingHours) + { + // close position outside of trading hours + marketOrder.Close(currentTicket); + } + } + + return; + } + + // + // Get moving average values for current, last completed bar and the bar before that... + // + + if(!customBars.GetMA(_MA1,MA1,startAtBar,numberOfBars)) + { + Print("Error getting values from MA1 - please enable MA1 on chart"); + } + else if(!customBars.GetMA(_MA2,MA2,startAtBar,numberOfBars)) + { + Print("Error getting values from MA2 - please enable MA2 on chart"); + } + else + { + + signal = MovingAverageCross(); + validation = MovingAverageValidation(); + + 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 MA cross signal = "+marketOrder.PositionTypeToString(signal)+ + "\n MA validation = "+marketOrder.PositionTypeToString(validation)+ + "\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 MA cross signal = "+marketOrder.PositionTypeToString(signal)+ + "\n MA validation = "+marketOrder.PositionTypeToString(validation)+ + "\n"); + } + + if(signal == POSITION_TYPE_BUY) + { + if(marketOrder.IsOpen(currentTicket,_Symbol,POSITION_TYPE_SELL,MagicNumber)) + { + if(currentTicket > 0 && ForceSR) + { + if(IsTradeDirectionValid(POSITION_TYPE_SELL)) + { + PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket); + marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + } + } + return; + } + else if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_BUY,MagicNumber)) + { + if(IsTradeDirectionValid(POSITION_TYPE_BUY)) + marketOrder.Long(_Symbol,Lots,StopLoss,TakeProfit); + + return; + } + } + else if(signal == POSITION_TYPE_SELL) + { + if(marketOrder.IsOpen(currentTicket,_Symbol,POSITION_TYPE_BUY,MagicNumber)) + { + if(currentTicket > 0 && ForceSR) + { + if(IsTradeDirectionValid(POSITION_TYPE_SELL)) + { + PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket); + marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + } + } + return; + } + else if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_SELL,MagicNumber)) + { + if(IsTradeDirectionValid(POSITION_TYPE_SELL)) + marketOrder.Short(_Symbol,Lots,StopLoss,TakeProfit); + + return; + } + } + + // + // Handling of crosses inside price gap + // Condition: No valid cross signal, but MA validation changed + // + + if(marketOrder.IsOpen(currentTicket,currentPositionType,_Symbol,MagicNumber)) + { + if(currentTicket > 0) + { + if((currentPositionType != validation) && (validation != POSITION_TYPE_NONE) && signal == POSITION_TYPE_NONE) + { + if(ReverseOnMACrossInsideGap) + { + // 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); + } + else + { + // close position on signal change inside gap. + PrintFormat("Closing %s position on signal change inside gap (ticket:%d)", _Symbol, currentTicket); + marketOrder.Close(currentTicket); + } + } + } + } + } + } +} + +// +// Trade direction validation (Is it OK to trade in the given direction?) +// + +bool IsTradeDirectionValid(ENUM_POSITION_TYPE signalDirection) +{ + if(ValidTradeDirection == TRADE_DIRECTION_ALL) + return true; + + if(signalDirection == POSITION_TYPE_BUY && ValidTradeDirection == TRADE_DIRECTION_BUY) + return true; + else if(signalDirection == POSITION_TYPE_SELL && ValidTradeDirection == TRADE_DIRECTION_SELL) + return true; + else + return false; +} + +// +// MA cross logic +// + +ENUM_POSITION_TYPE MovingAverageCross() +{ + if(2 < numberOfBars-1) + { + Alert("Invalid number of MA readings defined! MA Cross cannot be determined."); + return POSITION_TYPE_NONE; + } + + if((MA2[1] > MA1[1]) && (MA2[2] < MA1[2])) + return POSITION_TYPE_SELL; + else if((MA2[1] < MA1[1]) && (MA2[2] > MA1[2])) + return POSITION_TYPE_BUY; + else + return POSITION_TYPE_NONE; +} + +ENUM_POSITION_TYPE MovingAverageValidation() +{ + if(MA2[1] > MA1[1]) + return POSITION_TYPE_SELL; + else if(MA2[1] < MA1[1]) + return POSITION_TYPE_BUY; + + return POSITION_TYPE_NONE; +} diff --git a/Experts/PriceMA_Cross.ex5 b/Experts/PriceMA_Cross.ex5 new file mode 100644 index 0000000..53a26f2 Binary files /dev/null and b/Experts/PriceMA_Cross.ex5 differ diff --git a/Experts/PriceMA_Cross.mq5 b/Experts/PriceMA_Cross.mq5 new file mode 100644 index 0000000..64d6bb5 --- /dev/null +++ b/Experts/PriceMA_Cross.mq5 @@ -0,0 +1,439 @@ +#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." +#property description "MA1 needs to be enabled on the inicator creating the chart." + +//#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 + +// +// Uncomment only ONE of the 5 directives listed below and recompile +// ----------------------------------------------------------------- +// +#define EA_ON_RANGE_BARS // Use EA on RangeBar chart +//#define EA_ON_RENKO // Use EA on Renko charts +//#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 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 + +// +// Uncomment the directive below and recompile for use in a backtest only +// ---------------------------------------------------------------------- +// +// #define SHOW_INDICATOR_INPUTS + +// Include all needed files + +#ifdef EA_ON_RANGE_BARS + #include + RangeBars *customBars = NULL; +#endif +#ifdef EA_ON_RENKO + #include + MedianRenko *customBars = NULL; +#endif +#ifdef EA_ON_XTICK_CHART + #include + TickChart *customBars = NULL; +#endif +#ifdef EA_ON_TICK_VOLUME_CHART + #include + TickChart *customBars = NULL; +#endif +#ifdef EA_ON_SECONDS_CHART + #include + SecondsChart *customBars = NULL; +#endif +#ifdef EA_ON_LINEBREAK_CHART + #include + LineBreakChart *customBars = NULL; +#endif + +#include +#include + +enum ENUM_TRADE_DIRECTION +{ + TRADE_DIRECTION_BUY = POSITION_TYPE_BUY, // Buy + TRADE_DIRECTION_SELL = POSITION_TYPE_SELL, // Sell + TRADE_DIRECTION_ALL = 1000, // Buy & Sell +}; + +#ifdef SHOW_INDICATOR_INPUTS + input group "EA parameters" +#endif +input double Lots = 0.1; // Traded lots +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 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 string Start="9:00"; // Start trading at +input string End="17:55"; // End trading at +input ulong MagicNumber=8888; // Assign trade ID +input int NumberOfRetries = 50; // Maximum number of retries +input int BusyTimeout_ms = 1000; // Wait [ms] before retry on bussy errors +input int RequoteTimeout_ms = 250; // Wait [ms] before retry on requotes + +// Global data buffers + +MqlRates RateInfo[]; // Buffer for custom price bars +double MA1[]; // Buffer for moving average 1 + +// Read 4 rates MA1 values starting from current (uncompleted) bar + +int startAtBar = 0; +int numberOfBars; +int _confirmationBars; +int _prevSignalBars; + +// EA variables + +CMarketOrder *marketOrder; +CTimeControl *timeControl; + +ulong currentTicket; +ENUM_POSITION_TYPE currentPositionType; +ENUM_POSITION_TYPE signal; +ENUM_POSITION_TYPE validation; + +#ifdef EA_ON_RANGE_BARS + static int _MA1 = RANGEBAR_MA1; + static int _MA2 = RANGEBAR_MA2; +#endif +#ifdef EA_ON_RENKO + static int _MA1 = RENKO_MA1; + static int _MA2 = RENKO_MA2; +#endif +#ifdef EA_ON_XTICK_CHART + static int _MA1 = TICKCHART_MA1; + static int _MA2 = TICKCHART_MA2; +#endif +#ifdef EA_ON_TICK_VOLUME_CHART + static int _MA1 = VOLUMECHART_MA1; + static int _MA2 = VOLUMECHART_MA2; +#endif +#ifdef EA_ON_SECONDS_CHART + static int _MA1 = SECONDS_MA1; + static int _MA2 = SECONDS_MA2; +#endif +#ifdef EA_ON_LINEBREAK_CHART + static int _MA1 = LINEBREAK_MA1; + static int _MA2 = LINEBREAK_MA2; +#endif + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + if(customBars == NULL) + { + #ifdef EA_ON_RANGE_BARS + customBars = new RangeBars(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_RENKO + customBars = new MedianRenko(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_XTICK_CHART + customBars = new TickChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_TICK_VOLUME_CHART + customBars = new TickChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_SECONDS_CHART + customBars = new SecondsChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + #ifdef EA_ON_LINEBREAK_CHART + customBars = new LineBreakChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true); + #endif + } + + customBars.Init(); + + signal = POSITION_TYPE_NONE; + _confirmationBars = (ConfirmationBars < 1) ? 1 : ConfirmationBars; + _prevSignalBars = (PrevSignalBars < 1) ? 1 : PrevSignalBars; + numberOfBars = _confirmationBars + _prevSignalBars + 1; + + CMarketOrderParameters params; + { + params.m_async_mode = false; + params.m_magic = MagicNumber; + params.m_deviation = DeviationPoints; + params.m_type_filling = ORDER_FILLING_FOK; + + params.numberOfRetries = NumberOfRetries; + params.busyTimeout_ms = BusyTimeout_ms; + params.requoteTimeout_ms = RequoteTimeout_ms; + } + + marketOrder = new CMarketOrder(params); + + if(timeControl == NULL) + { + timeControl = new CTimeControl(); + } + + timeControl.SetValidTraingHours(Start,End); + + return(INIT_SUCCEEDED); +} +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + customBars.Deinit(); + + // delete TimeControl class + + if(timeControl != NULL) + { + delete timeControl; + timeControl = NULL; + } + + // delete MarketOrder class + + if(marketOrder != NULL) + { + delete marketOrder; + marketOrder = NULL; + } + + // delete MedianRenko class + + if(customBars != NULL) + { + delete customBars; + customBars = NULL; + } + + Comment(""); +} +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + if(marketOrder == NULL) + return; + + 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"); + } + + if(!timeControl.IsTradingTimeValid()) + { + if(marketOrder.IsOpen(currentTicket,_Symbol,MagicNumber)) + { + if(currentTicket > 0 && CloseTradeAfterTradingHours) + { + // close position outside of trading hours + marketOrder.Close(currentTicket); + } + } + + return; + } + + // + // Get MqlRateInfo & moving average values for current, last completed bar and the bar before that... + // + + if(!customBars.GetMqlRates(RateInfo,startAtBar,numberOfBars)) + { + Print("Error getting MqlRates for custom chart"); + } + else if(!customBars.GetMA(_MA1, MA1, startAtBar, numberOfBars)) + { + Print("Error getting values from MA1 - please enable MA1 on chart"); + } + else + { + + signal = PriceAndMovingAverageCross(_confirmationBars, _prevSignalBars); + + 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 Price & MA cross signal = "+marketOrder.PositionTypeToString(signal)+ + "\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 Price & MA cross signal = "+marketOrder.PositionTypeToString(signal)+ + "\n"); + } + + if(signal == POSITION_TYPE_BUY) + { + if(marketOrder.IsOpen(currentTicket,_Symbol,POSITION_TYPE_SELL,MagicNumber)) + { + if(currentTicket > 0 && ForceSR) + { + if(IsTradeDirectionValid(POSITION_TYPE_SELL)) + { + PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket); + marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + } + } + else if(currentTicket > 0) + { + // close trade on signal change + if(CloseTradeOnSignalChange) + { + PrintFormat("Closing %s position on signal change (ticket:%d)", _Symbol, currentTicket); + marketOrder.Close(currentTicket); + } + } + return; + } + + if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_BUY,MagicNumber)) + { + if(IsTradeDirectionValid(POSITION_TYPE_BUY)) + marketOrder.Long(_Symbol,Lots,StopLoss,TakeProfit); + + return; + } + } + else if(signal == POSITION_TYPE_SELL) + { + if(marketOrder.IsOpen(currentTicket,_Symbol,POSITION_TYPE_BUY,MagicNumber)) + { + if(currentTicket > 0 && ForceSR) + { + if(IsTradeDirectionValid(POSITION_TYPE_BUY)) + { + PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket); + marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit); + } + } + else if(currentTicket > 0) + { + // close trade on signal change + if(CloseTradeOnSignalChange) + { + PrintFormat("Closing %s position on signal change (ticket:%d)", _Symbol, currentTicket); + marketOrder.Close(currentTicket); + } + } + return; + } + + if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_SELL,MagicNumber)) + { + if(IsTradeDirectionValid(POSITION_TYPE_SELL)) + marketOrder.Short(_Symbol,Lots,StopLoss,TakeProfit); + + return; + } + } + } + } +} + +// +// Trade direction validation (Is it OK to trade in the given direction?) +// + +bool IsTradeDirectionValid(ENUM_POSITION_TYPE signalDirection) +{ + if(ValidTradeDirection == TRADE_DIRECTION_ALL) + return true; + + if(signalDirection == POSITION_TYPE_BUY && ValidTradeDirection == TRADE_DIRECTION_BUY) + return true; + else if(signalDirection == POSITION_TYPE_SELL && ValidTradeDirection == TRADE_DIRECTION_SELL) + return true; + else + return false; +} + +// +// Price & MA cross logic +// + +ENUM_POSITION_TYPE PriceAndMovingAverageCross(int confirmationBars, int prevSignalBars) +{ + if(numberOfBars < confirmationBars+1) + { + Alert("Invalid number of MqlRates and MA readings defined! Crossover cannot be determined."); + return POSITION_TYPE_NONE; + } + + bool confirmedSell = true; + bool confirmedBuy = true; + + // check trailing bar for confirmation of previous signal + for(int i=(confirmationBars+1); i<=(confirmationBars+prevSignalBars); i++) + { + if(RateInfo[i].close > MA1[i]) + { + confirmedBuy = false; + } + else if(RateInfo[i].close < MA1[i]) + { + confirmedSell = false; + } + } + + // check confirmation bars for current signal + for(int i=1; i<=confirmationBars; i++) + { + if(RateInfo[i].close == MA1[i]) + { + confirmedSell = false; + confirmedBuy = false; + } + else if(RateInfo[i].close < MA1[i]) + { + confirmedBuy = false; + } + else if(RateInfo[i].close > MA1[i]) + { + confirmedSell = false; + } + } + + // signal aggregate + if(confirmedSell) + return POSITION_TYPE_SELL; + else if(confirmedBuy) + return POSITION_TYPE_BUY; + else + return POSITION_TYPE_NONE; +} + diff --git a/Experts/RangeBars_ExampleEA.ex5 b/Experts/RangeBars_ExampleEA.ex5 new file mode 100644 index 0000000..ba913e6 Binary files /dev/null and b/Experts/RangeBars_ExampleEA.ex5 differ diff --git a/Experts/RangeBars_ExampleEA.mq5 b/Experts/RangeBars_ExampleEA.mq5 index 03cf7b9..d8fd82e 100644 --- a/Experts/RangeBars_ExampleEA.mq5 +++ b/Experts/RangeBars_ExampleEA.mq5 @@ -5,6 +5,8 @@ input int InpRSIPeriod = 14; // RSI period +//#define DEVELOPER_VERSION // used when I develop ;) should always be commented out + // // SHOW_INDICATOR_INPUTS *NEEDS* to be defined, if the sEA needs to be *tested in MT5's backtester* // ------------------------------------------------------------------------------------------------- diff --git a/Experts/RangeBars_ExampleEA2.ex5 b/Experts/RangeBars_ExampleEA2.ex5 new file mode 100644 index 0000000..dd36d3d Binary files /dev/null and b/Experts/RangeBars_ExampleEA2.ex5 differ diff --git a/Experts/RangeBars_ExampleEA2.mq5 b/Experts/RangeBars_ExampleEA2.mq5 index 8c40817..4606d57 100644 --- a/Experts/RangeBars_ExampleEA2.mq5 +++ b/Experts/RangeBars_ExampleEA2.mq5 @@ -8,9 +8,10 @@ // Helper functions for placing market orders. // -#define DEVELOPER_VERSION #include +//#define DEVELOPER_VERSION // used when I develop ;) should always be commented out + // // Inputs // @@ -40,7 +41,7 @@ ulong currentTicket; // the RangeBars indicator attached. // -#define SHOW_INDICATOR_INPUTS +//#define SHOW_INDICATOR_INPUTS // // You need to include the RangeBars.mqh header file diff --git a/Include/AZ-INVEST/CustomBarConfig.mqh b/Include/AZ-INVEST/CustomBarConfig.mqh new file mode 100644 index 0000000..f9ce63e --- /dev/null +++ b/Include/AZ-INVEST/CustomBarConfig.mqh @@ -0,0 +1,52 @@ +//#define DEVELOPER_VERSION +//#define DISPLAY_DEBUG_MSG +#define MQL5_MARKET_VERSION + +//#define P_RENKO_BR_PRO +//#define ULTIMATE_RENKO_LICENSE +#define RANGEBAR_LICENSE +//#define SECONDSCHART_LICENSE +//#define TICKCHART_LICENSE (obsolete) +//#define VOLUMECHART_LICENSE +//#define LINEBREAKCHART_LICENSE + +#ifdef P_RENKO_BR_PRO + #include + #define AZINVEST_CCI MedianRenkoIndicator +#endif + +#ifdef TICKCHART_LICENSE + #include + #define AZINVEST_CCI TickChartIndicator +#endif + +#ifdef RANGEBAR_LICENSE + #include + #define AZINVEST_CCI RangeBarIndicator +#endif + +#ifdef ULTIMATE_RENKO_LICENSE + #include + #define AZINVEST_CCI MedianRenkoIndicator +#endif + +#ifdef SECONDSCHART_LICENSE + #include + #define AZINVEST_CCI SecondsChartIndicator +#endif + +#ifdef VOLUMECHART_LICENSE + #include + #define AZINVEST_CCI VolumeChartIndicator +#endif + +#ifdef LINEBREAKCHART_LICENSE + #include + #define AZINVEST_CCI LineBreakChartIndicator +#endif + + +#ifdef AZINVEST_CCI + AZINVEST_CCI customChartIndicator; +#endif + diff --git a/Include/AZ-INVEST/SDK/CommonSettings.mqh b/Include/AZ-INVEST/SDK/CommonSettings.mqh index f96ecc5..9c400f7 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 b96e006..e28699e 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 new file mode 100644 index 0000000..7b88ab9 Binary files /dev/null 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 8357e91..3ab0686 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/RSI.mqh b/Include/AZ-INVEST/SDK/RSI.mqh new file mode 100644 index 0000000..e2b7ac6 --- /dev/null +++ b/Include/AZ-INVEST/SDK/RSI.mqh @@ -0,0 +1,83 @@ +// RSI on Buffer + +int RsiOnBuffer(const int rates_total,const int prev_calculated,const int begin, + const int period,const double& price[],double& rsiBuffer[], double &posBuffer[], double &negBuffer[]) +{ + int i, pos; + double diff; + +//--- check for data + if(period<=1 || rates_total-begin0) + sump+=diff; + else + sumn-=diff; + } + //--- calculate first visible value + posBuffer[period]=sump/period; + negBuffer[period]=sumn/period; + if(negBuffer[period]!=0.0) + rsiBuffer[period]=100.0-(100.0/(1.0+posBuffer[period]/negBuffer[period])); + else + { + if(posBuffer[period]!=0.0) + rsiBuffer[period]=100.0; + else + rsiBuffer[period]=50.0; + } + //--- prepare the position value for main calculation + pos=period+1; + } +//--- the main loop of calculations + for(i=pos; i0.0?diff:0.0))/period; + negBuffer[i]=(negBuffer[i-1]*(period-1)+(diff<0.0?-diff:0.0))/period; + if(negBuffer[i]!=0.0) + rsiBuffer[i]=100.0-100.0/(1+posBuffer[i]/negBuffer[i]); + else + { + if(posBuffer[i]!=0.0) + rsiBuffer[i]=100.0; + else + rsiBuffer[i]=50.0; + } + } +//--- restore as_series flags + if(as_series_price) ArraySetAsSeries(price,true); + if(as_series_rsibuffer) ArraySetAsSeries(rsiBuffer,true); + if(as_series_posbuffer) ArraySetAsSeries(posBuffer,true); + if(as_series_negbuffer) ArraySetAsSeries(negBuffer,true); +//--- + return(rates_total); +} + +//+------------------------------------------------------------------+ diff --git a/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh b/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh index bbd2ec0..851ec50 100644 --- a/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh +++ b/Include/AZ-INVEST/SDK/RangeBarCustomChartSettings.mqh @@ -23,13 +23,16 @@ #else // user defined settings - input int barSizeInTicks = 100; // Range bar size (in ticks) + 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 - ENUM_TIMEFRAMES atrTimeFrame = PERIOD_D1; // Use ATR period + input ENUM_TIMEFRAMES atrTimeFrame = PERIOD_D1; // Use ATR period input int atrPeriod = 14; // ATR period input int atrPercentage = 10; // Use percentage of ATR - input int showNumberOfDays = 5; // Show history for number of days + input group "### Chart synchronization" input ENUM_BOOL resetOpenOnNewTradingDay = true; // Synchronize first bar's open on new day #endif diff --git a/Include/AZ-INVEST/SDK/RangeBars.mqh b/Include/AZ-INVEST/SDK/RangeBars.mqh index 445b6bd..9662a0e 100644 --- a/Include/AZ-INVEST/SDK/RangeBars.mqh +++ b/Include/AZ-INVEST/SDK/RangeBars.mqh @@ -4,7 +4,15 @@ #ifdef DEVELOPER_VERSION #define RANGEBAR_INDICATOR_NAME "RangeBars\\RangeBarsOverlay300" #else - #define RANGEBAR_INDICATOR_NAME "Market\\Range Bars Charting" + #ifdef RANGEBAR_LICENSE + #ifdef MQL5_MARKET_VERSION + #define RANGEBAR_INDICATOR_NAME "Market\\Range Bars Charting" + #else + #define RANGEBAR_INDICATOR_NAME "RangeBars" + #endif + #else + #define RANGEBAR_INDICATOR_NAME "Market\\Range Bars Charting" + #endif #endif #define RANGEBAR_OPEN 00 @@ -188,50 +196,46 @@ int RangeBars::Init() rangeBarsHandle = iCustom(this.rangeBarsSymbol, _Period, RANGEBAR_INDICATOR_NAME, s.barSizeInTicks, + s.showNumberOfDays, + "=", s.atrEnabled, - //s.atrTimeFrame, + s.atrTimeFrame, s.atrPeriod, s.atrPercentage, - s.showNumberOfDays, s.resetOpenOnNewTradingDay, - TradingSessionTime, + "=", + s.resetOpenOnNewTradingDay, + "=", showPivots, pivotPointCalculationType, - RColor, - PColor, - SColor, - PDHColor, - PDLColor, - PDCColor, + "=", AlertMeWhen, AlertNotificationType, - cis.MA1on, + "=", cis.MA1lineType, cis.MA1period, cis.MA1method, cis.MA1applyTo, cis.MA1shift, cis.MA1priceLabel, - cis.MA2on, cis.MA2lineType, cis.MA2period, cis.MA2method, cis.MA2applyTo, cis.MA2shift, cis.MA2priceLabel, - cis.MA3on, cis.MA3lineType, cis.MA3period, cis.MA3method, cis.MA3applyTo, cis.MA3shift, cis.MA3priceLabel, - cis.MA4on, cis.MA4lineType, cis.MA4period, cis.MA4method, cis.MA4applyTo, cis.MA4shift, cis.MA4priceLabel, + "=", cis.ShowChannel, cis.ChannelPeriod, cis.ChannelAtrPeriod, @@ -240,6 +244,7 @@ int RangeBars::Init() cis.ChannelBandsDeviations, cis.ChannelPriceLabel, cis.ChannelMidPriceLabel, + "=", true); // used in EA // TopBottomPaddingPercentage, // showCurrentBarOpenTime, diff --git a/Include/AZ-INVEST/SDK/TimeControl.mqh b/Include/AZ-INVEST/SDK/TimeControl.mqh new file mode 100644 index 0000000..05e8606 --- /dev/null +++ b/Include/AZ-INVEST/SDK/TimeControl.mqh @@ -0,0 +1,76 @@ +// +// Copyright 2018-19, Artur Zas +// https://www.az-invest.eu +// https://www.mql5.com/en/users/arturz +// + +class CTimeControl +{ + private: + + int startHH; + int startMM; + string start; + + int endHH; + int endMM; + string end; + + bool scheduleEnabled; + + public: + + void SetValidTraingHours(string _from = "0:00", string _to = "0:00"); + bool IsTradingTimeValid(); + bool IsScheduleEnabled() { return scheduleEnabled; }; + void StringToHHMM(string value, int &HH, int &MM); +}; + +void CTimeControl::SetValidTraingHours(string _from,string _to) +{ + this.start = _from; + this.end = _to; + + StringToHHMM(this.start, this.startHH, this.startMM); + StringToHHMM(this.end, this.endHH, this.endMM); + + if(this.startHH == 0 && this.startMM == 0 && this.endHH == 0 && this.endMM == 0) + { + scheduleEnabled = false; + } + else + { + scheduleEnabled = true; + } +} + +bool CTimeControl::IsTradingTimeValid() +{ + if(scheduleEnabled == false) + return true; + + datetime now = TimeCurrent(); + + MqlDateTime temp; + TimeToStruct(now,temp); + + datetime _start = StringToTime((string)temp.year+"."+(string)temp.mon+"."+(string)temp.day+" "+this.start); + datetime _end = StringToTime((string)temp.year+"."+(string)temp.mon+"."+(string)temp.day+" "+this.end); + + if((now >= _start) && (now <= _end)) + return true; + else + return false; +} + +void CTimeControl::StringToHHMM(string value, int &HH, int &MM) +{ + MqlDateTime temp; + TimeToStruct(TimeCurrent(),temp); + + datetime fullDateTime = StringToTime((string)temp.year+"."+(string)temp.mon+"."+(string)temp.day+" "+value); + TimeToStruct(fullDateTime,temp); + + HH = temp.hour; + MM = temp.min; +} \ No newline at end of file diff --git a/Include/IncOnRingBuffer/cadxonringbuffer.mqh b/Include/IncOnRingBuffer/cadxonringbuffer.mqh new file mode 100644 index 0000000..ad6a34a --- /dev/null +++ b/Include/IncOnRingBuffer/cadxonringbuffer.mqh @@ -0,0 +1,235 @@ +//+------------------------------------------------------------------+ +//| CADXOnRingBuffer.mqh | +//| Copyright 2012, Konstantin Gruzdev | +//| https://login.mql5.com/ru/users/Lizar | +//| Revision 01 Dec 2012 | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2012, Konstantin Gruzdev" +#property link "https://login.mql5.com/ru/users/Lizar" + +//--- Class to calculate the MA using the ring buffer: +#include +//+------------------------------------------------------------------+ +//| Class CADXOnRingBuffer | +//| Appointment: class is designed for the calculation of the | +//| ADX indicator (Average Directional Movement Index, | +//| ADX) using the class for working with the ring | +//| buffer. | +//| Link: http://www.mql5.com/ru/code/1343 | +//+------------------------------------------------------------------+ +class CADXOnRingBuffer + { +public: + CMAOnRingBuffer pdi; // positive directional index + CMAOnRingBuffer ndi; // negative directional index +private: + CMAOnRingBuffer m_adx; // average directional movement index + string m_name; // indicator name + bool m_as_series; // true, if the indexing as in time series + int m_bars_required; // number of elements required to calculate + int m_begin; // index of the first significant element + int m_start; // index of element to start the calculation + int m_index; // current element index + + double m_high; // maximal value + double m_low; // minimal value + double m_close; // closing price + double m_phigh; // maximum value of the previous bar + double m_plow; // minimum value of the previous bar + double m_pclose; // closing price of the previous bar + + double m_PD; + double m_ND; +public: + CADXOnRingBuffer() {} + ~CADXOnRingBuffer() {} + //--- initialization method: + bool Init(int ma_period=14, + ENUM_MA_METHOD ma_method=MODE_EMA, + int size_buffer=256, + bool as_series=false); + //--- basic methods: + int MainOnArray(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]); + double MainOnValue(const int rates_total, + const int prev_calculated, + const int begin, + const double high, + const double low, + const double close, + const int index); + //--- methods to get access to private data: + int BarsRequired() { return(m_bars_required); } + string NameADX() { return("ADX"+m_name); } + string NameNDI() { return("-DI"+m_name); } + string NamePDI() { return("+DI"+m_name); } + string MAMethod() { return(m_adx.MAMethod()); } + int MAPeriod() { return(m_adx.MAPeriod()); } + int Size() { return(m_adx.Size()); } + //--- returns the value of element with the specified index: + double operator [](const int index) const { return(m_adx.At(index)); } +private: + //--- indicator calculation method: + void ADX(const int rates_total, const int prev_calculated); + }; + +//+------------------------------------------------------------------+ +//| Initialization method | +//+------------------------------------------------------------------+ +bool CADXOnRingBuffer :: Init(int ma_period=14,ENUM_MA_METHOD ma_method=MODE_EMA, int size_buffer=256, bool as_series=false) + { +//--- initialize the CMAOnRingBuffer class instances: + if(!pdi.Init(ma_period,ma_method,size_buffer)) return false; + if(!ndi.Init(ma_period,ma_method,size_buffer)) return false; + if(!m_adx.Init(ma_period,ma_method,size_buffer)) return false; +//--- + m_name="("+IntegerToString(ma_period)+","+MAMethod()+")"; +//--- + m_as_series=as_series; + m_bars_required=m_adx.BarsRequired()+1; + return true; + } + +//+------------------------------------------------------------------+ +//| Indicator on array | +//+------------------------------------------------------------------+ +int CADXOnRingBuffer :: MainOnArray(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//--- save as_series flags: + bool as_series_high = ArrayGetAsSeries(high); + bool as_series_low = ArrayGetAsSeries(low); + bool as_series_close = ArrayGetAsSeries(close); + if(as_series_high) ArraySetAsSeries(high, false); + if(as_series_low) ArraySetAsSeries(low, false); + if(as_series_close) ArraySetAsSeries(close,false); +//--- first calculation: + if(prev_calculated==0) + { + for(int i=0;idTmpN) dTmpN=0.0; + else + { + if(dTmpPm_size) + { + int set_size=ArrayResize(m_data,new_size); + if(set_size<0) return(false); + //--- copy elements to restore their order: + if(set_size>m_size) + { + for(int i=m_size-1,j=set_size-1;i>m_last_pos;i--,j--) + { + m_data[j]=m_data[i]; + m_data[i]=m_filling; + } + } + m_size=set_size; + //--- result: + return(true); + } +//--- reduce array size: + //--- prepare array to reduce the size: + if(new_size>m_last_pos+1) + for(int i=m_size-1,j=new_size-1;j>m_last_pos;i--,j--) m_data[j]=m_data[i]; + else + { + for(int i=m_last_pos+1-new_size,j=0;i<=m_last_pos;i++,j++) m_data[j]=m_data[i]; + m_last_pos=new_size-1; + } + //--- reduce the size: + m_size=new_size; + ArrayResize(m_data,new_size); +//--- result: + return(true); + } + +//+------------------------------------------------------------------+ +//| Adding a new element to the buffer. | +//+------------------------------------------------------------------+ +void CArrayRing::Add(const double element) + { + m_last_pos=++m_last_pos%m_size; + m_data[m_last_pos]=element; + } + +//+------------------------------------------------------------------+ +//| Gets the element at the specified index. | +//+------------------------------------------------------------------+ +double CArrayRing::At(const int index) const + { +//--- check the index correctness: + if((index/m_size)==0) +//--- return the value of element with the specified index: + return(m_data[(m_size+m_last_pos-index)%m_size]); +//--- if the index is wrong: + return(DBL_MAX); + } + +//+------------------------------------------------------------------+ +//| Update the element at the specified position in the array. | +//+------------------------------------------------------------------+ +bool CArrayRing::Update(const double element,const int index=0) + { +//--- check the index correctness: + if((index/m_size)==0) + { +//--- update + m_data[(m_size+m_last_pos-index)%m_size]=element; +//--- successful + return(true); + } +//--- if the index is wrong: + return(false); + } + + diff --git a/Include/IncOnRingBuffer/catronringbuffer.mqh b/Include/IncOnRingBuffer/catronringbuffer.mqh new file mode 100644 index 0000000..419f764 --- /dev/null +++ b/Include/IncOnRingBuffer/catronringbuffer.mqh @@ -0,0 +1,154 @@ +//+------------------------------------------------------------------+ +//| CATROnRingBuffer.mqh | +//| Copyright 2012, Konstantin Gruzdev | +//| https://login.mql5.com/ru/users/Lizar | +//| Revision 01 Dec 2012 | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2012, Konstantin Gruzdev" +#property link "https://login.mql5.com/ru/users/Lizar" + +//--- Class to calculate the MA using the ring buffer: +#include +//+------------------------------------------------------------------+ +//| Class CATROnRingBuffer | +//| Appointment: class is designed for the calculation of the | +//| technical indicator Average True Range (Average | +//| True Range, ATR) using the class for working with | +//| the ring buffer. | +//| Link: http://www.mql5.com/ru/code/1344 | +//+------------------------------------------------------------------+ +class CATROnRingBuffer + { +private: + CMAOnRingBuffer m_ma; // instance the class for MA calculation + double m_tr; // true range + double m_atr; // average true range + string m_name; // indicator name + bool m_as_series; // true, if the indexing as in time series + int m_bars_required; // number of elements required to calculate + int m_begin; // index of the first significant element + int m_start; // index of element to start the calculation + int m_index; // current element index + double m_close; // closing price of the current bar + double m_prev_close; // closing price of the previous bar +public: + CATROnRingBuffer() {} + ~CATROnRingBuffer() {} + //--- initialization method: + bool Init(int ma_period=14,ENUM_MA_METHOD ma_method=MODE_SMA, int size_buffer=256, bool as_series=false); + //--- basic methods: + int MainOnArray(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]); + double MainOnValue(const int rates_total, + const int prev_calculated, + const int begin, + const double high, + const double low, + const double close, + const int index); + //--- methods to get access to private data: + int BarsRequired() { return(m_bars_required); } + string Name() { return(m_name); } + string MAMethod() { return(m_ma.MAMethod()); } + int MAPeriod() { return(m_ma.MAPeriod()); } + int Size() { return(m_ma.Size()); } + //--- returns the value of element with the specified index: + double operator [](const int index) const { return(m_ma.At(index)); } + }; + +//+------------------------------------------------------------------+ +//| Initialization method | +//+------------------------------------------------------------------+ +bool CATROnRingBuffer :: Init(int ma_period=14,ENUM_MA_METHOD ma_method=MODE_SMA, int size_buffer=256, bool as_series=false) + { +//--- Initialization for MA: + if(!m_ma.Init(ma_period,ma_method,size_buffer)) return false; +//--- + m_as_series=as_series; + m_bars_required=m_ma.BarsRequired()+1; + m_name="ATR("+IntegerToString(ma_period)+","+MAMethod()+")"; +//--- + return true; + } + +//+------------------------------------------------------------------+ +//| Indicator on array | +//+------------------------------------------------------------------+ +int CATROnRingBuffer :: MainOnArray(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//--- save as_series flags: + bool as_series_high = ArrayGetAsSeries(high); + bool as_series_low = ArrayGetAsSeries(low); + bool as_series_close = ArrayGetAsSeries(close); + if(as_series_high) ArraySetAsSeries(high, false); + if(as_series_low) ArraySetAsSeries(low, false); + if(as_series_close) ArraySetAsSeries(close,false); +//--- first calculation: + if(prev_calculated==0) + { + for(int i=0;i +//+------------------------------------------------------------------+ +//| Class CMAOnRingBuffer | +//| Appointment: class is designed to calculate a moving averages | +//| using the class for working with the ring | +//| buffer. | +//| Link: http://www.mql5.com/ru/code/1342 | +//+------------------------------------------------------------------+ +class CMAOnRingBuffer :public CArrayRing + { +private: + CArrayRing *m_array_in; // ring buffer for input data + int m_ma_period; // number of elements to analyze + ENUM_MA_METHOD m_ma_method; // MA calculation method + bool m_as_series; // true, if the indexing as in time series + double m_k1,m_k2; + double m_LK[]; + string m_name; // indicator name + int m_bars_required; // number of elements required to calculate + int m_start; // index of element to start the calculation + int m_index; // current element index + +public: + CMAOnRingBuffer() {} + ~CMAOnRingBuffer(); + //--- initialization method: + bool Init(int ma_period=14,ENUM_MA_METHOD ma_method=MODE_SMA, int size_buffer=256, bool as_series=false); + //--- basic methods: + int MainOnArray(const int rates_total, const int prev_calculated,const double &array[]); + double MainOnValue(const int rates_total, const int prev_calculated, const int begin, const double value, const int index); + //--- methods to get access to private data: + int BarsRequired() { return(m_bars_required); } + string Name() { return(m_name); } + string MAMethod() { return(MethodToString(m_ma_method)); } + int MAPeriod() { return(m_ma_period); } + //--- returns the value of element with the specified index: + double operator [](const int index) const { return(At(index)); } + +private: + //--- methods of calculation based on the array of input data: + void SMAOnArray (const int rates_total, const int prev_calculated, const double &array[]); + void EMAOnArray (const int rates_total, const int prev_calculated, const double &array[]); + void LWMAOnArray(const int rates_total, const int prev_calculated, const double &array[]); + //--- methods to calculate the sequential values ??of the indicator elements: + double SMAOnValue (const int prev_calculated, const int begin, const double value, const int index); + double EMAOnValue (const int prev_calculated, const int begin, const double value, const int index); + double LWMAOnValue(const int prev_calculated, const int begin, const double value, const int index); + //--- auxiliary methods: + int Begin(const int rates_total,const double &array[]); + bool FillArrayIn(const int prev_calculated, const double value); + string MethodToString(ENUM_MA_METHOD method); + }; + +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +void CMAOnRingBuffer:: ~CMAOnRingBuffer() + { + if(CheckPointer(m_array_in)!=POINTER_INVALID) delete m_array_in; + } + +//+------------------------------------------------------------------+ +//| Indicator on array | +//+------------------------------------------------------------------+ +int CMAOnRingBuffer:: MainOnArray(const int rates_total,const int prev_calculated,const double &array[]) + { +//--- save as_series flags + bool as_series=ArrayGetAsSeries(array); + if(as_series) ArraySetAsSeries(array,false); +//--- main calculation: + switch(m_ma_method) + { + case MODE_SMA: SMAOnArray(rates_total,prev_calculated,array); break; + case MODE_EMA: + case MODE_SMMA: EMAOnArray(rates_total,prev_calculated,array); break; + case MODE_LWMA: LWMAOnArray(rates_total,prev_calculated,array); break; + } +//--- restore as_series flags + if(as_series) ArraySetAsSeries(array,true); +//--- return value of prev_calculated for next call + return(rates_total); + } + +//+------------------------------------------------------------------+ +//| Indicator on value | +//+------------------------------------------------------------------+ +double CMAOnRingBuffer:: MainOnValue(const int rates_total, const int prev_calculated, const int begin, const double value, const int index) + { +//--- check as_series flags: + if(m_as_series) m_index=rates_total-1-index; + else m_index=index; +//--- check begin: + if(m_indexm_start-m_ma_period;i--) sum+=array[i]; + Last(sum/m_ma_period); + } +//--- number of bars was changed: + else + { + m_start=prev_calculated-1; + Last(At(1)-(array[m_start-m_ma_period]-array[m_start])/m_ma_period); + } +//--- main loop + for(int i=m_start+1;i +#include + +CATROnRingBuffer atr; +CADXOnRingBuffer adx; +int _start = 0; + +// +// Initialize custom chart indicator for data processing +// according to settings of the custom chart indicator already on chart +// + +#include + +// +// +// + +int OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,crossUp,INDICATOR_DATA); PlotIndexSetInteger(0,PLOT_ARROW,233); + SetIndexBuffer(1,crossDn,INDICATOR_DATA); PlotIndexSetInteger(1,PLOT_ARROW,234); + SetIndexBuffer(2,cross); + + if(!adx.Init(AdxPeriod,MODE_EMA,lookback)) return(INIT_FAILED); + if(!atr.Init(15,MODE_SMA,lookback)) return(INIT_FAILED); + + customChartIndicator.SetGetTimeFlag(); + + IndicatorSetString(INDICATOR_SHORTNAME,"ADX cross "+(string)AdxPeriod+")"); + return(INIT_SUCCEEDED); +} + +void OnDeinit(const int reason) +{ +} + +int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + atr.MainOnArray(rates_total,_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close); + adx.MainOnArray(rates_total,_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close); + + ArraySetAsSeries(customChartIndicator.Low, false); + ArraySetAsSeries(customChartIndicator.High, false); + + if(_prev_calculated==0) + { + _start = rates_total-adx.Size()+1; + } + else + _start = MathMax(_prev_calculated-1,1); + + for(int i=_start;i0) ? (adx.pdi[ix]>adx.ndi[ix]) ? 1 : (adx.pdi[ix]0 && cross[i]!=cross[i-1]) + { + if (cross[i] == 1) crossUp[i] = customChartIndicator.Low[i]-atr[ix]; + if (cross[i] == 2) crossDn[i] = customChartIndicator.High[i]+atr[ix]; + } + } + + manageAlerts(customChartIndicator.Time,cross,rates_total); + return (rates_total); +} + +//------------------------------------------------------------------ +// +//------------------------------------------------------------------ +// +// +// +// +// + +void manageAlerts(const datetime& _time[], double& _trend[], int bars) +{ + if (alertsOn) + { + int whichBar = bars-1; if (!alertsOnCurrent) whichBar = bars-2; datetime time1 = _time[whichBar]; + if (_trend[whichBar] != _trend[whichBar-1]) + { + if (_trend[whichBar] == 1) doAlert(time1," plus DI crossing minus DI up"); + if (_trend[whichBar] == 2) doAlert(time1," plus DI crossing minus DI down"); + } + } +} + +// +// +// +// +// + +void doAlert(datetime forTime, string doWhat) +{ + static string previousAlert="nothing"; + static datetime previousTime; + + if (previousAlert != doWhat || previousTime != forTime) + { + previousAlert = doWhat; + previousTime = forTime; + + // + // + // + // + // + + string message = TimeToString(TimeLocal(),TIME_SECONDS)+" "+_Symbol+" Adx "+doWhat; + if (alertsMessage) Alert(message); + if (alertsEmail) SendMail(_Symbol+"Adx",message); + if (alertsNotify) SendNotification(message); + if (alertsSound) PlaySound("alert2.wav"); + } +} + + diff --git a/Indicators/RangeBars/ADX.ex5 b/Indicators/RangeBars/ADX.ex5 new file mode 100644 index 0000000..2bc2088 Binary files /dev/null and b/Indicators/RangeBars/ADX.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_ADX.mq5 b/Indicators/RangeBars/ADX.mq5 similarity index 80% rename from Indicators/RangeBars/RangeBars_ADX.mq5 rename to Indicators/RangeBars/ADX.mq5 index b18dcca..df50f8e 100644 --- a/Indicators/RangeBars/RangeBars_ADX.mq5 +++ b/Indicators/RangeBars/ADX.mq5 @@ -40,17 +40,11 @@ double ExtTmpBuffer[]; //--- global variables int ExtADXPeriod; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include // -// -// - //+------------------------------------------------------------------+ //| Custom indicator initialization function | @@ -99,15 +93,42 @@ int OnCalculate(const int rates_total, const int &Spread[]) { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // //--- checking for bars count diff --git a/Indicators/RangeBars/ATP.ex5 b/Indicators/RangeBars/ATP.ex5 new file mode 100644 index 0000000..b531018 Binary files /dev/null and b/Indicators/RangeBars/ATP.ex5 differ diff --git a/Indicators/RangeBars/ATP.mq5 b/Indicators/RangeBars/ATP.mq5 new file mode 100644 index 0000000..8122dc4 Binary files /dev/null and b/Indicators/RangeBars/ATP.mq5 differ diff --git a/Indicators/RangeBars/ATR.ex5 b/Indicators/RangeBars/ATR.ex5 new file mode 100644 index 0000000..bf22ae9 Binary files /dev/null and b/Indicators/RangeBars/ATR.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_ATR.mq5 b/Indicators/RangeBars/ATR.mq5 similarity index 75% rename from Indicators/RangeBars/RangeBars_ATR.mq5 rename to Indicators/RangeBars/ATR.mq5 index 10968da..2934312 100644 --- a/Indicators/RangeBars/RangeBars_ATR.mq5 +++ b/Indicators/RangeBars/ATR.mq5 @@ -6,7 +6,6 @@ #property copyright "2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property description "Average True Range" -#property description "Adapted for use with TickChart by Artur Zas." //--- indicator settings #property indicator_separate_window #property indicator_buffers 2 @@ -22,15 +21,10 @@ double ExtTRBuffer[]; //--- global variable int ExtPeriodATR; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -72,16 +66,44 @@ int OnCalculate(const int rates_total, const long &volume[], const int &spread[]) { - // + // + // Process data through MedianRenko indicator + // + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // int i,limit; diff --git a/Indicators/RangeBars/AroonOscillator.ex5 b/Indicators/RangeBars/AroonOscillator.ex5 new file mode 100644 index 0000000..9207f0a Binary files /dev/null and b/Indicators/RangeBars/AroonOscillator.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_AroonOscillator.mq5 b/Indicators/RangeBars/AroonOscillator.mq5 similarity index 98% rename from Indicators/RangeBars/RangeBars_AroonOscillator.mq5 rename to Indicators/RangeBars/AroonOscillator.mq5 index 2f545d2..d82fb61 100644 Binary files a/Indicators/RangeBars/RangeBars_AroonOscillator.mq5 and b/Indicators/RangeBars/AroonOscillator.mq5 differ diff --git a/Indicators/RangeBars/AwesomeOscillator.ex5 b/Indicators/RangeBars/AwesomeOscillator.ex5 new file mode 100644 index 0000000..26d2a95 Binary files /dev/null and b/Indicators/RangeBars/AwesomeOscillator.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_AwesomeOscillator.mq5 b/Indicators/RangeBars/AwesomeOscillator.mq5 similarity index 97% rename from Indicators/RangeBars/RangeBars_AwesomeOscillator.mq5 rename to Indicators/RangeBars/AwesomeOscillator.mq5 index 53b0520..32881ba 100644 --- a/Indicators/RangeBars/RangeBars_AwesomeOscillator.mq5 +++ b/Indicators/RangeBars/AwesomeOscillator.mq5 @@ -26,8 +26,7 @@ double ExtSlowBuffer[]; // #include -#include -RangeBarIndicator customChartIndicator; +#include // // diff --git a/Indicators/RangeBars/BB_MACD.ex5 b/Indicators/RangeBars/BB_MACD.ex5 new file mode 100644 index 0000000..d26eb64 Binary files /dev/null and b/Indicators/RangeBars/BB_MACD.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_BB_MACD.mq5 b/Indicators/RangeBars/BB_MACD.mq5 similarity index 99% rename from Indicators/RangeBars/RangeBars_BB_MACD.mq5 rename to Indicators/RangeBars/BB_MACD.mq5 index 7888d92..17aa957 100644 Binary files a/Indicators/RangeBars/RangeBars_BB_MACD.mq5 and b/Indicators/RangeBars/BB_MACD.mq5 differ diff --git a/Indicators/RangeBars/BollingerBandsMacd.ex5 b/Indicators/RangeBars/BollingerBandsMacd.ex5 new file mode 100644 index 0000000..2c27a01 Binary files /dev/null and b/Indicators/RangeBars/BollingerBandsMacd.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_BollingerBandsMacd.mq5 b/Indicators/RangeBars/BollingerBandsMacd.mq5 similarity index 98% rename from Indicators/RangeBars/RangeBars_BollingerBandsMacd.mq5 rename to Indicators/RangeBars/BollingerBandsMacd.mq5 index a35e93d..165d4c7 100644 Binary files a/Indicators/RangeBars/RangeBars_BollingerBandsMacd.mq5 and b/Indicators/RangeBars/BollingerBandsMacd.mq5 differ diff --git a/Indicators/RangeBars/CCI(alternative).ex5 b/Indicators/RangeBars/CCI(alternative).ex5 new file mode 100644 index 0000000..4d174ba Binary files /dev/null and b/Indicators/RangeBars/CCI(alternative).ex5 differ diff --git a/Indicators/RangeBars/CCI(alternative).mq5 b/Indicators/RangeBars/CCI(alternative).mq5 new file mode 100644 index 0000000..0a2005d --- /dev/null +++ b/Indicators/RangeBars/CCI(alternative).mq5 @@ -0,0 +1,83 @@ +//+------------------------------------------------------------------ +#property copyright "mladen" +#property link "mladenfx@gmail.com" +#property link "https://www.mql5.com" +#property description "CCI (alternative)" +//+------------------------------------------------------------------ +#property indicator_separate_window +#property indicator_buffers 3 +#property indicator_plots 1 +#property indicator_label1 "CCI alternative" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrDarkGray,clrSkyBlue,clrDodgerBlue +#property indicator_width1 2 +//--- input parameters +input int inpPeriod=14; // CCI period +//--- buffers and global variables declarations +double val[],valc[],prices[]; + +// + +#include + +// + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,val,INDICATOR_DATA); + SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX); + SetIndexBuffer(2,prices,INDICATOR_CALCULATIONS); +//--- + IndicatorSetString(INDICATOR_SHORTNAME,"CCI (alternative)("+(string)inpPeriod+")"); + return (INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator de-initialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + /// + + if(Bars(_Symbol,_Period)=0; k++) avg += prices[i-k]; avg /= inpPeriod; + double dev = 0; for(int k=0; k=0; k++) dev += MathAbs(prices[i-k]-avg); dev /= inpPeriod; + + val[i] = (dev!=0) ? (prices[i]-avg)/(0.015*dev) : 0; + valc[i]=(i>0) ?(val[i]>val[i-1]) ? 1 :(val[i] //--- #property indicator_separate_window @@ -30,15 +29,10 @@ double ExtDBuffer[]; double ExtMBuffer[]; double ExtCCIBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -103,7 +97,7 @@ int OnCalculate(const int rates_total,const int prev_calculated, if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); diff --git a/Indicators/RangeBars/ChaikinVolatility.ex5 b/Indicators/RangeBars/ChaikinVolatility.ex5 new file mode 100644 index 0000000..4d6a2d3 Binary files /dev/null and b/Indicators/RangeBars/ChaikinVolatility.ex5 differ diff --git a/Indicators/RangeBars/ChaikinVolatility.mq5 b/Indicators/RangeBars/ChaikinVolatility.mq5 new file mode 100644 index 0000000..a62b09e --- /dev/null +++ b/Indicators/RangeBars/ChaikinVolatility.mq5 @@ -0,0 +1,145 @@ +//+------------------------------------------------------------------+ +//| CHV.mq5 | +//| Copyright 2009-2017, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2017, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +#property description "Chaikin Volatility" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 3 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- enum +enum SmoothMethod + { + SMA=0,// Simple MA + EMA=1 // Exponential MA + }; +//--- input parameters +input int InpSmoothPeriod=10; // Smoothing period +input int InpCHVPeriod=10; // CHV period +input SmoothMethod InpSmoothType=EMA; // Smoothing method +//---- buffers +double ExtCHVBuffer[]; +double ExtHLBuffer[]; +double ExtSHLBuffer[]; +//--- global variables +int ExtSmoothPeriod,ExtCHVPeriod; + +// + +#include + +// + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input variables + string MAName; +//--- set MA name + if(InpSmoothType==SMA) + MAName="SMA"; + else + MAName="EMA"; +//--- check inputs + if(InpSmoothPeriod<=0) + { + ExtSmoothPeriod=10; + printf("Incorrect value for input variable InpSmoothPeriod=%d. Indicator will use value=%d for calculations.",InpSmoothPeriod,ExtSmoothPeriod); + } + else ExtSmoothPeriod=InpSmoothPeriod; + if(InpCHVPeriod<=0) + { + ExtCHVPeriod=10; + printf("Incorrect value for input variable InpCHVPeriod=%d. Indicator will use value=%d for calculations.",InpCHVPeriod,ExtCHVPeriod); + } + else ExtCHVPeriod=InpCHVPeriod; +//---- define buffers + SetIndexBuffer(0,ExtCHVBuffer); + SetIndexBuffer(1,ExtHLBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtSHLBuffer,INDICATOR_CALCULATIONS); +//--- set draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtSmoothPeriod+ExtCHVPeriod-1); +//--- set index label + PlotIndexSetString(0,PLOT_LABEL,"CHV("+string(ExtSmoothPeriod)+","+MAName+")"); +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME,"Chaikin Volatility("+string(ExtSmoothPeriod)+","+MAName+")"); +//--- round settings + IndicatorSetInteger(INDICATOR_DIGITS,1); +//---- OnInit done + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { +//--- variables of indicator + int i,pos,posCHV; +//--- check for rates total + posCHV=ExtCHVPeriod+ExtSmoothPeriod-2; + if(rates_total -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -112,7 +107,7 @@ int OnCalculate(const int rates_total,const int prev_calculated, if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); diff --git a/Indicators/RangeBars/DidiIndex.ex5 b/Indicators/RangeBars/DidiIndex.ex5 new file mode 100644 index 0000000..33d9069 Binary files /dev/null and b/Indicators/RangeBars/DidiIndex.ex5 differ diff --git a/Indicators/RangeBars/DidiIndex.mq5 b/Indicators/RangeBars/DidiIndex.mq5 new file mode 100644 index 0000000..adc51cb Binary files /dev/null and b/Indicators/RangeBars/DidiIndex.mq5 differ diff --git a/Indicators/RangeBars/DonchianChannel.ex5 b/Indicators/RangeBars/DonchianChannel.ex5 new file mode 100644 index 0000000..2a25110 Binary files /dev/null and b/Indicators/RangeBars/DonchianChannel.ex5 differ diff --git a/Indicators/RangeBars/DonchianChannel.mq5 b/Indicators/RangeBars/DonchianChannel.mq5 new file mode 100644 index 0000000..6bd53ed Binary files /dev/null and b/Indicators/RangeBars/DonchianChannel.mq5 differ diff --git a/Indicators/RangeBars/Envelopes.ex5 b/Indicators/RangeBars/Envelopes.ex5 new file mode 100644 index 0000000..81fa4c6 Binary files /dev/null and b/Indicators/RangeBars/Envelopes.ex5 differ diff --git a/Indicators/RangeBars/Envelopes.mq5 b/Indicators/RangeBars/Envelopes.mq5 new file mode 100644 index 0000000..8c92190 --- /dev/null +++ b/Indicators/RangeBars/Envelopes.mq5 @@ -0,0 +1,133 @@ + + +//+------------------------------------------------------------------+ +//| Envelopes.mq5 | +//| Copyright 2009, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 2 +#property indicator_type1 DRAW_LINE +#property indicator_type2 DRAW_LINE +#property indicator_color1 Blue +#property indicator_color2 Red +#property indicator_label1 "Upper band" +#property indicator_label2 "Lower band" +//--- input parameters +input int InpMAPeriod=14; // Period +input int InpMAShift=0; // Shift +input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // Method +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price +input double InpDeviation=0.1; // Deviation +//--- indicator buffers +double ExtUpBuffer[]; +double ExtDownBuffer[]; +double ExtMABuffer[]; +int weightSum; + +//--- MA handle +//int ExtMAHandle; + +#include +#include + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtUpBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtDownBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtMABuffer,INDICATOR_CALCULATIONS); +//--- + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod-1); +//--- name for DataWindow + IndicatorSetString(INDICATOR_SHORTNAME,"Env("+string(InpMAPeriod)+")"); + PlotIndexSetString(0,PLOT_LABEL,"Env("+string(InpMAPeriod)+")Upper"); + PlotIndexSetString(1,PLOT_LABEL,"Env("+string(InpMAPeriod)+")Lower"); +//---- line shifts when drawing + PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift); + PlotIndexSetInteger(1,PLOT_SHIFT,InpMAShift); +//--- + + customChartIndicator.SetUseAppliedPriceFlag(InpAppliedPrice); + +//--- initialization done + } +//+------------------------------------------------------------------+ +//| Envelopes | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total,const int prev_calculated, + const datetime &Time[], + const double &Open[], + const double &High[], + const double &Low[], + const double &Close[], + const long &TickVolume[], + const long &Volume[], + const int &Spread[]) + { + int i,limit; +//--- check for bars count + if(rates_totalrates_total || _prev_calculated<0) to_copy=rates_total; + else + { + to_copy=rates_total-_prev_calculated; + if(_prev_calculated>0) to_copy++; + } +//---- get ma buffer + if(IsStopped()) return(0); //Checking for stop flag + + switch(InpMAMethod) + { + case MODE_SMA: + SimpleMAOnBuffer(rates_total,_prev_calculated,0,InpMAPeriod,customChartIndicator.Price,ExtMABuffer); + break; + + case MODE_EMA: + ExponentialMAOnBuffer(rates_total,_prev_calculated,0,InpMAPeriod,customChartIndicator.Price,ExtMABuffer); + break; + + case MODE_SMMA: + SmoothedMAOnBuffer(rates_total,_prev_calculated,0,InpMAPeriod,customChartIndicator.Price,ExtMABuffer); + break; + + case MODE_LWMA: + LinearWeightedMAOnBuffer(rates_total,_prev_calculated,0,InpMAPeriod,customChartIndicator.Price,ExtMABuffer,weightSum); + break; + } + +//--- preliminary calculations + limit=_prev_calculated-1; + if(limit -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -66,15 +61,42 @@ int OnCalculate(const int rates_total,const int prev_calculated, const int &Spread[]) { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); - + + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // int i,limit; diff --git a/Indicators/RangeBars/GMMA.ex5 b/Indicators/RangeBars/GMMA.ex5 new file mode 100644 index 0000000..6f06b64 Binary files /dev/null and b/Indicators/RangeBars/GMMA.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_gmma.mq5 b/Indicators/RangeBars/GMMA.mq5 similarity index 88% rename from Indicators/RangeBars/RangeBars_gmma.mq5 rename to Indicators/RangeBars/GMMA.mq5 index b22f521..ea1399c 100644 Binary files a/Indicators/RangeBars/RangeBars_gmma.mq5 and b/Indicators/RangeBars/GMMA.mq5 differ diff --git a/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 b/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 new file mode 100644 index 0000000..41ba70e Binary files /dev/null and b/Indicators/RangeBars/Gann_Hi_Lo_Activator.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_Gann_Hi_Lo_Activator.mq5 b/Indicators/RangeBars/Gann_Hi_Lo_Activator.mq5 similarity index 99% rename from Indicators/RangeBars/RangeBars_Gann_Hi_Lo_Activator.mq5 rename to Indicators/RangeBars/Gann_Hi_Lo_Activator.mq5 index 7513b02..f8e5fb1 100644 --- a/Indicators/RangeBars/RangeBars_Gann_Hi_Lo_Activator.mq5 +++ b/Indicators/RangeBars/Gann_Hi_Lo_Activator.mq5 @@ -19,8 +19,7 @@ // // -#include -RangeBarIndicator customChartIndicator; +#include // // diff --git a/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 b/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 new file mode 100644 index 0000000..ca5b8ef Binary files /dev/null and b/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_Gann_Hi_Lo_Activator_SSL.mq5 b/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.mq5 similarity index 78% rename from Indicators/RangeBars/RangeBars_Gann_Hi_Lo_Activator_SSL.mq5 rename to Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.mq5 index e6007f5..5959d3d 100644 --- a/Indicators/RangeBars/RangeBars_Gann_Hi_Lo_Activator_SSL.mq5 +++ b/Indicators/RangeBars/Gann_Hi_Lo_Activator_SSL.mq5 @@ -31,15 +31,10 @@ int ma_high_handle; int ma_low_handle; int period; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -97,15 +92,42 @@ int OnCalculate(const int rates_total, if(rates_total +#include +#include +#include + +CIndicatorAccess iAccess; +CATROnRingBuffer atr; +CMAOnRingBuffer maHigh; +CMAOnRingBuffer maLow; + +//iMAHigh, iMALow, iATRx + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int OnInit() +{ + SetIndexBuffer(0, up, INDICATOR_DATA); + SetIndexBuffer(1, down, INDICATOR_DATA); + + SetIndexBuffer(2, atrlo, INDICATOR_DATA); + SetIndexBuffer(3, atrhi, INDICATOR_DATA); + + SetIndexBuffer(4, arrup, INDICATOR_DATA); + SetIndexBuffer(5, arrdwn, INDICATOR_DATA); + + SetIndexBuffer(6, trend, INDICATOR_CALCULATIONS); +// SetIndexBuffer(7, iMAHigh, INDICATOR_CALCULATIONS); +// SetIndexBuffer(8, iMALow, INDICATOR_CALCULATIONS); +// SetIndexBuffer(9, iATRx, INDICATOR_CALCULATIONS); + + PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0); + PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0); + ArraySetAsSeries(up, true); + ArraySetAsSeries(down, true); + ArraySetAsSeries(atrlo, true); + ArraySetAsSeries(atrhi, true); + ArraySetAsSeries(arrup, true); + ArraySetAsSeries(arrdwn, true); + ArraySetAsSeries(trend, true); +// ArraySetAsSeries(iMAHigh, true); +// ArraySetAsSeries(iMALow, true); +// ArraySetAsSeries(iATRx, true); + if(ShowChannels) + { + + PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,clrDodgerBlue); + PlotIndexSetInteger(3,PLOT_LINE_COLOR,0,clrRed); + PlotIndexSetInteger(2,PLOT_LINE_STYLE,STYLE_DOT); + PlotIndexSetInteger(3,PLOT_LINE_STYLE,STYLE_DOT); + } + else + { + PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,clrNONE); + PlotIndexSetInteger(3,PLOT_LINE_COLOR,0,clrNONE); + + } + + + if(ShowArrows) + { + + bool rep5= PlotIndexSetInteger(4, PLOT_DRAW_TYPE, DRAW_ARROW); + bool rep6=PlotIndexSetInteger(5, PLOT_DRAW_TYPE, DRAW_ARROW); + PlotIndexSetInteger(4, PLOT_ARROW, 233); //233 + PlotIndexSetInteger(5, PLOT_ARROW, 234); //234 + //Comment(ShowArrows +"\n"+rep5 +"\n"+ rep6); + + } + else + { PlotIndexSetInteger(4, PLOT_DRAW_TYPE, DRAW_NONE); + PlotIndexSetInteger(5, PLOT_DRAW_TYPE, DRAW_NONE); + } + + + //ind_mahi = iMA(NULL, 0, Diamond, 0, MODE_SMA, PRICE_HIGH); + //ind_malo = iMA(NULL, 0, Diamond, 0, MODE_SMA, PRICE_LOW); + //ind_atr = iATR(NULL, 0, 100); + //if(ind_mahi == INVALID_HANDLE || ind_mahi == INVALID_HANDLE || ind_atr == INVALID_HANDLE) + // { + // PrintFormat("Failed to create handle of the indicators, error code %d", GetLastError()); + // return(INIT_FAILED); + //} + + customChartIndicator.SetGetTimeFlag(); + + if(!atr.Init(100,MODE_SMA,lookback)) + { + PrintFormat("Failed to create ATR on ring buffer"); + return(INIT_FAILED); + } + + if(!maHigh.Init(Diamond, MODE_SMA, lookback)) + { + PrintFormat("Failed to create maHigh on ring buffer"); + return(INIT_FAILED); + } + + if(!maLow.Init(Diamond, MODE_SMA, lookback)) + { + PrintFormat("Failed to create maLow on ring buffer"); + return(INIT_FAILED); + } + + + nexttrend = 0; + minhighprice = iHigh(NULL, 0, Bars(NULL, 0) - 1); // ? + maxlowprice = iLow(NULL, 0, Bars(NULL, 0) - 1); // ? + return (INIT_SUCCEEDED); +} +//+------------------------------------------------------------------+ +//| |` +//+------------------------------------------------------------------+ +int OnCalculate( + const int rates_total, // size of input time series + const int prev_calculated, // number of handled bars at the previous call + const datetime& time[], // Time array + const double& open[], // Open array + const double& high[], // High array + const double& low[], // Low array + const double& close[], // Close array + const long& tick_volume[], // Tick Volume array + const long& volume[], // Real Volume array + const int& spread[] // Spread array +) +{ + // + // Process data through custom chart indicator + // + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + int _rates_total = ArraySize(customChartIndicator.Close); + + // + + int i, limit, to_copy; + double _atr, lowprice_i, highprice_i, lowma, highma; + + ArraySetAsSeries(customChartIndicator.Time, true); + ArraySetAsSeries(customChartIndicator.High, true); + ArraySetAsSeries(customChartIndicator.Low, true); + ArraySetAsSeries(customChartIndicator.Close, true); + + if(_prev_calculated > _rates_total || _prev_calculated < 0) to_copy = _rates_total; + else + { + to_copy = _rates_total - _prev_calculated; + if(_prev_calculated > 0) + to_copy += 10; + } + +// if(!RefreshBuffers(iMAHigh, iMALow, iATRx, ind_mahi, ind_malo, ind_atr, to_copy)) +// return(0); + + atr.MainOnArray(_rates_total,_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close); + maHigh.MainOnArray(_rates_total, _prev_calculated, customChartIndicator.High); + maLow.MainOnArray(_rates_total, _prev_calculated, customChartIndicator.Low); +// + + if(_prev_calculated == 0) + limit = _rates_total - 2; + else + limit = _rates_total - _prev_calculated + 1; + + for(i = limit; i >= 0; i--) + { + //lowprice_i = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, Diamond, i)); + //highprice_i = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, Diamond, i)); + //lowma = NormalizeDouble(iMALow[i], _Digits); + //highma = NormalizeDouble(iMAHigh[i], _Digits); + + lowprice_i = customChartIndicator.Low[iAccess.Lowest(customChartIndicator.Low, Diamond, i)]; + highprice_i = customChartIndicator.High[iAccess.Highest(customChartIndicator.High, Diamond, i)]; + lowma = NormalizeDouble(maLow[i], _Digits); + highma = NormalizeDouble(maHigh[i], _Digits); + + // + + trend[i] = trend[i + 1]; + + //atr = iATRx[i] / 2; + _atr = atr[i] / 2; + + arrup[i] = EMPTY_VALUE; + arrdwn[i] = EMPTY_VALUE; + + if(trend[i + 1] != 1.0) + { + maxlowprice = MathMax(lowprice_i, maxlowprice); + if(highma < maxlowprice && customChartIndicator.Close[i] < customChartIndicator.Low[i + 1]) + { + trend[i] = 1.0; + nexttrend = 0; + minhighprice = highprice_i; + } + } + else + { + minhighprice = MathMin(highprice_i, minhighprice); + if(lowma > minhighprice && customChartIndicator.Close[i] > customChartIndicator.High[i + 1]) + { + trend[i] = 0.0; + nexttrend = 1; + maxlowprice = lowprice_i; + } + } + //--- + if(trend[i] == 0.0) + { + if(trend[i + 1] != 0.0) + { + up[i] = down[i + 1]; + up[i + 1] = up[i]; + arrup[i] = up[i] - 2 * _atr; + } + else + { + up[i] = MathMax(maxlowprice, up[i + 1]); + } + + + atrhi[i] = up[i] + ChannelDeviation*_atr; + atrlo[i] = up[i] - ChannelDeviation*_atr; + down[i] = 0.0; + } + else + { + if(trend[i + 1] != 1.0) + { + down[i] = up[i + 1]; + down[i + 1] = down[i]; + arrdwn[i] = down[i] + 2 * _atr; + } + else + { + down[i] = MathMin(minhighprice, down[i + 1]); + } + + + atrhi[i] = down[i] + ChannelDeviation*_atr; + atrlo[i] = down[i] - ChannelDeviation*_atr; + up[i] = 0.0; + } + } + manageAlerts(); + return (rates_total); +} + +/* +//+------------------------------------------------------------------+ +//| Filling indicator buffers from the indicators | +//+------------------------------------------------------------------+ +bool RefreshBuffers(double &hi_buffer[], + double &lo_buffer[], + double &atr_buffer[], + int hi_handle, + int lo_handle, + int atr_handle, + int amount + ) +{ +//--- reset error code + ResetLastError(); +//--- fill a part of the iMACDBuffer array with values from the indicator buffer that has 0 index + if(CopyBuffer(hi_handle, 0, 0, amount, hi_buffer) < 0) + { + //--- if the copying fails, tell the error code + PrintFormat("Failed to copy data from the MaHigh indicator, error code %d", GetLastError()); + //--- quit with zero result - it means that the indicator is considered as not calculated + return(false); + } +//--- fill a part of the SignalBuffer array with values from the indicator buffer that has index 1 + if(CopyBuffer(lo_handle, 0, 0, amount, lo_buffer) < 0) + { + //--- if the copying fails, tell the error code + PrintFormat("Failed to copy data from the MaLow indicator, error code %d", GetLastError()); + //--- quit with zero result - it means that the indicator is considered as not calculated + return(false); + } +//--- fill a part of the StdDevBuffer array with values from the indicator buffer + if(CopyBuffer(atr_handle, 0, 0, amount, atr_buffer) < 0) + { + //--- if the copying fails, tell the error code + PrintFormat("Failed to copy data from the ATR indicator, error code %d", GetLastError()); + //--- quit with zero result - it means that the indicator is considered as not calculated + return(false); + } +//--- everything is fine + return(true); +} +*/ +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageAlerts() +{ + int whichBar; + if (alertsOn) + { + if (alertsOnCurrent) + whichBar = 0; + else + whichBar = 1; + if (arrup[whichBar] != EMPTY_VALUE) doAlert(whichBar, "up"); + if (arrdwn[whichBar] != EMPTY_VALUE) doAlert(whichBar, "down"); + } +} + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void doAlert(int forBar, string doWhat) +{ + static string previousAlert = "nothing"; + static datetime previousTime; + string message; + if (previousAlert != doWhat || previousTime != iTime(NULL, 0, forBar)) + { + previousAlert = doWhat; + previousTime = iTime(NULL, 0, forBar); + message = StringFormat("%s at %s", Symbol(), TimeToString(TimeLocal(), TIME_SECONDS), " HalfTrend signal ", doWhat); + if (alertsMessage) Alert(message); + if (alertsEmail) SendMail(Symbol(), StringFormat("HalfTrend %s", message)); + if (alertsSound) PlaySound("alert2.wav"); + } +} + +//+------------------------------------------------------------------+ diff --git a/Indicators/RangeBars/Heiken_Ashi.ex5 b/Indicators/RangeBars/Heiken_Ashi.ex5 new file mode 100644 index 0000000..f53d99a Binary files /dev/null and b/Indicators/RangeBars/Heiken_Ashi.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_Heiken_Ashi.mq5 b/Indicators/RangeBars/Heiken_Ashi.mq5 similarity index 73% rename from Indicators/RangeBars/RangeBars_Heiken_Ashi.mq5 rename to Indicators/RangeBars/Heiken_Ashi.mq5 index 0682a17..6aae74f 100644 --- a/Indicators/RangeBars/RangeBars_Heiken_Ashi.mq5 +++ b/Indicators/RangeBars/Heiken_Ashi.mq5 @@ -20,15 +20,10 @@ double ExtLBuffer[]; double ExtCBuffer[]; double ExtColorBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -67,13 +62,38 @@ int OnCalculate(const int rates_total, int i,limit; // - + // Process data through MedianRenko indicator + // + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); // diff --git a/Indicators/RangeBars/Ichimoku.ex5 b/Indicators/RangeBars/Ichimoku.ex5 new file mode 100644 index 0000000..2d79198 Binary files /dev/null and b/Indicators/RangeBars/Ichimoku.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_Ichimoku.mq5 b/Indicators/RangeBars/Ichimoku.mq5 similarity index 79% rename from Indicators/RangeBars/RangeBars_Ichimoku.mq5 rename to Indicators/RangeBars/Ichimoku.mq5 index 1acf9db..2ae34b4 100644 --- a/Indicators/RangeBars/RangeBars_Ichimoku.mq5 +++ b/Indicators/RangeBars/Ichimoku.mq5 @@ -6,7 +6,6 @@ #property copyright "2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property description "Ichimoku Kinko Hyo" -#property description "Adapted for use with TickChart by Artur Zas." //--- indicator settings #property indicator_chart_window #property indicator_buffers 5 @@ -34,15 +33,10 @@ double ExtSpanABuffer[]; double ExtSpanBBuffer[]; double ExtChikouBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -116,13 +110,38 @@ int OnCalculate(const int rates_total, const int &spread[]) { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); // diff --git a/Indicators/RangeBars/KeltnerChannel.ex5 b/Indicators/RangeBars/KeltnerChannel.ex5 new file mode 100644 index 0000000..52c8f17 Binary files /dev/null and b/Indicators/RangeBars/KeltnerChannel.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_KeltnerChannel.mq5 b/Indicators/RangeBars/KeltnerChannel.mq5 similarity index 98% rename from Indicators/RangeBars/RangeBars_KeltnerChannel.mq5 rename to Indicators/RangeBars/KeltnerChannel.mq5 index 1d8beb7..03e9dfb 100644 Binary files a/Indicators/RangeBars/RangeBars_KeltnerChannel.mq5 and b/Indicators/RangeBars/KeltnerChannel.mq5 differ diff --git a/Indicators/RangeBars/LRMA.ex5 b/Indicators/RangeBars/LRMA.ex5 new file mode 100644 index 0000000..7f8eceb Binary files /dev/null and b/Indicators/RangeBars/LRMA.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_LRMA.mq5 b/Indicators/RangeBars/LRMA.mq5 similarity index 97% rename from Indicators/RangeBars/RangeBars_LRMA.mq5 rename to Indicators/RangeBars/LRMA.mq5 index 5ebbbfa..e418333 100644 Binary files a/Indicators/RangeBars/RangeBars_LRMA.mq5 and b/Indicators/RangeBars/LRMA.mq5 differ diff --git a/Indicators/RangeBars/LinearRegression.ex5 b/Indicators/RangeBars/LinearRegression.ex5 new file mode 100644 index 0000000..d69d059 Binary files /dev/null and b/Indicators/RangeBars/LinearRegression.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_LinearRegression.mq5 b/Indicators/RangeBars/LinearRegression.mq5 similarity index 97% rename from Indicators/RangeBars/RangeBars_LinearRegression.mq5 rename to Indicators/RangeBars/LinearRegression.mq5 index 1cd0920..1ec067d 100644 --- a/Indicators/RangeBars/RangeBars_LinearRegression.mq5 +++ b/Indicators/RangeBars/LinearRegression.mq5 @@ -14,8 +14,11 @@ input int LRPeriod = 20; // Bars in regression // The main buffer - drawing a line on a chart double ExtLRBuffer[]; -#include -RangeBarIndicator customChartIndicator; +// + +#include + +// //+------------------------------------------------------------------+ void OnInit() diff --git a/Indicators/RangeBars/MA.ex5 b/Indicators/RangeBars/MA.ex5 new file mode 100644 index 0000000..7b2ad43 Binary files /dev/null and b/Indicators/RangeBars/MA.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_MA.mq5 b/Indicators/RangeBars/MA.mq5 similarity index 85% rename from Indicators/RangeBars/RangeBars_MA.mq5 rename to Indicators/RangeBars/MA.mq5 index 83a1b77..7e5aa29 100644 --- a/Indicators/RangeBars/RangeBars_MA.mq5 +++ b/Indicators/RangeBars/MA.mq5 @@ -21,15 +21,10 @@ input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; //--- indicator buffers double ExtLineBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -197,16 +192,43 @@ int OnCalculate(const int rates_total,const int prev_calculated, { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); int _begin = 0; + // + // // //--- check for bars count diff --git a/Indicators/RangeBars/MACD.ex5 b/Indicators/RangeBars/MACD.ex5 new file mode 100644 index 0000000..a53e0df Binary files /dev/null and b/Indicators/RangeBars/MACD.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_MACD.mq5 b/Indicators/RangeBars/MACD.mq5 similarity index 69% rename from Indicators/RangeBars/RangeBars_MACD.mq5 rename to Indicators/RangeBars/MACD.mq5 index bb153a5..53ccaf5 100644 --- a/Indicators/RangeBars/RangeBars_MACD.mq5 +++ b/Indicators/RangeBars/MACD.mq5 @@ -6,8 +6,6 @@ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property description "Moving Average Convergence/Divergence" -#property description "Adapted for use with TickChart by Artur Zas." - #include //--- indicator settings #property indicator_separate_window @@ -37,8 +35,11 @@ double ExtFastMaBuffer[]; double ExtSlowMaBuffer[]; double ExtMacdBuffer[]; -#include -RangeBarIndicator customChartIndicator; +// + +#include + +// //+------------------------------------------------------------------+ //| Custom indicator initialization function | @@ -72,36 +73,62 @@ int OnCalculate(const int rates_total,const int prev_calculated, const long &Volume[], const int &Spread[]) { + // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); - + + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); - int _rates_total = customChartIndicator.GetRatesTotal(); - - + // + // + // + //--- check for data - if(_rates_total_rates_total || _prev_calculated<0) to_copy=_rates_total; + if(_prev_calculated>rates_total || _prev_calculated<0) to_copy=rates_total; else { - to_copy=_rates_total-_prev_calculated; + to_copy=rates_total-_prev_calculated; if(_prev_calculated>0) to_copy++; } - //--- get Fast EMA buffer if(IsStopped()) return(0); //Checking for stop flag - ExponentialMAOnBuffer(_rates_total,_prev_calculated,0,InpFastEMA,customChartIndicator.Close,ExtFastMaBuffer); + ExponentialMAOnBuffer(rates_total,_prev_calculated,0,InpFastEMA,customChartIndicator.Close,ExtFastMaBuffer); //--- get SlowSMA buffer if(IsStopped()) return(0); //Checking for stop flag - ExponentialMAOnBuffer(_rates_total,_prev_calculated,0,InpSlowEMA,customChartIndicator.Close,ExtSlowMaBuffer); + ExponentialMAOnBuffer(rates_total,_prev_calculated,0,InpSlowEMA,customChartIndicator.Close,ExtSlowMaBuffer); //--- int limit; if(_prev_calculated==0) @@ -109,7 +136,7 @@ int OnCalculate(const int rates_total,const int prev_calculated, else limit=_prev_calculated-1; //--- calculate MACD - for(int i=limit;i<_rates_total && !IsStopped();i++) + for(int i=limit;i 0) @@ -124,9 +151,8 @@ int OnCalculate(const int rates_total,const int prev_calculated, } } //--- calculate Signal - SimpleMAOnBuffer(_rates_total,_prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer); + SimpleMAOnBuffer(rates_total,_prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer); //--- OnCalculate done. Return new _prev_calculated. - return(rates_total); } //+------------------------------------------------------------------+ diff --git a/Indicators/RangeBars/MACD_Line.ex5 b/Indicators/RangeBars/MACD_Line.ex5 new file mode 100644 index 0000000..7499334 Binary files /dev/null and b/Indicators/RangeBars/MACD_Line.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_MACD_Line.mq5 b/Indicators/RangeBars/MACD_Line.mq5 similarity index 95% rename from Indicators/RangeBars/RangeBars_MACD_Line.mq5 rename to Indicators/RangeBars/MACD_Line.mq5 index ceaa4b7..ad2a670 100644 --- a/Indicators/RangeBars/RangeBars_MACD_Line.mq5 +++ b/Indicators/RangeBars/MACD_Line.mq5 @@ -6,8 +6,6 @@ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property description "Moving Average Convergence/Divergence" -#property description "Adapted for use with TickChart by Artur Zas." - #include //--- indicator settings #property indicator_separate_window @@ -35,8 +33,7 @@ double ExtMacdBuffer[]; // -#include -RangeBarIndicator customChartIndicator; +#include // @@ -78,13 +75,12 @@ int OnCalculate(const int rates_total,const int prev_calculated, if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); int _prev_calculated = customChartIndicator.GetPrevCalculated(); - int _rates_total = customChartIndicator.GetRatesTotal(); - + // // // @@ -100,7 +96,6 @@ int OnCalculate(const int rates_total,const int prev_calculated, to_copy=rates_total-_prev_calculated; if(_prev_calculated>0) to_copy++; } - //--- get Fast EMA buffer if(IsStopped()) return(0); //Checking for stop flag ExponentialMAOnBuffer(rates_total,_prev_calculated,0,InpFastEMA,customChartIndicator.Close,ExtFastMaBuffer); diff --git a/Indicators/RangeBars/Momentum.ex5 b/Indicators/RangeBars/Momentum.ex5 new file mode 100644 index 0000000..0ca9736 Binary files /dev/null and b/Indicators/RangeBars/Momentum.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_Momentum.mq5 b/Indicators/RangeBars/Momentum.mq5 similarity index 73% rename from Indicators/RangeBars/RangeBars_Momentum.mq5 rename to Indicators/RangeBars/Momentum.mq5 index 67354e6..fe9d512 100644 --- a/Indicators/RangeBars/RangeBars_Momentum.mq5 +++ b/Indicators/RangeBars/Momentum.mq5 @@ -21,16 +21,12 @@ double ExtMomentumBuffer[]; //--- global variable int ExtMomentumPeriod; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include // -// -// + //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ @@ -88,15 +84,42 @@ int OnCalculate(const int rates_total,const int prev_calculated, static int begin = 0; // - + // Process data through MedianRenko indicator + // + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // //--- start calculation diff --git a/Indicators/RangeBars/NRTR.ex5 b/Indicators/RangeBars/NRTR.ex5 new file mode 100644 index 0000000..18e8dee Binary files /dev/null and b/Indicators/RangeBars/NRTR.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_NRTR.mq5 b/Indicators/RangeBars/NRTR.mq5 similarity index 82% rename from Indicators/RangeBars/RangeBars_NRTR.mq5 rename to Indicators/RangeBars/NRTR.mq5 index c466b34..b8681e9 100644 --- a/Indicators/RangeBars/RangeBars_NRTR.mq5 +++ b/Indicators/RangeBars/NRTR.mq5 @@ -47,15 +47,10 @@ double Trend[]; double ATRBuffer[]; int Handle; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -106,13 +101,38 @@ int OnCalculate(const int rates_total, ) { // - + // Process data through MedianRenko indicator + // + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); // diff --git a/Indicators/RangeBars/OBV.ex5 b/Indicators/RangeBars/OBV.ex5 new file mode 100644 index 0000000..f743d20 Binary files /dev/null and b/Indicators/RangeBars/OBV.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_OBV.mq5 b/Indicators/RangeBars/OBV.mq5 similarity index 93% rename from Indicators/RangeBars/RangeBars_OBV.mq5 rename to Indicators/RangeBars/OBV.mq5 index 36da149..326a61c 100644 --- a/Indicators/RangeBars/RangeBars_OBV.mq5 +++ b/Indicators/RangeBars/OBV.mq5 @@ -18,18 +18,11 @@ input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes //---- indicator buffer double ExtOBVBuffer[]; -// -// Initialize RangeBar indicator for data processing -// according to settings of the RangeBar indicator already on chart // -#include -RangeBarIndicator customChartIndicator; +#include // -// -// - //+------------------------------------------------------------------+ //| On Balance Volume initialization function | @@ -60,12 +53,12 @@ int OnCalculate(const int rates_total, const int &spread[]) { // - // Process data through RangeBar indicator + // Process data through MedianRenko indicator // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); diff --git a/Indicators/RangeBars/OscillatorCandles.ex5 b/Indicators/RangeBars/OscillatorCandles.ex5 new file mode 100644 index 0000000..3389e26 Binary files /dev/null and b/Indicators/RangeBars/OscillatorCandles.ex5 differ diff --git a/Indicators/RangeBars/OscillatorCandles.mq5 b/Indicators/RangeBars/OscillatorCandles.mq5 new file mode 100644 index 0000000..7fa3698 --- /dev/null +++ b/Indicators/RangeBars/OscillatorCandles.mq5 @@ -0,0 +1,679 @@ +//+------------------------------------------------------------------+ +//| Oscillator Candles.mq5 | +//| Copyright 2015, MetaQuotes Software Corp. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2015, MetaQuotes Software Corp." +#property link "https://www.mql5.com" +#property description"Oscillator Candles by pipPod" +#property version "1.00" +#property indicator_separate_window +#property indicator_buffers 7 +#property indicator_plots 1 +//--- +#property indicator_type1 DRAW_COLOR_CANDLES +#property indicator_color1 clrLimeGreen,clrFireBrick +//--- +#property indicator_levelcolor clrLightSlateGray +//--- +double indicator_level1= 0; +double indicator_level2= 20; +double indicator_level3= 30; +double indicator_level4= 50; +double indicator_level5= 70; +double indicator_level6= 80; +double indicator_level7= 100; +double indicator_level8=-100; +//--- +#include +#include + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +enum indicators + { + INDICATOR_MACD, //Moving Average Convergence/Divergence + INDICATOR_STOCHASTIC, //Stochastic Oscillator + INDICATOR_RSI, //Relative Strength Index + INDICATOR_CCI, //Commodity Channel Index + INDICATOR_MOMENTUM, //Momentum Index + }; +//--- indicator to show +input indicators Indicator=INDICATOR_MACD; +//--- indicator parameters +input string MACD; +input ushort FastEMA=12; //Fast EMA Period +input ushort SlowEMA=26; //Slow EMA Period +//--- +input string Stochastic; +input ushort Kperiod=7; //K Period +input ushort Slowing=3; +input ENUM_STO_PRICE PriceField=STO_LOWHIGH; //Price Field +//--- +input string RSI; +input ushort RSIPeriod=14; //RSI Period +//--- +input string CCI; +input ushort CCIPeriod=14; //CCI Period +//--- +input string Momentum; +input ushort MomPeriod=14; //Momentum Period +//--- +input string _; //--- +input bool PriceLine=true; //Horizontal Value Line +#define priceLine "priceLine" +input bool AutoColor=false;//Auto Color Candles +//---index buffers for drawing candles +double OpenBuffer[]; +double HighBuffer[]; +double LowBuffer[]; +double CloseBuffer[]; +double ColorBuffer[]; +//---Stochastic buffers +double HighesBuffer[]; +double LowestBuffer[]; +//---CCI buffers +double PriceBuffer[]; +double MovAvBuffer[]; +//--- +long chartID=ChartID(); +short window; +#define OBJ_NONE -1 +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + string shortName; + switch(Indicator) + { + case INDICATOR_MACD: + shortName=StringFormat("MACD(%d,%d)",FastEMA,SlowEMA); + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); + IndicatorSetInteger(INDICATOR_LEVELS,1); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,indicator_level1); + PlotIndexSetString(0,PLOT_LABEL,"MACD Open;MACD High;MACD Low;MACD Close"); + for(int i=0;i<5;i++) + PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,SlowEMA-1); + break; + case INDICATOR_STOCHASTIC: + shortName=StringFormat("Stochastic(%d,%d)",Kperiod,Slowing); + SetIndexBuffer(5,HighesBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(6,LowestBuffer,INDICATOR_CALCULATIONS); + IndicatorSetInteger(INDICATOR_DIGITS,0); + IndicatorSetInteger(INDICATOR_LEVELS,3); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,indicator_level2); + IndicatorSetDouble(INDICATOR_LEVELVALUE,1,indicator_level4); + IndicatorSetDouble(INDICATOR_LEVELVALUE,2,indicator_level6); + PlotIndexSetString(0,PLOT_LABEL,"Stoch Open;Stoch High;Stoch Low;Stoch Close"); + for(int i=0;i<5;i++) + PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,Kperiod-1+Slowing-1); + break; + case INDICATOR_RSI: + shortName=StringFormat("RSI(%d)",RSIPeriod); + IndicatorSetInteger(INDICATOR_DIGITS,0); + IndicatorSetInteger(INDICATOR_LEVELS,3); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,indicator_level3); + IndicatorSetDouble(INDICATOR_LEVELVALUE,1,indicator_level4); + IndicatorSetDouble(INDICATOR_LEVELVALUE,2,indicator_level5); + PlotIndexSetString(0,PLOT_LABEL,"RSI Open;RSI High;RSI Low;RSI Close"); + for(int i=0;i<5;i++) + PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,RSIPeriod-1); + break; + case INDICATOR_CCI: + shortName=StringFormat("CCI(%d)",CCIPeriod); + SetIndexBuffer(5,PriceBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(6,MovAvBuffer,INDICATOR_CALCULATIONS); + IndicatorSetInteger(INDICATOR_DIGITS,0); + IndicatorSetInteger(INDICATOR_LEVELS,3); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,indicator_level1); + IndicatorSetDouble(INDICATOR_LEVELVALUE,1,indicator_level7); + IndicatorSetDouble(INDICATOR_LEVELVALUE,2,indicator_level8); + PlotIndexSetString(0,PLOT_LABEL,"CCI Open;CCI High;CCI Low;CCI Close"); + for(int i=0;i<5;i++) + PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,CCIPeriod-1); + break; + case INDICATOR_MOMENTUM: + shortName=StringFormat("Momentum(%d)",MomPeriod); + IndicatorSetInteger(INDICATOR_DIGITS,2); + IndicatorSetInteger(INDICATOR_LEVELS,1); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,indicator_level7); + PlotIndexSetString(0,PLOT_LABEL,"Mom Open;Mom High;Mom Low;Mom Close"); + for(int i=0;i<5;i++) + PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,MomPeriod-1); + } +//---set name, get window + IndicatorSetString(INDICATOR_SHORTNAME,shortName); + window=(short)ChartWindowFind(chartID,shortName); +//---index buffers + SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA); + SetIndexBuffer(1,HighBuffer,INDICATOR_DATA); + SetIndexBuffer(2,LowBuffer,INDICATOR_DATA); + SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA); + SetIndexBuffer(4,ColorBuffer,INDICATOR_COLOR_INDEX); +//---color bars + if(AutoColor) + SetColors(); +//---delete price line + if(!PriceLine && ObjectFind(chartID,priceLine)!=OBJ_NONE) + ObjectDelete(chartID,priceLine); +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { + + // + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + // + + +//---bars to count + int toFill=rates_total-_prev_calculated; + if(_prev_calculated>0) + toFill++; +//---fill OHLC buffers + switch(Indicator) + { + case INDICATOR_MACD: + if(MACD(customChartIndicator.GetRatesTotal(),_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close)!=toFill) + return(0); + break; + case INDICATOR_STOCHASTIC: + if(Stochastic(customChartIndicator.GetRatesTotal(),_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close)!=toFill) + return(0); + break; + case INDICATOR_RSI: + if(RSI(customChartIndicator.GetRatesTotal(),_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close)!=toFill) + return(0); + break; + case INDICATOR_CCI: + if(CCI(customChartIndicator.GetRatesTotal(),_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close)!=toFill) + return(0); + break; + case INDICATOR_MOMENTUM: + if(Momentum(customChartIndicator.GetRatesTotal(),_prev_calculated,customChartIndicator.High,customChartIndicator.Low,customChartIndicator.Close)!=toFill) + return(0); + } +//--- return value of prev_calculated for next call + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Moving Average Convergence/Divergence | +//+------------------------------------------------------------------+ +int MACD(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//---check bars and input vars + if(rates_total<=SlowEMA || FastEMA<=1 || SlowEMAOpenBuffer[i])?0:1; + //---horizontal value line + if(PriceLine) + PriceLine(CloseBuffer[i]); + count++; + } +//--- macd done. return count. + return(count); + } +//+------------------------------------------------------------------+ +//| Stochastic Oscillator | +//+------------------------------------------------------------------+ +int Stochastic(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//--- check for bars count + if(rates_total<=Kperiod+Slowing || Kperiod<=1) + return(0); +//--- declare variables + int begin,count=0; + double sumLowH,sumLowL,sumLowC,sumHigh; + double min,max; +//--- + begin=Kperiod-1; + if(beginlow[k]) + min=low[k]; + if(maxclose[k]) + min=close[k]; + if(maxOpenBuffer[i])?0:1; + //---horizontal value line + if(PriceLine) + PriceLine(CloseBuffer[i]); + count++; + } +//--- stochastic done. return count. + return(count); + } +//+------------------------------------------------------------------+ +//| Relative Strength index | +//+------------------------------------------------------------------+ +int RSI(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//--- check bars and input vars + if(rates_total<=RSIPeriod || RSIPeriod<=1) + return(0); + int begin,count=0; +//--- declare vars + double diffC, + diffH, + diffL; + double currPositive = 0.0, + currNegative = 0.0; + static double prevPositive = 0.0, + prevNegative = 0.0; +//--- preliminary calculations + begin=prev_calculated-1; + if(begin<=RSIPeriod) + { + //--- first RSIPeriod values of the indicator are not calculated + OpenBuffer[0]=HighBuffer[0]=LowBuffer[0]=CloseBuffer[0]=0.0; + double sumPositive = 0.0, + sumNegative = 0.0; + count++; + for(int i=1;i<=RSIPeriod && !IsStopped();i++) + { + OpenBuffer[i]=HighBuffer[i]=LowBuffer[i]=CloseBuffer[i]=0.0; + diffC=close[i]-close[i-1]; + sumPositive += (diffC>0.0? diffC:0.0); + sumNegative += (diffC<0.0?-diffC:0.0); + count++; + } + //--- calculate first visible value + currPositive = sumPositive/RSIPeriod; + currNegative = sumNegative/RSIPeriod; + //--- check zero divide, calculate first rsi and fill candle buffers + if(currNegative!=0.0) + OpenBuffer[RSIPeriod]=HighBuffer[RSIPeriod]=LowBuffer[RSIPeriod]= + CloseBuffer[RSIPeriod]=100.0-100.0/(1.0+currPositive/currNegative); + else + if(currPositive!=0.0) + OpenBuffer[RSIPeriod]=HighBuffer[RSIPeriod]=LowBuffer[RSIPeriod]= + CloseBuffer[RSIPeriod]=100.0; + else + OpenBuffer[RSIPeriod]=HighBuffer[RSIPeriod]=LowBuffer[RSIPeriod]= + CloseBuffer[RSIPeriod]=50.0; + prevPositive = currPositive; + prevNegative = currNegative; + //--- prepare the position value for main calculation + begin=RSIPeriod+1; + } +//--- the main loop of calculations + for(int i=begin;i0.0? diffC:0.0))/RSIPeriod; + currNegative = (prevNegative*(RSIPeriod-1)+(diffC<0.0?-diffC:0.0))/RSIPeriod; + //--- check zero divide, calculate rsi and fill candle buffers + if(prevNegative!=0.0) + { + HighBuffer[i]= 100.0-100.0/(1.0+(prevPositive+diffH)/prevNegative); + LowBuffer[i] = 100.0-100.0/(1.0+prevPositive/(prevNegative-diffL)); + } + else + if(prevPositive!=0.0) + HighBuffer[i]= LowBuffer[i] = 100.0; + else + HighBuffer[i]=LowBuffer[i]=50.0; + if(currNegative!=0.0) + CloseBuffer[i]=100.0-100.0/(1.0+currPositive/currNegative); + else + if(currPositive!=0.0) + CloseBuffer[i]=100.0; + else + CloseBuffer[i]=50.0; + //---check for new bar + static int k; + if(k!=i) + { + prevPositive = currPositive; + prevNegative = currNegative; + OpenBuffer[i]= CloseBuffer[i-1]; + k=i; + } + //---set candle color + ColorBuffer[i]=(CloseBuffer[i]>OpenBuffer[i])?0:1; + //---horizontal value line + if(PriceLine) + PriceLine(CloseBuffer[i]); + count++; + } +//---rsi done.return count. + return(count); + } +//+------------------------------------------------------------------+ +//| Commodity Channel Index | +//+------------------------------------------------------------------+ +int CCI(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//--- check bars and input vars + if(rates_total<=CCIPeriod || CCIPeriod<=1) + return(0); +//--- declare vars + int begin,count=0; + double sum,mul; +//--- initial zero + if(prev_calculated<1) + { + for(int i=0;iOpenBuffer[i])?0:1; + //---horizontal value line + if(PriceLine) + PriceLine(CloseBuffer[i]); + count++; + } +//---cci done. return count. + return(count); + } +//+------------------------------------------------------------------+ +//| Momentum | +//+------------------------------------------------------------------+ +int Momentum(const int rates_total, + const int prev_calculated, + const double &high[], + const double &low[], + const double &close[]) + { +//--- check bars and input param + if(rates_total<=MomPeriod || MomPeriod<=0) + return(0); + int begin,count=0; +//--- initial zero + if(prev_calculated<=0) + { + for(int i=0;iOpenBuffer[i])?0:1; + //---horizontal value line + if(PriceLine) + PriceLine(CloseBuffer[i]); + count++; + } +//--- momentum done. return count + return(count); + } +//+------------------------------------------------------------------+ +//| Horizontal value line | +//+------------------------------------------------------------------+ +void PriceLine(const double &close_price) + { + if(ObjectFind(chartID,priceLine)!=OBJ_NONE) + ObjectDelete(chartID,priceLine); + if(!ObjectCreate(chartID,priceLine,OBJ_HLINE,window,0,close_price)) + { + Print(__FUNCTION__,": error ",GetLastError()); + return; + } + ObjectSetInteger(chartID,priceLine,OBJPROP_WIDTH,1); + ObjectSetInteger(chartID,priceLine,OBJPROP_STYLE,STYLE_SOLID); + ObjectSetInteger(chartID,priceLine,OBJPROP_COLOR,clrLightSlateGray); + ObjectSetInteger(chartID,priceLine,OBJPROP_HIDDEN,true); + ObjectSetInteger(chartID,priceLine,OBJPROP_SELECTABLE,false); + return; + } +//+------------------------------------------------------------------+ +//| Auto colors for candles | +//+------------------------------------------------------------------+ +bool SetColors() + { + color colorBase=clrNONE, + colorQote=clrNONE; + string base, + qote; + string Name[9] = {"AUD","CAD","CHF","EUR","GBP","JPY","NZD","USD","XAU"}; + color Color[9] = + { + clrDarkOrange,clrWhiteSmoke,clrFireBrick,clrRoyalBlue, + clrSilver,clrYellow,clrDarkViolet,clrLimeGreen,clrGold + }; + base = StringSubstr(_Symbol,0,3); //Base currency name + qote = StringSubstr(_Symbol,3,3); //Quote currency name + for(int i=0;i<9;i++) + { + if(base==Name[i]) + colorBase=Color[i]; + if(qote==Name[i]) + colorQote=Color[i]; + } + if(!PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colorBase) || + !PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colorQote)) + return(false); + if(ChartGetInteger(0,CHART_COLOR_CANDLE_BULL)!=colorBase) + { + if(!ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,colorBase) || + !ChartSetInteger(0,CHART_COLOR_CHART_UP,colorBase)) + return(false); + } + if(ChartGetInteger(0,CHART_COLOR_CANDLE_BEAR)!=colorQote) + { + if(!ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,colorQote) || + !ChartSetInteger(0,CHART_COLOR_CHART_DOWN,colorQote)) + return(false); + } + return(true); + } +//+------------------------------------------------------------------+ diff --git a/Indicators/RangeBars/ParabolicSAR.ex5 b/Indicators/RangeBars/ParabolicSAR.ex5 new file mode 100644 index 0000000..524658d Binary files /dev/null and b/Indicators/RangeBars/ParabolicSAR.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_ParabolicSAR.mq5 b/Indicators/RangeBars/ParabolicSAR.mq5 similarity index 84% rename from Indicators/RangeBars/RangeBars_ParabolicSAR.mq5 rename to Indicators/RangeBars/ParabolicSAR.mq5 index c8b75b8..bbef3f8 100644 --- a/Indicators/RangeBars/RangeBars_ParabolicSAR.mq5 +++ b/Indicators/RangeBars/ParabolicSAR.mq5 @@ -5,7 +5,6 @@ //+------------------------------------------------------------------+ #property copyright "2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" -#property description "Adapted for use with TickChart by Artur Zas." //--- indicator settings #property indicator_chart_window #property indicator_buffers 3 @@ -25,15 +24,10 @@ bool ExtDirectionLong; double ExtSarStep; double ExtSarMaximum; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -92,15 +86,42 @@ int OnCalculate(const int rates_total, return(0); // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); - + + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // //--- detect current position diff --git a/Indicators/RangeBars/ProVolume.ex5 b/Indicators/RangeBars/ProVolume.ex5 new file mode 100644 index 0000000..950afe3 Binary files /dev/null and b/Indicators/RangeBars/ProVolume.ex5 differ diff --git a/Indicators/RangeBars/ProVolume.mq5 b/Indicators/RangeBars/ProVolume.mq5 new file mode 100644 index 0000000..45ac3f5 --- /dev/null +++ b/Indicators/RangeBars/ProVolume.mq5 @@ -0,0 +1,245 @@ +#property copyright "2017-2020, Artur Zas" +#property link "http://www.az-invest.eu" +//---- indicator settings +#property indicator_separate_window +#property indicator_buffers 7 +#property indicator_plots 5 + +#property indicator_label1 "Volume" +#property indicator_type1 DRAW_HISTOGRAM // volume +#property indicator_color1 Gray +#property indicator_style1 0 +#property indicator_width1 2 + +#property indicator_label2 "Buy volume" +#property indicator_type2 DRAW_HISTOGRAM // buy volume +#property indicator_color2 clrDarkGreen +#property indicator_style2 0 +#property indicator_width2 2 + +#property indicator_label3 "Sell volume" +#property indicator_type3 DRAW_HISTOGRAM // sell volume +#property indicator_color3 clrFireBrick +#property indicator_style3 0 +#property indicator_width3 2 + +#property indicator_label4 "Bar volume delta" +#property indicator_type4 DRAW_COLOR_HISTOGRAM // bar delta +#property indicator_color4 Lime,Red,clrNONE +#property indicator_style4 0 +#property indicator_width4 5 + +#property indicator_label5 "Cumulative volume delta" +#property indicator_type5 DRAW_COLOR_LINE // cumulative delta +#property indicator_color5 Green, Red, clrNONE +#property indicator_style5 STYLE_DOT +#property indicator_width5 1 + + +//--- input data +static ENUM_APPLIED_VOLUME InpVolumeType= (SymbolInfoInteger(_Symbol,SYMBOL_VOLUME) <= 0) ? VOLUME_TICK : VOLUME_REAL; // Volumes + +input bool InpShowVolume = true; // Show volume histogram +input bool InpShowBuySellVolume = true; // Show bar's buy/sell volume breakdown +input bool InpShowBarDelta = true; // Show bar's buy/sell volume delta +input bool InpShowCumulativeDelta = false; // Show cumulative volume delta +input int InpCumulativeDeltaScale = 1; // Scale down cumulative volume 1:x + +//---- indicator buffers +double ExtBarDeltaBuffer[]; +double ExtBarDeltaColorsBuffer[]; + +double ExtBuyVolumeBuffer[]; + +double ExtSellVolumeBuffer[]; + +double ExtVolumeBuffer[]; + +double ExtCumulativeVolumeBuffer[]; +double ExtCumulativeVolumeColorBuffer[]; + +double cumulativeDelta = 0; + +// + +#include + +// + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//---- buffers + SetIndexBuffer(0,ExtVolumeBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtBuyVolumeBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtSellVolumeBuffer,INDICATOR_DATA); + SetIndexBuffer(3,ExtBarDeltaBuffer,INDICATOR_DATA); + SetIndexBuffer(4,ExtBarDeltaColorsBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(5,ExtCumulativeVolumeBuffer,INDICATOR_DATA); + SetIndexBuffer(6,ExtCumulativeVolumeColorBuffer,INDICATOR_COLOR_INDEX); + +//---- name for DataWindow and indicator subwindow label + IndicatorSetString(INDICATOR_SHORTNAME,"Pro Volume"); +//---- indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,0); + + customChartIndicator.SetGetTimeFlag(); + customChartIndicator.SetGetVolumesFlag(); + customChartIndicator.SetGetVolumeBreakdownFlag(); +//---- + } +//+------------------------------------------------------------------+ +//| Volumes | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { +//---check for rates total + if(rates_total<2) + return(0); + + // + // Process data through MedianRenko indicator + // + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + // + // + // + +//--- starting work + int start=_prev_calculated-1; +//--- correct position +// if(start<1) start=1; + if(start<0) start=0; +//--- main cycle + CalculateData(start,rates_total); +//--- OnCalculate done. Return new prev_calculated. + return(rates_total); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CalculateData(const int nPosition, + const int nRatesCount) + { + double volume,buyVolume,sellVolume,barDelta; + + for(int i=nPosition;i0)) + { + if(IsNewDay(customChartIndicator.Time[i-1], customChartIndicator.Time[i])) + cumulativeDelta = 0; // reset cumulative volme + + cumulativeDelta += barDelta; + + ExtCumulativeVolumeBuffer[i] = cumulativeDelta / InpCumulativeDeltaScale; + ExtCumulativeVolumeColorBuffer[i] = ( ExtCumulativeVolumeBuffer[i] < 0 ) ? 1 : (( ExtCumulativeVolumeBuffer[i] == 0 ) ? 2 : 0 ); + } + else + { + ExtCumulativeVolumeBuffer[i] = (cumulativeDelta + barDelta) / InpCumulativeDeltaScale; + ExtCumulativeVolumeColorBuffer[i] = ( ExtCumulativeVolumeBuffer[i] < 0 ) ? 1 : (( ExtCumulativeVolumeBuffer[i] == 0 ) ? 2 : 0 ); + } + } + else + { + ExtCumulativeVolumeBuffer[i] = 0; + ExtCumulativeVolumeColorBuffer[i] = 2; + } + + } + } +//+------------------------------------------------------------------+ + +bool IsNewDay(datetime prevTime,datetime currTime) +{ + MqlDateTime prev; + MqlDateTime curr; + + TimeToStruct(prevTime,prev); + TimeToStruct(currTime,curr); + + if(prev.day_of_week != curr.day_of_week) + return true; + else + return false; + +} \ No newline at end of file diff --git a/Indicators/RangeBars/QQE.ex5 b/Indicators/RangeBars/QQE.ex5 new file mode 100644 index 0000000..ba8bb00 Binary files /dev/null and b/Indicators/RangeBars/QQE.ex5 differ diff --git a/Indicators/RangeBars/QQE.mq5 b/Indicators/RangeBars/QQE.mq5 new file mode 100644 index 0000000..c4d1d5a --- /dev/null +++ b/Indicators/RangeBars/QQE.mq5 @@ -0,0 +1,187 @@ + + +//+------------------------------------------------------------------ +#property copyright "mladen" +#property link "mladenfx@gmail.com" +#property description "QQE" +//+------------------------------------------------------------------ +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 3 +#property indicator_label1 "QQE fast" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrDarkGray +#property indicator_style1 STYLE_DOT +#property indicator_label2 "QQE slow" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrDarkGray +#property indicator_label3 "QQE" +#property indicator_type3 DRAW_COLOR_LINE +#property indicator_color3 clrDarkGray,clrDeepSkyBlue,clrLightSalmon +#property indicator_width3 2 +//--- input parameters +input int inpRsiPeriod = 14; // RSI period +input int inpRsiSmoothingFactor = 5; // RSI smoothing factor +input double inpWPFast = 2.618; // Fast period +input double inpWPSlow = 4.236; // Slow period +input ENUM_APPLIED_PRICE inpPrice=PRICE_CLOSE; // Price +//--- buffers declarations +double val[],valc[],levs[],levf[]; + +// + +#include + +// + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,levf,INDICATOR_DATA); + SetIndexBuffer(1,levs,INDICATOR_DATA); + SetIndexBuffer(2,val,INDICATOR_DATA); + SetIndexBuffer(3,valc,INDICATOR_COLOR_INDEX); +//--- indicator short name assignment + IndicatorSetString(INDICATOR_SHORTNAME,"QQE ("+(string)inpRsiPeriod+","+(string)inpRsiSmoothingFactor+")"); +//--- + return (INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator de-initialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + /// + + if(Bars(_Symbol,_Period)0 ? MathAbs(val[i-1]-val[i]) : 0),inpRsiPeriod,i,rates_total,1); + double _iEmm = iEma( _iEma,inpRsiPeriod,i,rates_total,2); + double _iEmf = _iEmm*inpWPFast; + double _iEms = _iEmm*inpWPSlow; + // + //--- + // + { + double tr = (i>0) ? levs[i-1] : 0; + double dv = tr; + if(val[i] < tr) { tr = val[i] + _iEms; if((i>0 && val[i-1] < dv) && (tr > dv)) tr = dv; } + if(val[i] > tr) { tr = val[i] - _iEms; if((i>0 && val[i-1] > dv) && (tr < dv)) tr = dv; } + levs[i]=tr; + } + { + double tr = (i>0) ? levf[i-1] : 0; + double dv = tr; + if(val[i] < tr) { tr = val[i] + _iEmf; if((i>0 && val[i-1] < dv) && (tr > dv)) tr = dv; } + if(val[i] > tr) { tr = val[i] - _iEmf; if((i>0 && val[i-1] > dv) && (tr < dv)) tr = dv; } + levf[i]=tr; + } + valc[i]=(val[i]>levf[i] && val[i]>levs[i]) ? 1 :(val[i]0) ? valc[i-1]: 0; + } + return (i); + } +//+------------------------------------------------------------------+ +//| Custom functions | +//+------------------------------------------------------------------+ +#define rsiInstances 1 +#define rsiInstancesSize 3 +double workRsi[][rsiInstances*rsiInstancesSize]; +#define _price 0 +#define _change 1 +#define _changa 2 +// +//--- +// +double iRsi(double price,double period,int r,int bars,int instanceNo=0) + { + if(ArrayRange(workRsi,0)!=bars) ArrayResize(workRsi,bars); + int z=instanceNo*rsiInstancesSize; + +// +// +// +// +// + + workRsi[r][z+_price]=price; + if(r=0; k++) sum+=MathAbs(workRsi[r-k][z+_price]-workRsi[r-k-1][z+_price]); + workRsi[r][z+_change] = (workRsi[r][z+_price]-workRsi[0][z+_price])/MathMax(k,1); + workRsi[r][z+_changa] = sum/MathMax(k,1); + } + else + { + double alpha=1.0/MathMax(period,1); + double change=workRsi[r][z+_price]-workRsi[r-1][z+_price]; + workRsi[r][z+_change] = workRsi[r-1][z+_change] + alpha*( change - workRsi[r-1][z+_change]); + workRsi[r][z+_changa] = workRsi[r-1][z+_changa] + alpha*(MathAbs(change) - workRsi[r-1][z+_changa]); + } + return(50.0*(workRsi[r][z+_change]/MathMax(workRsi[r][z+_changa],DBL_MIN)+1)); + } +// +//--- +// +double workEma[][3]; +// +//--- +// +double iEma(double price,double period,int r,int bars,int instanceNo=0) + { + if(ArrayRange(workEma,0)!=bars) ArrayResize(workEma,bars); + +// +//--- +// + + workEma[r][instanceNo]=price; + if(r>0 && period>1) + workEma[r][instanceNo]=workEma[r-1][instanceNo]+2.0/(1.0+period)*(price-workEma[r-1][instanceNo]); + return(workEma[r][instanceNo]); + } +// +//--- +// +double getPrice(ENUM_APPLIED_PRICE tprice,const double &open[],const double &close[],const double &high[],const double &low[],int i,int _bars) + { + switch(tprice) + { + case PRICE_CLOSE: return(close[i]); + case PRICE_OPEN: return(open[i]); + case PRICE_HIGH: return(high[i]); + case PRICE_LOW: return(low[i]); + case PRICE_MEDIAN: return((high[i]+low[i])/2.0); + case PRICE_TYPICAL: return((high[i]+low[i]+close[i])/3.0); + case PRICE_WEIGHTED: return((high[i]+low[i]+close[i]+close[i])/4.0); + } + return(0); + } +//+------------------------------------------------------------------+ diff --git a/Indicators/RangeBars/ROC.ex5 b/Indicators/RangeBars/ROC.ex5 new file mode 100644 index 0000000..59d018c Binary files /dev/null and b/Indicators/RangeBars/ROC.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_ROC.mq5 b/Indicators/RangeBars/ROC.mq5 similarity index 72% rename from Indicators/RangeBars/RangeBars_ROC.mq5 rename to Indicators/RangeBars/ROC.mq5 index 4ac37ad..c1195c3 100644 --- a/Indicators/RangeBars/RangeBars_ROC.mq5 +++ b/Indicators/RangeBars/ROC.mq5 @@ -19,15 +19,10 @@ double ExtRocBuffer[]; //--- global variable int ExtRocPeriod; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -80,13 +75,38 @@ int OnCalculate(const int rates_total,const int prev_calculated, { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); // diff --git a/Indicators/RangeBars/RSI.ex5 b/Indicators/RangeBars/RSI.ex5 new file mode 100644 index 0000000..e49b7bc Binary files /dev/null and b/Indicators/RangeBars/RSI.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_RSI.mq5 b/Indicators/RangeBars/RSI.mq5 similarity index 78% rename from Indicators/RangeBars/RangeBars_RSI.mq5 rename to Indicators/RangeBars/RSI.mq5 index cbeff62..eaf933e 100644 --- a/Indicators/RangeBars/RangeBars_RSI.mq5 +++ b/Indicators/RangeBars/RSI.mq5 @@ -25,15 +25,10 @@ double ExtRSIBuffer[]; double ExtPosBuffer[]; double ExtNegBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -78,15 +73,42 @@ int OnCalculate(const int rates_total,const int prev_calculated, const int &Spread[]) { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // int i,pos; diff --git a/Indicators/RangeBars/RVI.ex5 b/Indicators/RangeBars/RVI.ex5 new file mode 100644 index 0000000..041af84 Binary files /dev/null and b/Indicators/RangeBars/RVI.ex5 differ diff --git a/Indicators/RangeBars/RVI.mq5 b/Indicators/RangeBars/RVI.mq5 new file mode 100644 index 0000000..dbfba09 --- /dev/null +++ b/Indicators/RangeBars/RVI.mq5 @@ -0,0 +1,119 @@ +//+------------------------------------------------------------------+ +//| RVI.mq5 | +//| Copyright 2009-2017, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2017, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +#property description "Relative Vigor Index" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 2 +#property indicator_type1 DRAW_LINE +#property indicator_type2 DRAW_LINE +#property indicator_color1 Green +#property indicator_color2 Red +#property indicator_label1 "RVI" +#property indicator_label2 "Signal" +//--- input parameters +input int InpRVIPeriod=10; // Period +//--- indicator buffers +double ExtRVIBuffer[]; +double ExtSignalBuffer[]; + +// + +#include + +// + +//--- +#define TRIANGLE_PERIOD 3 +#define AVERAGE_PERIOD (TRIANGLE_PERIOD*2) +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtRVIBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA); + IndicatorSetInteger(INDICATOR_DIGITS,3); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,(InpRVIPeriod-1)+TRIANGLE_PERIOD); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,(InpRVIPeriod-1)+AVERAGE_PERIOD); +//--- name for DataWindow and indicator subwindow label + IndicatorSetString(INDICATOR_SHORTNAME,"RVI("+string(InpRVIPeriod)+")"); + PlotIndexSetString(0,PLOT_LABEL,"RVI("+string(InpRVIPeriod)+")"); + PlotIndexSetString(1,PLOT_LABEL,"Signal("+string(InpRVIPeriod)+")"); +//--- initialization done + } +//+------------------------------------------------------------------+ +//| Relative Vigor Index | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { + int i,j,nLimit; + double dValueUp,dValueDown,dNum,dDeNum; + +//--- check for bars count + if(rates_total<=InpRVIPeriod+AVERAGE_PERIOD+2) return(0); // exit with zero result + + // + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + +//--- check for possible errors + if(_prev_calculated<0) return(0); // exit with zero result +//--- last counted bar will be recounted + nLimit=InpRVIPeriod+2; + if(_prev_calculated>InpRVIPeriod+TRIANGLE_PERIOD+2) + nLimit=prev_calculated-1; +//--- set empty value for uncalculated bars + if(_prev_calculated==0) + { + for(i=0;ii-InpRVIPeriod;j--) + { + dValueUp=customChartIndicator.Close[j]-customChartIndicator.Open[j]+2*(customChartIndicator.Close[j-1]-customChartIndicator.Open[j-1])+2*(customChartIndicator.Close[j-2]-customChartIndicator.Open[j-2])+customChartIndicator.Close[j-3]-customChartIndicator.Open[j-3]; + dValueDown=customChartIndicator.High[j]-customChartIndicator.Low[j]+2*(customChartIndicator.High[j-1]-customChartIndicator.Low[j-1])+2*(customChartIndicator.High[j-2]-customChartIndicator.Low[j-2])+customChartIndicator.High[j-3]-customChartIndicator.Low[j-3]; + dNum+=dValueUp; + dDeNum+=dValueDown; + } + if(dDeNum!=0.0) + ExtRVIBuffer[i]=dNum/dDeNum; + else + ExtRVIBuffer[i]=dNum; + } +//--- signal line counted in the 2-nd buffer + nLimit=InpRVIPeriod+TRIANGLE_PERIOD+2; + if(_prev_calculated>InpRVIPeriod+AVERAGE_PERIOD+2) + nLimit=prev_calculated-1; + for(i=nLimit;i -#include -RangeBarIndicator customChartIndicator; +#include //+------------------------------------------------------------------+ //| Custom indicator initialization function | diff --git a/Indicators/RangeBars/Stochastic.ex5 b/Indicators/RangeBars/Stochastic.ex5 new file mode 100644 index 0000000..ab66c92 Binary files /dev/null and b/Indicators/RangeBars/Stochastic.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_Stochastic.mq5 b/Indicators/RangeBars/Stochastic.mq5 similarity index 79% rename from Indicators/RangeBars/RangeBars_Stochastic.mq5 rename to Indicators/RangeBars/Stochastic.mq5 index b6105e9..fca9139 100644 --- a/Indicators/RangeBars/RangeBars_Stochastic.mq5 +++ b/Indicators/RangeBars/Stochastic.mq5 @@ -5,7 +5,6 @@ //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" -#property description "Adapted for use with TickChart by Artur Zas." //--- indicator settings #property indicator_separate_window #property indicator_buffers 4 @@ -26,15 +25,10 @@ double ExtSignalBuffer[]; double ExtHighesBuffer[]; double ExtLowesBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include -// -// // //+------------------------------------------------------------------+ @@ -78,22 +72,44 @@ int OnCalculate(const int rates_total,const int prev_calculated, const long &Volume[], const int &Spread[]) { - // + // Process data through MedianRenko indicator // - // - + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(Close)) return(0); - + + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); // // - // + // int i,k,start; //--- check for bars count diff --git a/Indicators/RangeBars/T3.ex5 b/Indicators/RangeBars/T3.ex5 new file mode 100644 index 0000000..0261a3d Binary files /dev/null and b/Indicators/RangeBars/T3.ex5 differ diff --git a/Indicators/RangeBars/T3.mq5 b/Indicators/RangeBars/T3.mq5 new file mode 100644 index 0000000..80ea02b Binary files /dev/null and b/Indicators/RangeBars/T3.mq5 differ diff --git a/Indicators/RangeBars/TDI.ex5 b/Indicators/RangeBars/TDI.ex5 new file mode 100644 index 0000000..dd8b2d3 Binary files /dev/null and b/Indicators/RangeBars/TDI.ex5 differ diff --git a/Indicators/RangeBars/TDI.mq5 b/Indicators/RangeBars/TDI.mq5 new file mode 100644 index 0000000..c5169e7 Binary files /dev/null and b/Indicators/RangeBars/TDI.mq5 differ diff --git a/Indicators/RangeBars/TMA_CenteredBands.ex5 b/Indicators/RangeBars/TMA_CenteredBands.ex5 new file mode 100644 index 0000000..1979e62 Binary files /dev/null and b/Indicators/RangeBars/TMA_CenteredBands.ex5 differ diff --git a/Indicators/RangeBars/TMA_CenteredBands.mq5 b/Indicators/RangeBars/TMA_CenteredBands.mq5 new file mode 100644 index 0000000..4255c7e --- /dev/null +++ b/Indicators/RangeBars/TMA_CenteredBands.mq5 @@ -0,0 +1,301 @@ +//------------------------------------------------------------------ + + #property copyright "mladen" + #property link "www.forex-tsd.com" + +// Inserted by Ale: rebound arrows and TMA angle caution + +//------------------------------------------------------------------ + +#property indicator_chart_window +#property indicator_buffers 7 +#property indicator_plots 6 + +#property indicator_label1 "Centered TMA" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrLightSkyBlue,clrPink +#property indicator_style1 STYLE_SOLID +#property indicator_width1 2 +#property indicator_label2 "Centered TMA upper band" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrLightSkyBlue +#property indicator_style2 STYLE_DOT +#property indicator_label3 "Centered TMA lower band" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrPink +#property indicator_style3 STYLE_DOT +// ** inserted code: +#property indicator_label4 "Rebound down" +#property indicator_type4 DRAW_ARROW +#property indicator_color4 clrPink +#property indicator_width4 2 +#property indicator_label5 "Rebound up" +#property indicator_type5 DRAW_ARROW +#property indicator_color5 clrLightSkyBlue +#property indicator_width5 2 +#property indicator_label6 "Centered TMA angle caution" +#property indicator_type6 DRAW_ARROW +#property indicator_color6 clrGold +#property indicator_width6 3 +// ** + +// +// +// +// +// + +enum enPrices +{ + pr_close, // Close + pr_open, // Open + pr_high, // High + pr_low, // Low + pr_median, // Median + pr_typical, // Typical + pr_weighted, // Weighted + pr_average, // Average (high+low+oprn+close)/4 + pr_haclose, // Heiken ashi close + pr_haopen , // Heiken ashi open + pr_hahigh, // Heiken ashi high + pr_halow, // Heiken ashi low + pr_hamedian, // Heiken ashi median + pr_hatypical, // Heiken ashi typical + pr_haweighted, // Heiken ashi weighted + pr_haaverage // Heiken ashi average +}; + +// +// +// +// +// + +input int HalfLength = 12; // Centered TMA half period +input enPrices Price = pr_weighted; // Price to use +input int AtrPeriod = 100; // Average true range period +input double AtrMultiplier = 2; // Average true range multiplier +// ** inserted code: +input int TMAangle = 4; // Centered TMA angle caution. In pips +// ** + +// +// +// +// +// + +double tmac[]; +double tmau[]; +double tmad[]; +double colorBuffer[]; +// ** inserted code: +double + ReboundD[], ReboundU[], + Caution[] +; +// ** + +// + +#include + +// + +//------------------------------------------------------------------ +// +//------------------------------------------------------------------ +// +// +// +// +// + +int OnInit() +{ + SetIndexBuffer(0,tmac,INDICATOR_DATA); + SetIndexBuffer(1,colorBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(2,tmau,INDICATOR_DATA); + SetIndexBuffer(3,tmad,INDICATOR_DATA); +// ** inserted code: + SetIndexBuffer(4,ReboundD,INDICATOR_DATA); PlotIndexSetInteger(3, PLOT_ARROW, 226); + SetIndexBuffer(5,ReboundU,INDICATOR_DATA); PlotIndexSetInteger(4, PLOT_ARROW, 225); + SetIndexBuffer(6,Caution,INDICATOR_DATA); PlotIndexSetInteger(5, PLOT_ARROW, 251); +// ** + + // + // + // + // + // + + IndicatorSetString(INDICATOR_SHORTNAME," TMA centered ("+string(HalfLength)+")"); + return(0); +} + +//------------------------------------------------------------------ +// +//------------------------------------------------------------------ +// +// +// +// +// + +double prices[]; + +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime& time[], + const double& open[], + const double& high[], + const double& low[], + const double& close[], + const long& tick_volume[], + const long& volume[], + const int& spread[]) +{ + // + // + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + // + // + // + + if (ArraySize(prices)!=rates_total) ArrayResize(prices,rates_total); + for (int i=(int)MathMax(_prev_calculated-1, 0); i=0; j++) atr += MathMax(customChartIndicator.High[i-j-10],customChartIndicator.Close[i-j-11])-MathMin(customChartIndicator.Low[i-j-10],customChartIndicator.Close[i-j-11]); + atr /= AtrPeriod; + + double sum = (HalfLength+1)*prices[i]; + double sumw = (HalfLength+1); + for(int j=1, k=HalfLength; j<=HalfLength; j++, k--) + { + if ((i-j)>=0) + { + sum += k*prices[i-j]; + sumw += k; + } + if ((i+j)0) + { + colorBuffer[i] = colorBuffer[i-1]; + if (tmac[i] > tmac[i-1]) colorBuffer[i]= 0; + if (tmac[i] < tmac[i-1]) colorBuffer[i]= 1; + } + tmau[i] = tmac[i]+AtrMultiplier*atr; + tmad[i] = tmac[i]-AtrMultiplier*atr; + + +// ** inserted code: + ReboundD[i] = ReboundU[i] = Caution[i] = EMPTY_VALUE; + + if(i > 0) { + if(customChartIndicator.High[i-1] > tmau[i-1] && customChartIndicator.Close[i-1] > customChartIndicator.Open[i-1] && customChartIndicator.Close[i] < customChartIndicator.Open[i]) { + ReboundD[i] = customChartIndicator.High[i] + AtrMultiplier*atr/2; + if(tmac[i] - tmac[i-1] > TMAangle*_Point) Caution[i] = ReboundD[i] + 10*_Point; + } + if(low[i-1] < tmad[i-1] && customChartIndicator.Close[i-1] < customChartIndicator.Open[i-1] && customChartIndicator.Close[i] > customChartIndicator.Open[i]) { + ReboundU[i] = customChartIndicator.Low[i] - AtrMultiplier*atr/2; + if(tmac[i-1] - tmac[i] > TMAangle*_Point) Caution[i] = ReboundU[i] - 10*_Point; + } + } +// ** + + } + + return(rates_total); +} + + + +//------------------------------------------------------------------ +// +//------------------------------------------------------------------ +// +// +// +// +// + + +double workHa[][4]; +double getPrice(enPrices price, const double& open[], const double& close[], const double& high[], const double& low[], int i, int bars) +{ + if (price>=pr_haclose && price<=pr_haaverage) + { + if (ArrayRange(workHa,0)!= bars) ArrayResize(workHa,bars); + + // + // + // + // + // + + double haOpen; + if (i>0) + haOpen = (workHa[i-1][2] + workHa[i-1][3])/2.0; + else haOpen = open[i]+close[i]; + double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0; + double haHigh = MathMax(high[i], MathMax(haOpen,haClose)); + double haLow = MathMin(low[i] , MathMin(haOpen,haClose)); + + if(haOpen +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 Red +#property indicator_width1 1 +#property indicator_label1 "TRIX" +#property indicator_applied_price PRICE_CLOSE +//--- input parameters +input int InpPeriodEMA=14; // EMA period +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price +//--- indicator buffers +double TRIX_Buffer[]; +double EMA[]; +double SecondEMA[]; +double ThirdEMA[]; + +// + +#include + +// +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,TRIX_Buffer,INDICATOR_DATA); + SetIndexBuffer(1,EMA,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,SecondEMA,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ThirdEMA,INDICATOR_CALCULATIONS); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,3*InpPeriodEMA-3); +//--- name for index label + PlotIndexSetString(0,PLOT_LABEL,"TRIX("+string(InpPeriodEMA)+")"); +//--- name for indicator label + IndicatorSetString(INDICATOR_SHORTNAME,"TRIX("+string(InpPeriodEMA)+")"); +//--- indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,5); +//--- initialization done + + customChartIndicator.SetUseAppliedPriceFlag(InpAppliedPrice); + } +//+------------------------------------------------------------------+ +//| Triple Exponential Average | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { +//--- check for data + if(rates_total<3*InpPeriodEMA-3) + return(0); +//--- + + // + // Process data through MedianRenko indicator + // + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + // + // + // + + int limit; + if(_prev_calculated==0) + { + limit=3*(InpPeriodEMA-1); + for(int i=0;i -RangeBarIndicator customChartIndicator; +#include #define PREFIX_SEED "6D4E6" @@ -19,7 +18,7 @@ enum ENUM_DISPLAY_FORMAT DisplayFormat2, // 25.01 10:55 }; -input color InpTextColor = clrBlack; // Font color +input color InpTextColor = clrWhiteSmoke; // Font color input int InpFontSize = 9; // Font size input int InpSpacing = 3; // Date/Time spacing factor input ENUM_DISPLAY_FORMAT InpDispFormat = DisplayFormat1; // Display format @@ -251,4 +250,4 @@ bool TextCreate(const long chart_ID=0, // chart's ID return(true); } - \ No newline at end of file + \ No newline at end of file diff --git a/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 b/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 new file mode 100644 index 0000000..2800b0a Binary files /dev/null and b/Indicators/RangeBars/VEMA_Wilders_DMI.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_VEMA_Wilders_DMI.mq5 b/Indicators/RangeBars/VEMA_Wilders_DMI.mq5 similarity index 81% rename from Indicators/RangeBars/RangeBars_VEMA_Wilders_DMI.mq5 rename to Indicators/RangeBars/VEMA_Wilders_DMI.mq5 index 2584e77..b04c8a3 100644 --- a/Indicators/RangeBars/RangeBars_VEMA_Wilders_DMI.mq5 +++ b/Indicators/RangeBars/VEMA_Wilders_DMI.mq5 @@ -62,17 +62,11 @@ double ADX[]; double ADXR[]; double Level[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include // -// -// - //------------------------------------------------------------------ // //------------------------------------------------------------------ @@ -136,15 +130,42 @@ int OnCalculate(const int rates_total, const int& spread[]) { // + // Process data through MedianRenko indicator + // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // if (ArrayRange(averages,0)!=rates_total) ArrayResize(averages,rates_total); diff --git a/Indicators/RangeBars/VWAP_lite.ex5 b/Indicators/RangeBars/VWAP_lite.ex5 new file mode 100644 index 0000000..1e8e261 Binary files /dev/null and b/Indicators/RangeBars/VWAP_lite.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_VWAP_lite.mq5 b/Indicators/RangeBars/VWAP_lite.mq5 similarity index 90% rename from Indicators/RangeBars/RangeBars_VWAP_lite.mq5 rename to Indicators/RangeBars/VWAP_lite.mq5 index 1ff98fc..5d4f405 100644 --- a/Indicators/RangeBars/RangeBars_VWAP_lite.mq5 +++ b/Indicators/RangeBars/VWAP_lite.mq5 @@ -56,19 +56,14 @@ enum PRICE_TYPE //+------------------------------------------------------------------+ -// -// // -#include -RangeBarIndicator customChartIndicator; +#include #define VWAP_Daily "cc__VWAP_Daily" #define VWAP_Weekly "cc__VWAP_Weekly" #define VWAP_Monthly "cc__VWAP_Monthly" -// -// // datetime CreateDateTime(DATE_TYPE nReturnType=DAILY,datetime dtDay=D'2000.01.01 00:00:00',int pHour=0,int pMinute=0,int pSecond=0) @@ -199,7 +194,7 @@ int OnCalculate(const int rates_total, { // - // Process data through Tick Chat indicator + // Process data through MedianRenko indicator // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) @@ -208,6 +203,29 @@ int OnCalculate(const int rates_total, if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); // @@ -220,7 +238,7 @@ int OnCalculate(const int rates_total, LastTimePeriod=PERIOD_CURRENT; } - if(rates_total>_prev_calculated || bIsFirstRun || Calc_Every_Tick || (_prev_calculated == 0) ||customChartIndicator.IsNewBar) + if(rates_total>_prev_calculated || bIsFirstRun || Calc_Every_Tick || (_prev_calculated == 0) || customChartIndicator.IsNewBar) { nIdxDaily = 0; nIdxWeekly = 0; diff --git a/Indicators/RangeBars/Volatility.ex5 b/Indicators/RangeBars/Volatility.ex5 new file mode 100644 index 0000000..e9f644a Binary files /dev/null and b/Indicators/RangeBars/Volatility.ex5 differ diff --git a/Indicators/RangeBars/Volatility.mq5 b/Indicators/RangeBars/Volatility.mq5 new file mode 100644 index 0000000..1a9848a Binary files /dev/null and b/Indicators/RangeBars/Volatility.mq5 differ diff --git a/Indicators/RangeBars/Volume_Average_percent.ex5 b/Indicators/RangeBars/Volume_Average_percent.ex5 new file mode 100644 index 0000000..33cd755 Binary files /dev/null and b/Indicators/RangeBars/Volume_Average_percent.ex5 differ diff --git a/Indicators/RangeBars/Volume_Average_percent.mq5 b/Indicators/RangeBars/Volume_Average_percent.mq5 new file mode 100644 index 0000000..f825d00 Binary files /dev/null and b/Indicators/RangeBars/Volume_Average_percent.mq5 differ diff --git a/Indicators/RangeBars/Volumes.ex5 b/Indicators/RangeBars/Volumes.ex5 new file mode 100644 index 0000000..d0e63c7 Binary files /dev/null and b/Indicators/RangeBars/Volumes.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_volumes.mq5 b/Indicators/RangeBars/Volumes.mq5 similarity index 94% rename from Indicators/RangeBars/RangeBars_volumes.mq5 rename to Indicators/RangeBars/Volumes.mq5 index 572f138..acd18d0 100644 --- a/Indicators/RangeBars/RangeBars_volumes.mq5 +++ b/Indicators/RangeBars/Volumes.mq5 @@ -5,8 +5,6 @@ //+------------------------------------------------------------------+ #property copyright "2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" -#property description "Adapted for use with TickChart by Artur Zas." - //---- indicator settings #property indicator_separate_window #property indicator_buffers 2 @@ -14,7 +12,7 @@ #property indicator_type1 DRAW_COLOR_HISTOGRAM #property indicator_color1 Green,Red #property indicator_style1 0 -#property indicator_width1 2 +#property indicator_width1 1 #property indicator_minimum 0.0 //--- input data input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes @@ -22,17 +20,11 @@ input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes double ExtVolumesBuffer[]; double ExtColorsBuffer[]; -// -// // -#include -RangeBarIndicator customChartIndicator; +#include // -// -// - //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ @@ -66,17 +58,17 @@ int OnCalculate(const int rates_total, //---check for rates total if(rates_total<2) return(0); - + // - // Process data through XTickChart indicator + // Process data through MedianRenko indicator // if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); - + // // Make the following modifications in the code below: // @@ -87,9 +79,9 @@ int OnCalculate(const int rates_total, // customChartIndicator.High[] should be used instead of high[] // customChartIndicator.Close[] should be used instead of close[] // - // customChartIndicator.IsNewBar (true/false) informs you if a bar has completed + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed // - // customChartIndicator.Time[] shold be used instead of Time[] for checking the tick chart bar time. + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used // // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] @@ -111,7 +103,6 @@ int OnCalculate(const int rates_total, //--- correct position if(start<1) start=1; //--- main cycle - if(InpVolumeType==VOLUME_TICK) CalculateVolume(start,rates_total,customChartIndicator.Tick_volume); else diff --git a/Indicators/RangeBars/WPR.ex5 b/Indicators/RangeBars/WPR.ex5 new file mode 100644 index 0000000..0e9ddec Binary files /dev/null and b/Indicators/RangeBars/WPR.ex5 differ diff --git a/Indicators/RangeBars/RangeBars_WPR.mq5 b/Indicators/RangeBars/WPR.mq5 similarity index 76% rename from Indicators/RangeBars/RangeBars_WPR.mq5 rename to Indicators/RangeBars/WPR.mq5 index a999bc0..35fedc6 100644 Binary files a/Indicators/RangeBars/RangeBars_WPR.mq5 and b/Indicators/RangeBars/WPR.mq5 differ diff --git a/Indicators/RangeBars/WeisWaves.ex5 b/Indicators/RangeBars/WeisWaves.ex5 new file mode 100644 index 0000000..4a296ce Binary files /dev/null and b/Indicators/RangeBars/WeisWaves.ex5 differ diff --git a/Indicators/RangeBars/WeisWaves.mq5 b/Indicators/RangeBars/WeisWaves.mq5 new file mode 100644 index 0000000..6982781 --- /dev/null +++ b/Indicators/RangeBars/WeisWaves.mq5 @@ -0,0 +1,140 @@ +//+-------------------------------------------------------------------------------------+ +//| Minions.WeisWaves.mq5 | +//| (CC) Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License| +//| http://www.MinionsLabs.com | +//+-------------------------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Descriptors | +//+------------------------------------------------------------------+ + +//--- input parameters +input int ExtDeviation=5; + +//--- indicator buffers + +double deviation; // deviation in points + +#property version "1.0" +#property description "WeisWaves" +#property description " " + +//+------------------------------------------------------------------+ +//| Indicator Settings | +//+------------------------------------------------------------------+ +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 + +#property indicator_label1 "WeisWaves" +#property indicator_type1 DRAW_COLOR_HISTOGRAM +#property indicator_width1 4 +#property indicator_color1 clrGreen, clrRed + + +//+------------------------------------------------------------------+ +//| Inputs from User Interface | +//+------------------------------------------------------------------+ +input ENUM_APPLIED_VOLUME inpVolumeType = VOLUME_TICK; // Volume Type to use on waves + +// + +#include + +// +//+------------------------------------------------------------------+ +//| Global Variables | +//+------------------------------------------------------------------+ +double bufferWW[]; +double bufferColors[]; + + +//+------------------------------------------------------------------+ +//| OnInit() | +//+------------------------------------------------------------------+ +int OnInit() { + SetIndexBuffer( 0, bufferWW, INDICATOR_DATA ); + SetIndexBuffer( 1, bufferColors, INDICATOR_COLOR_INDEX ); + + IndicatorSetString( INDICATOR_SHORTNAME, "WeisWaves" ); + + customChartIndicator.SetGetVolumesFlag(); + + return INIT_SUCCEEDED; +} + + +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) { + + int i, barsToProcess, shouldStartIn = 2; + double vol; + + if (rates_total < shouldStartIn) { return 0; } // no enough bars to calculate the waves... + + // Process data through custom indicator indicator + + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) + return(0); + + if(!customChartIndicator.BufferSynchronizationCheck(close)) + return(0); + + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + + // + + // if it is the first start of calculation of the indicator or if the number of values in the indicator changed + // or if it is necessary to calculate the indicator for two or more bars (it means something has changed in the price history) + if (_prev_calculated == 0 || rates_total > _prev_calculated+1) { + bufferWW[0] = ( inpVolumeType==VOLUME_TICK ? (double)customChartIndicator.Tick_volume[0] : (double)customChartIndicator.Real_volume[0] ); + barsToProcess = rates_total; + } else { + // it means that it's not the first time of the indicator calculation, and since the last call of OnCalculate() + // for calculation not more than one bar is added + barsToProcess = (rates_total-_prev_calculated) + 1; + } + + + // calculates the volume waves... + for (i=rates_total-MathMax(shouldStartIn,barsToProcess-shouldStartIn); i= customChartIndicator.Close[i-1]) { // Closing UP? + + if (customChartIndicator.Close[i-1]>=customChartIndicator.Close[i-2]) { // continuing closing UP? + bufferWW[i] = bufferWW[i-1] + vol; + bufferColors[i] = 0; + } else { // no? resets the volume... + bufferWW[i] = vol; + bufferColors[i] = 0; + } + + } else { // Closing DOWN ? + + if (customChartIndicator.Close[i-1] -RangeBarIndicator customChartIndicator; +#include // -// -// - //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ @@ -132,17 +126,43 @@ int OnCalculate(const int rates_total, const int &spread[]) { // - + // Process data through MedianRenko indicator + // + if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,time,close)) return(0); - + if(!customChartIndicator.BufferSynchronizationCheck(close)) return(0); + // + // Make the following modifications in the code below: + // + // customChartIndicator.GetPrevCalculated() should be used instead of prev_calculated + // + // customChartIndicator.Open[] should be used instead of open[] + // customChartIndicator.Low[] should be used instead of low[] + // customChartIndicator.High[] should be used instead of high[] + // customChartIndicator.Close[] should be used instead of close[] + // + // customChartIndicator.IsNewBar (true/false) informs you if a renko brick completed + // + // customChartIndicator.Time[] shold be used instead of Time[] for checking the renko bar time. + // (!) customChartIndicator.SetGetTimeFlag() must be called in OnInit() for customChartIndicator.Time[] to be used + // + // customChartIndicator.Tick_volume[] should be used instead of TickVolume[] + // customChartIndicator.Real_volume[] should be used instead of Volume[] + // (!) customChartIndicator.SetGetVolumesFlag() must be called in OnInit() for Tick_volume[] & Real_volume[] to be used + // + // customChartIndicator.Price[] should be used instead of Price[] + // (!) customChartIndicator.SetUseAppliedPriceFlag(ENUM_APPLIED_PRICE _applied_price) must be called in OnInit() for customChartIndicator.Price[] to be used + // + int _prev_calculated = customChartIndicator.GetPrevCalculated(); + // + // // - int i=0; int limit=0,counterZ=0,whatlookfor=0; int shift=0,back=0,lasthighpos=0,lastlowpos=0;