Author: Copyright 2004, MetaQuotes Software Corp.
Painter_v1

This tool is designed to enhance your trading charts by transforming standard price data into a more visual, smoothed format known as Heiken Ashi. Instead of looking at the standard erratic movements of raw price candles, this script recalculates the price action to provide a clearer picture of market trends and momentum.

How it Works

The script operates by processing every historical bar on your chart and recalculating four specific values for each period:

  • Smoothed Price Points: It averages the opening and closing prices of previous candles to determine new "Heiken Ashi" open and close values.
  • Dynamic Range Mapping: Based on these calculations, it identifies the highest and lowest boundaries of the price movement. If the current trend is moving upward, it marks the lower boundary; if the trend is downward, it highlights the upper boundary.
  • Visual Differentiation: The script uses different visual weights (different line thicknesses) to distinguish between primary price movements and secondary data points.

Time-Based Filtering

A unique feature of this logic is its ability to filter information based on the time of day. You can define specific starting and finishing hours within the settings:

  • Active Trading Window: During your specified hours, the script focuses on highlighting the smoothed price boundaries to help you identify the primary direction of the trend.
  • Outside Trading Hours: When the market is outside your preferred timeframe (such as during late-night sessions or holidays), the logic switches its behavior. It shifts its focus to marking the extremes (the absolute highs and lows) of the price action, providing a different perspective on how the market behaves when it is not within your primary observation period.

Key Benefits for the User

By using this script, you transition from viewing raw "noise" to viewing a calculated trend. It simplifies the visual environment by:

  1. Smoothing Out Volatility: Reducing the "jitter" of standard candles to reveal the underlying move.
  2. Automated Trend Identification: Providing clear visual cues on whether the current momentum is bullish or bearish based on the calculated price averages.
  3. Customized Visibility: Allowing you to see different types of data depending on what time of day you are trading, ensuring the chart remains relevant to your specific trading style.
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
Painter_v1
//+------------------------------------------------------------------+
//|                                                   Painter_v1.mq4 |
//|                        Copyright 2004, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
//| For Heiken Ashi we recommend next chart settings ( press F8 or   |
//|    select on menu 'Charts'->'Properties...'):                    |
//|  - On 'Color' Tab select 'Black' for 'Line Graph'                |
//|  - On 'Common' Tab disable 'Chart on Foreground' checkbox and    |
//|    select 'Line Chart' radiobutton                               |
//+------------------------------------------------------------------+
#property copyright "Copyright 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//----
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 Blue
#property indicator_color5 Lime
#property indicator_color6 Lime
#property indicator_color7 Lime
#property indicator_color8 Lime
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 1
#property indicator_width6 1
#property indicator_width7 3
#property indicator_width8 3
//----
extern int Hours_START =8;
extern int Hours_FINISH =18;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3, ExtMapBuffer4);
//----
   SetIndexStyle(4,DRAW_HISTOGRAM);
   SetIndexBuffer(4, ExtMapBuffer5);
   SetIndexStyle(5,DRAW_HISTOGRAM);
   SetIndexBuffer(5, ExtMapBuffer6);
   SetIndexStyle(6,DRAW_HISTOGRAM);
   SetIndexBuffer(6, ExtMapBuffer7);
   SetIndexStyle(7,DRAW_HISTOGRAM);
   SetIndexBuffer(7, ExtMapBuffer8);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
   SetIndexDrawBegin(4,10);
   SetIndexDrawBegin(5,10);
   SetIndexDrawBegin(6,10);
   SetIndexDrawBegin(7,10);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
//----
   return(0);
  }
//THIS IS LEFT UNTOUCHES AS IN THE ORIGINAL INDICATOR  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double haOpen, haHigh, haLow, haClose;
   if(Bars<=10) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
   int pos=Bars-ExtCountedBars-1;
   while(pos>=0)
     {
      haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
      haClose=(Open[pos]+High[pos]+Low[pos]+Close[pos])/4;
      haHigh=MathMax(High[pos], MathMax(haOpen, haClose));
      haLow=MathMin(Low[pos], MathMin(haOpen, haClose));
//----
      if (haOpen<haClose)
        {
         ExtMapBuffer1[pos]=haLow;
         ExtMapBuffer2[pos]=haHigh;
        }
      else
        {
         ExtMapBuffer1[pos]=haHigh;
         ExtMapBuffer2[pos]=haLow;
        }
      ExtMapBuffer3[pos]=haOpen;
      ExtMapBuffer4[pos]=haClose;
//----
      bool withinPeriod=TimeHour(Time[pos])>=Hours_START && TimeHour(Time[pos])< Hours_FINISH;
      if (!withinPeriod)
        {
         ExtMapBuffer5[pos]=haHigh;
         ExtMapBuffer6[pos]=haLow;
         ExtMapBuffer7[pos]=MathMax(haOpen,haClose);
         ExtMapBuffer8[pos]=MathMin(haClose,haOpen);
        }
      pos--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments