RSICandleKeltner_v1

Author: Copyright © 2017, Nikolay Kositsin

Okay, here's a breakdown of what this MetaTrader script does, explained in plain language:

Overall Purpose:

This script is designed to visually represent market trends using a combination of two popular technical indicators: the Relative Strength Index (RSI) and Keltner Channels. Instead of just showing the standard RSI line, it attempts to display RSI values as "candles" similar to price candles. It also plots Keltner Channels around a smoothed RSI, aiming to provide additional context about potential price movement and volatility.

Key Components and What They Do:

  1. Indicators:

    • RSI (Relative Strength Index): The RSI is a momentum indicator that measures the magnitude of recent price changes to evaluate overbought or oversold conditions in the price of a stock or other asset. This script actually uses four RSIs, calculated using the open, high, low, and close prices of each period.

    • Moving Average (MA): It calculates a moving average of the RSI calculated on the close prices. This smooths out the RSI data.

    • Keltner Channels: These are bands plotted around the moving average. They're typically used to identify potential overbought or oversold levels based on the volatility of the price. The width of the channels is determined by a ratio of the range of the prices.

  2. The "Candles":

    • The script attempts to draw candlestick-like bars based on the RSI values calculated from the open, high, low, and close prices. It uses the RSI from the open as the candle's "open," the RSI from the high as the candle's "high," the RSI from the low as the candle's "low," and the RSI from the close as the candle's "close."
  3. The Channels:

    • The script calculates an upper and lower band (the Keltner Channels) around the Moving Average of the RSI. These bands change based on a period of volatility.

How it Works (Step-by-Step):

  1. Initialization (OnIInit):

    • The script sets up the parameters you can adjust (like the RSI period and Keltner Channel period).
    • It creates the four RSI indicators (one for open, high, low, and close prices) and the moving average. If it can't create these, it stops.
    • It sets up the "buffers" which are temporary storage areas for the data it calculates. These will be the open, high, low, and close values for the RSI candles and also the border values.
    • It configures the "candles" and channel plot to start drawing after a certain number of bars (historical periods) have been calculated.
    • It tells the charting platform that the buffers should be treated as a time series (newest data at the beginning).
  2. Calculation (OnCalculate): This is where the magic happens for each new price bar:

    • Data Check: It checks if enough data is available to calculate the indicators. If not, it stops.
    • Determine Calculation Range: It figures out which price bars need to be processed (either all of them initially, or just the new ones).
    • Copy Data: It copies the RSI values and MA values from the built-in indicators into its own internal buffers. If there's an error copying the data, it stops.
    • RSI Candle Calculation:
      • The script loops through each bar within the calculation range.
      • For each bar, it calculates the maximum and minimum values of the "open" and "close" RSI.
      • Using these, it sets the "high" to the maximum value between the previous high and the maximum of the close/open
      • It does the same on the Low side using the min function.
      • It determines the color of the "candle" based on whether the "close" RSI is higher or lower than the "open" RSI.
    • Channel calculation:
      • For each bar, the script calculates the Keltner Channel with a volatility and a ratio parameter and adds it to the Moving Average to create a border.

In Summary:

The script aims to provide a different way of visualizing RSI data by representing it as candlestick-like bars and showing Keltner Channels. The parameters can be adjusted in order to modify the sensitivity and timing.

Indicators Used
Relative strength indexMoving average indicator
3 Views
0 Downloads
0 Favorites
RSICandleKeltner_v1
ÿþ//+------------------------------------------------------------------+

//|                                             RSICandleKeltner.mq5 |

//|                               Copyright © 2017, Nikolay Kositsin | 

//|                              Khabarovsk,   farria@mail.redcom.ru | 

//+------------------------------------------------------------------+

#property copyright "Copyright © 2017, Nikolay Kositsin"

#property link "farria@mail.redcom.ru"

#property description "RSICandle Smoothed"

//---- =><5@ 25@A88 8=48:0B>@0

#property version   "1.00"

//+----------------------------------------------+

//|  0@0<5B@K >B@8A>2:8 8=48:0B>@0              |

//+----------------------------------------------+

//---- >B@8A>2:0 8=48:0B>@0 2 >B45;L=>< >:=5

#property indicator_separate_window

//---- 4;O @0AG5B0 8 >B@8A>2:8 8=48:0B>@0 8A?>;L7>20=> A5<L 1CD5@>2

#property indicator_buffers 7

//---- 8A?>;L7>20=> 2A53> 420 3@0D8G5A:8E ?>AB@>5=8O

#property indicator_plots   2

//---- 2 :0G5AB25 8=48:0B>@0 8A?>;L7>20=K F25B=K5 A25G8

#property indicator_type1   DRAW_COLOR_CANDLES

#property indicator_color1   clrDeepPink,clrBlue,clrTeal

//---- >B>1@065=85 <5B:8 8=48:0B>@0

#property indicator_label1  "RSICandle Open;RSICandle High;RSICandle Low;RSICandle Close"

//+----------------------------------------------+

//|  0@0<5B@K >B@8A>2:8 8=48:0B>@0 C@>2=59      |

//+----------------------------------------------+

//---- >B@8A>2:0 :0=0;0 2 2845 >1;0:0

#property indicator_type2   DRAW_FILLING

//---- 2K1>@ F25B0 >1;0:0

#property indicator_color2  clrLavender

//---- >B>1@065=85 <5B:8 8=48:0B>@0

#property indicator_label2  "Channels"

//+----------------------------------------------+

//| 0@0<5B@K >B>1@065=8O 3>@87>=B0;L=KE C@>2=59 |

//+----------------------------------------------+

#property indicator_level1  +70

#property indicator_level2  +50

#property indicator_level3  +30

#property indicator_levelcolor clrBlueViolet

#property indicator_levelstyle STYLE_DASHDOTDOT

//+----------------------------------------------+

//|  >1JO2;5=85 :>=AB0=B                         |

//+----------------------------------------------+

#define RESET  0 // >=AB0=B0 4;O 2>72@0B0 B5@<8=0;C :><0=4K =0 ?5@5AGQB 8=48:0B>@0

//+----------------------------------------------+

//| E>4=K5 ?0@0<5B@K 8=48:0B>@0                 |

//+----------------------------------------------+

input uint RSI_Period=14;

input int KeltnerPeriod=20; //?5@8>4 CA@54=5=8O 5;B=5@0

input double Ratio=3.01;    //45280F8O :0=0;0

input int Shift=0;          //A4283 :0=0;0 ?> 3>@87>=B0;8 2 10@0E

//+----------------------------------------------+



//---- >1JO2;5=85 48=0<8G5A:8E <0AA82>2, :>B>@K5 1C4CB 2 

// 40;L=59H5< 8A?>;L7>20=K 2 :0G5AB25 8=48:0B>@=KE 1CD5@>2

double ExtOpenBuffer[];

double ExtHighBuffer[];

double ExtLowBuffer[];

double ExtCloseBuffer[];

double ExtColorBuffer[];

//---- >1JO2;5=85 48=0<8G5A:8E <0AA82>2, :>B>@K5 1C4CB 2 40;L=59H5< 8A?>;L7>20=K 2 :0G5AB25 8=48:0B>@=KE 1CD5@>2

double BorderTopBuffer[],BorderBotBuffer[];



//---- 1JO2;5=85 F5;KE ?5@5<5==KE =0G0;0 >BAGQB0 40==KE

int min_rates_1,min_rates_total;

//---- 1JO2;5=85 F5;KE ?5@5<5==KE 4;O E5=4;>2 8=48:0B>@>2

int RSI_Handle[4],MA_Handle;

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//---- 8=8F80;870F8O 3;>10;L=KE ?5@5<5==KE 

   min_rates_1=int(RSI_Period);

   min_rates_total=min_rates_1+int(KeltnerPeriod);



