This script is designed to overlay the price action of one currency pair (let's call it the "SubSymbol", like USDJPY) onto the chart of another currency pair (the one you're currently viewing). It's like looking at two different maps of the same area, but one is drawn on top of the other to compare them.
Here's a breakdown of what it does:
-
Setup: The script starts by setting up some preferences that you can adjust, such as which currency pair to overlay (SubSymbol), the colors of the bars representing price changes (BullBarColor and BearBarColor), and the color of a grid that will be drawn (GridColor). There's also a "Mirroring" option that can flip the SubSymbol's price data upside down, allowing you to examine inverse relationships.
-
Initialization: When the script starts running, it labels itself clearly on the chart with the SubSymbol's name. It prepares internal storage spaces (called "buffers") to hold the data it will calculate for the overlay.
-
Deinitialization: When the script is stopped or removed, it cleans up the chart by deleting all the objects it created, such as the grid lines, price labels, and status information.
-
Data Processing and Display: This is the main part where the script does its work:
- Determining Visible Data: It figures out how many bars (periods of time) are currently visible on your chart.
- Calculating Highs, Lows, and Centers: It finds the highest and lowest prices on both your main chart and the SubSymbol's chart, and calculates the middle points of those ranges.
- Calculating the 'Ratio': It figures out a scaling factor (the "PipsRatio") that represents how much bigger or smaller the price movements on your main chart are compared to the SubSymbol's chart. This is important so that the SubSymbol's price action is displayed properly on your chart, even if the two currencies have very different price ranges.
- Drawing the Overlay: It goes through each bar (period of time) visible on your chart and does the following:
- Gets the open, high, low, and close prices for the SubSymbol.
- Adjusts these prices relative to the SubSymbol's center price.
- Scales these adjusted prices using the 'Ratio' we calculated earlier.
- Draws "candlesticks" or "bars" on your main chart, representing the price action of the SubSymbol, using the chosen colors. The height of each bar represents the price range for that period.
- Drawing the Grid: The script draws a grid on your chart to help you visually compare the price levels of the SubSymbol with your main chart.
- It calculates the price levels for each grid line based on the SubSymbol's price range and the "Grid" setting you chose.
- It draws horizontal lines representing these price levels across your chart.
- It labels each grid line with its corresponding price from the SubSymbol.
- Displaying Information: The script displays a copyright notice, and also shows the open, high, low, and close prices of the SubSymbol for the most recent bar, to provide you with real-time information.
In short, this script takes the price movements of one currency pair, scales it appropriately, and draws it as an overlay on your current chart, along with a grid to help you compare price levels.
//+------------------------------------------------------------------+
//| OverLay Chart.mq4 Ver.1.10 |
//| Copyright© 2006-2007 S.B.T. |
//| http://sufx.core.t3-ism.net/ |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+
//| This script is free to use/distribute/modify and re-distribute. |
//| (Limited to noncommercial use.) |
//+------------------------------------------------------------------+
//Indicator Properties
#property copyright "Copyright© 2006 S.B.T."
#property link "http://sufx.core.t3-ism.net/"
#property indicator_chart_window
#property indicator_buffers 4
//Indicator Parameters
extern string SubSymbol = "USDJPY";
extern color BullBarColor = MediumSeaGreen;
extern color BearBarColor = Orange;
extern color GridColor = Black;
extern bool Mirroring = false;
//Global Variables
string Prefix; //Indicator Prefix
int Grid = 10; //Grid Lines
int SnapPips = 10; //Snap Pips For Grid Lines
//Indicator Buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
//Initialize Indexes
Prefix = "OverLayChart" + SubSymbol;
IndicatorShortName( "OverLay Chart( " + SubSymbol + " )" );
SetIndexBuffer( 0, ExtMapBuffer1 );
SetIndexBuffer( 1, ExtMapBuffer2 );
SetIndexBuffer( 2, ExtMapBuffer3 );
SetIndexBuffer( 3, ExtMapBuffer4 );
SetIndexStyle( 0, DRAW_HISTOGRAM, DRAW_LINE, 1, BullBarColor );
SetIndexStyle( 1, DRAW_HISTOGRAM, DRAW_LINE, 1, BearBarColor );
SetIndexStyle ( 2, DRAW_HISTOGRAM, DRAW_LINE, 3, BullBarColor );
SetIndexStyle( 3, DRAW_HISTOGRAM, DRAW_LINE, 3, BearBarColor );
SetIndexEmptyValue( 0, 0.0 );
SetIndexEmptyValue( 1, 0.0 );
SetIndexEmptyValue( 2, 0.0 );
SetIndexEmptyValue( 3, 0.0 );
return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
int _i;
//Delete Objects
ObjectDelete( Prefix + "Status" );
ObjectDelete( Prefix + "Copyright" );
for ( _i = 1; _i <= Grid ; _i ++ ) {
ObjectDelete( Prefix + "Grid" + _i );
ObjectDelete( Prefix + "Price" + _i );
}
return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int _BarsCount;
double _CurRangeHigh, _CurRangeLow, _CurRangeCenter;
double _SubRangeHigh, _SubRangeLow, _SubRangeCenter;
double _SubPoint, _SubDigit;
double _SubOpen, _SubHigh, _SubLow, _SubClose;
double _PipsRatio;
double _GridPips, _GridPrice;
int _i;
//Initialize Buffers
RefreshRates();
ArrayInitialize( ExtMapBuffer1, 0.0 );
ArrayInitialize( ExtMapBuffer2, 0.0 );
ArrayInitialize( ExtMapBuffer3, 0.0 );
ArrayInitialize( ExtMapBuffer4, 0.0 );
//Calculate Visible Bars
_BarsCount = BarsPerWindow() + 1;
int _FirstBar = FirstVisibleBar();
int _LastBar = _FirstBar - _BarsCount + 1;
if ( _LastBar < 0 ) {
_LastBar = 0;
_BarsCount = _FirstBar + 1;
}
//Calculate Chart Ratio
_CurRangeHigh = High[Highest(NULL, 0, MODE_HIGH, _BarsCount, _LastBar)];
_CurRangeLow = Low[Lowest(NULL, 0, MODE_LOW, _BarsCount, _LastBar)];
_CurRangeCenter = ( _CurRangeHigh + _CurRangeLow ) / 2;
if ( Mirroring ) {
_SubRangeHigh = iLow( SubSymbol, 0, Lowest( SubSymbol, 0, MODE_LOW, _BarsCount, _LastBar ) );
_SubRangeLow = iHigh( SubSymbol, 0, Highest( SubSymbol, 0, MODE_HIGH, _BarsCount, _LastBar ) );
} else {
_SubRangeHigh = iHigh( SubSymbol, 0, Highest( SubSymbol, 0, MODE_HIGH, _BarsCount, _LastBar ) );
_SubRangeLow = iLow( SubSymbol, 0, Lowest( SubSymbol, 0, MODE_LOW, _BarsCount, _LastBar ) );
}
_SubRangeCenter = ( _SubRangeHigh + _SubRangeLow ) / 2;
_SubPoint = MarketInfo( SubSymbol, MODE_POINT );
_SubDigit = MarketInfo( SubSymbol, MODE_DIGITS );
_PipsRatio = ( _CurRangeHigh - _CurRangeLow ) / ( _SubRangeHigh - _SubRangeLow );
_GridPips = ( _SubRangeHigh - _SubRangeLow ) / Grid;
_GridPips = MathRound( ( _SubRangeHigh - _SubRangeLow ) / Grid / ( _SubPoint * SnapPips ) ) * ( _SubPoint * SnapPips );
//Draw Candlesticks
for ( _i = _LastBar; _i < _LastBar + _BarsCount; _i ++ ) {
_SubOpen = iOpen( SubSymbol, 0, _i ) - _SubRangeCenter;
_SubHigh = iHigh( SubSymbol, 0, _i ) - _SubRangeCenter;
_SubLow = iLow( SubSymbol, 0, _i ) - _SubRangeCenter;
_SubClose = iClose( SubSymbol, 0, _i ) - _SubRangeCenter;
if ( Mirroring ) {
if ( _SubOpen < _SubClose ) {
ExtMapBuffer2[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
ExtMapBuffer1[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
} else {
ExtMapBuffer2[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
ExtMapBuffer1[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
}
ExtMapBuffer4[_i] = _CurRangeCenter + _SubClose * _PipsRatio;
ExtMapBuffer3[_i] = _CurRangeCenter + _SubOpen * _PipsRatio;
} else {
if ( _SubOpen < _SubClose ) {
ExtMapBuffer1[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
ExtMapBuffer2[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
} else {
ExtMapBuffer1[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
ExtMapBuffer2[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
}
ExtMapBuffer3[_i] = _CurRangeCenter + _SubClose * _PipsRatio;
ExtMapBuffer4[_i] = _CurRangeCenter + _SubOpen * _PipsRatio;
}
}
//Draw Objects
ObjectCreate( Prefix + "Copyright", OBJ_LABEL, 0, 0, 0 );
ObjectSet( Prefix + "Copyright", OBJPROP_COLOR, GridColor );
ObjectSet( Prefix + "Copyright", OBJPROP_CORNER, 3 );
ObjectSet( Prefix + "Copyright", OBJPROP_XDISTANCE, 4 );
ObjectSet( Prefix + "Copyright", OBJPROP_YDISTANCE, 4 );
ObjectSetText( Prefix + "Copyright", "OverLay Chart by S.B.T.", 8 );
ObjectCreate( Prefix + "Status", OBJ_LABEL, 0, 0, 0 );
ObjectSet( Prefix + "Status", OBJPROP_COLOR, GridColor );
ObjectSet( Prefix + "Status", OBJPROP_CORNER, 0 );
ObjectSet( Prefix + "Status", OBJPROP_XDISTANCE, 4 );
ObjectSet( Prefix + "Status", OBJPROP_YDISTANCE, 16 );
ObjectSetText( Prefix + "Status",
SubSymbol + " O = " + DoubleToStr( iOpen( SubSymbol, 0, _LastBar ), _SubDigit ) +
", H = " + DoubleToStr( iHigh( SubSymbol, 0, _LastBar ), _SubDigit ) +
", L = " + DoubleToStr( iLow( SubSymbol, 0, _LastBar ), _SubDigit ) +
", C = " + DoubleToStr( iClose( SubSymbol, 0, _LastBar ), _SubDigit ),
8 );
for ( _i = 1; _i <= Grid ; _i ++ ) {
_GridPrice = MathRound( _SubRangeCenter / ( _SubPoint * SnapPips ) ) * ( _SubPoint * SnapPips );
_GridPrice = ( ( _GridPrice + _GridPips / 2 ) + _GridPips * ( Grid / 2 - 1 ) ) - ( _GridPips * ( _i - 1 ) );
ObjectCreate( Prefix + "Grid" + _i, OBJ_TREND, 0, 0, 0 );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_TIME1, Time[_FirstBar] );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_PRICE1, _CurRangeCenter + ( _GridPrice - _SubRangeCenter ) * _PipsRatio );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_TIME2, Time[_LastBar] );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_PRICE2, _CurRangeCenter + ( _GridPrice - _SubRangeCenter ) * _PipsRatio );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_COLOR, GridColor );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_STYLE, STYLE_DOT );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_WIDTH, 1 );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_RAY, true );
ObjectCreate( Prefix + "Price" + _i, OBJ_TEXT, 0, 0, 0 );
ObjectSet( Prefix + "Price" + _i, OBJPROP_TIME1, Time[_FirstBar - _BarsCount / 10] );
ObjectSet( Prefix + "Price" + _i, OBJPROP_PRICE1, _CurRangeCenter + ( _GridPrice - _SubRangeCenter ) * _PipsRatio );
ObjectSet( Prefix + "Price" + _i, OBJPROP_COLOR, GridColor );
ObjectSetText( Prefix + "Price" + _i, DoubleToStr( _GridPrice, _SubDigit ), 8 );
}
return( 0 );
}
//+------------------------------------------------------------------+
Comments