//---- ?>;CG5=85 E5=4;0 8=48:0B>@0 iRSI

   RSI_Handle[0]=iRSI(NULL,0,RSI_Period,PRICE_OPEN);

   if(RSI_Handle[0]==INVALID_HANDLE)

     {

      Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 iRSI["+string(0)+"]!");

      return(INIT_FAILED);

     }



   RSI_Handle[1]=iRSI(NULL,0,RSI_Period,PRICE_HIGH);

   if(RSI_Handle[1]==INVALID_HANDLE)

     {

      Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 iRSI["+string(1)+"]!");

      return(INIT_FAILED);

     }



   RSI_Handle[2]=iRSI(NULL,0,RSI_Period,PRICE_LOW);

   if(RSI_Handle[2]==INVALID_HANDLE)

     {

      Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 iRSI["+string(2)+"]!");

      return(INIT_FAILED);

     }



   RSI_Handle[3]=iRSI(NULL,0,RSI_Period,PRICE_CLOSE);

   if(RSI_Handle[3]==INVALID_HANDLE)

     {

      Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 iRSI["+string(3)+"]!");

      return(INIT_FAILED);

     }

//---- ?>;CG5=85 E5=4;0 8=48:0B>@0 iMA

   MA_Handle=iMA(NULL,0,KeltnerPeriod,0,MODE_SMA,RSI_Handle[3]);

   if(MA_Handle==INVALID_HANDLE)

     {

      Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 iMA");

      return(INIT_FAILED);

     }



//---- ?@52@0I5=85 48=0<8G5A:8E <0AA82>2 2 8=48:0B>@=K5 1CD5@K

   SetIndexBuffer(0,ExtOpenBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,ExtHighBuffer,INDICATOR_DATA);

   SetIndexBuffer(2,ExtLowBuffer,INDICATOR_DATA);

   SetIndexBuffer(3,ExtCloseBuffer,INDICATOR_DATA);



//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 F25B>2>9, 8=45:A=K9 1CD5@   

   SetIndexBuffer(4,ExtColorBuffer,INDICATOR_COLOR_INDEX);



//---- ?@52@0I5=85 48=0<8G5A:8E <0AA82>2 2 8=48:0B>@=K5 1CD5@K

   SetIndexBuffer(5,BorderTopBuffer,INDICATOR_DATA);

   SetIndexBuffer(6,BorderBotBuffer,INDICATOR_DATA);

//---- CAB0=>2:0 ?>78F88, A :>B>@>9 =0G8=05BAO >B@8A>2:0 :0=0;0

   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);

//---- 70?@5B =0 >B@8A>2:C 8=48:0B>@>< ?CABKE 7=0G5=89

   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//--- >ACI5AB2;5=85 A42830 8=48:0B>@>2 ?> 3>@87>=B0;8 =0 Shift

   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);



//---- 8=45:A0F8O M;5<5=B>2 2 1CD5@0E :0: 2 B09<A5@8OE

   ArraySetAsSeries(ExtOpenBuffer,true);

   ArraySetAsSeries(ExtHighBuffer,true);

   ArraySetAsSeries(ExtLowBuffer,true);

   ArraySetAsSeries(ExtCloseBuffer,true);

   ArraySetAsSeries(ExtColorBuffer,true);

   ArraySetAsSeries(BorderTopBuffer,true);

   ArraySetAsSeries(BorderBotBuffer,true);



//---- 70?@5B =0 >B>1@065=85 7=0G5=89 8=48:0B>@0 2 ;52>< 25@E=5< C3;C >:=0 8=48:0B>@0

   PlotIndexSetInteger(0,PLOT_SHOW_DATA,false);

   PlotIndexSetInteger(1,PLOT_SHOW_DATA,false);



//---- >ACI5AB2;5=85 A42830 =0G0;0 >BAG5B0 >B@8A>2:8 8=48:0B>@0 1

   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);



//---- #AB0=>2:0 D>@<0B0 B>G=>AB8 >B>1@065=8O 8=48:0B>@0

   IndicatorSetInteger(INDICATOR_DIGITS,0);

//---- 8<O 4;O >:>= 40==KE 8 <5B:0 4;O AC1J>:>= 

   string short_name="RSICandleKeltner";

   IndicatorSetString(INDICATOR_SHORTNAME,short_name);

//--- 7025@H5=85 8=8F80;870F88

   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[])

  {

//---- ?@>25@:0 :>;8G5AB20 10@>2 =0 4>AB0B>G=>ABL 4;O @0AGQB0

   if(BarsCalculated(RSI_Handle[0])<rates_total

      || BarsCalculated(RSI_Handle[1])<rates_total

      || BarsCalculated(RSI_Handle[2])<rates_total

      || BarsCalculated(RSI_Handle[3])<rates_total

      || BarsCalculated(MA_Handle)<rates_total

      || rates_total<min_rates_total)

      return(RESET);



//---- >1JO2;5=8O ;>:0;L=KE ?5@5<5==KE 

   int to_copy,limit,bar;

   double MA[];



//---- @0AGQBK =5>1E>48<>3> :>;8G5AB20 :>?8@C5<KE 40==KE 8 AB0@B>2>3> =><5@0 limit 4;O F8:;0 ?5@5AGQB0 10@>2

   if(prev_calculated>rates_total || prev_calculated<=0)// ?@>25@:0 =0 ?5@2K9 AB0@B @0AGQB0 8=48:0B>@0

     {

      limit=rates_total-min_rates_total-1; // AB0@B>2K9 =><5@ 4;O @0AGQB0 2A5E 10@>2

     }

   else

     {

      limit=rates_total-prev_calculated; // AB0@B>2K9 =><5@ 4;O @0AGQB0 =>2KE 10@>2

     }



   to_copy=limit+1;



//---- :>?8@C5< 2=>2L ?>O282H85AO 40==K5 2 <0AA82K

   if(CopyBuffer(RSI_Handle[0],0,0,to_copy,ExtOpenBuffer)<=0) return(RESET);

   if(CopyBuffer(RSI_Handle[1],0,0,to_copy,ExtHighBuffer)<=0) return(RESET);

   if(CopyBuffer(RSI_Handle[2],0,0,to_copy,ExtLowBuffer)<=0) return(RESET);

   if(CopyBuffer(RSI_Handle[3],0,0,to_copy,ExtCloseBuffer)<=0) return(RESET);

   if(CopyBuffer(MA_Handle,0,0,to_copy,MA)<=0) return(RESET);

   

//---- 8=45:A0F8O M;5<5=B>2 2 <0AA820E :0: 2 B09<A5@8OE  

   ArraySetAsSeries(MA,true);



//---- A=>2=>9 F8:; 8A?@02;5=8O 8 >:@0H820=8O A25G59

   for(bar=limit; bar>=0 && !IsStopped(); bar--)

     {

      double Max=MathMax(ExtOpenBuffer[bar],ExtCloseBuffer[bar]);

      double Min=MathMin(ExtOpenBuffer[bar],ExtCloseBuffer[bar]);



      ExtHighBuffer[bar]=MathMax(Max,ExtHighBuffer[bar]);

      ExtLowBuffer[bar]=MathMin(Min,ExtLowBuffer[bar]);



      if(ExtOpenBuffer[bar]<ExtCloseBuffer[bar]) ExtColorBuffer[bar]=2.0;

      else if(ExtOpenBuffer[bar]>ExtCloseBuffer[bar]) ExtColorBuffer[bar]=0.0;

      else ExtColorBuffer[bar]=1.0;



      double Keltner=Ratio*GetKeltner(KeltnerPeriod,bar,ExtHighBuffer,ExtLowBuffer);

      BorderTopBuffer[bar]=MA[bar]+Keltner;

      BorderBotBuffer[bar]=MA[bar]-Keltner;

     }

//----     

   return(rates_total);

  }

//+------------------------------------------------------------------+

// 2KG8A;5=85 ?>;>28=K H8@8=K :0=0;0 5;B=5@0                        |

//+------------------------------------------------------------------+ 

double GetKeltner(int period,int bar,const double &High[],const double &Low[])

  {

//----

   double Resalt,sum=0;

   for(int iii=0; iii<period; iii++)

      sum+=High[bar+iii] - Low[bar+iii];

   Resalt = sum / period;

   return(Resalt);

//----

  }

//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---