Overview of the _TRO_MID Script Logic
This MetaTrader script is designed as a visual aid for traders to identify and monitor specific price levels on a trading chart. It focuses on calculating "midpoints"—the center value between the highest and lowest prices—to help traders gauge market balance and potential turning points.
Core Functional Components
1. Midpoint Calculations The primary logic of the script revolves around identifying the midpoint of price action. Specifically, it calculates:
- Current Midpoint: The average value between the high and low of the current price candle.
- Previous Midpoint: The average value between the high and low of the preceding candle.
By establishing these values, the script provides a reference for where the "center" of the market is currently sitting relative to its recent extremes.
2. Visual Chart Plotting The script includes a visual mode that allows these calculated midpoints to be drawn directly onto the trading chart. It uses specific symbols (arrows) and distinct colors to make it easy for a trader to see at a glance how the current price relates to these historical center points.
3. Information Dashboard (Gauge Mode) Beyond simple lines on a chart, the script features an "Information Gauge" logic. When enabled, it creates a structured text dashboard on the screen. This dashboard provides:
- Dynamic Labels: A list of specific midpoint values (labeled X01 through X07) organized in a vertical layout.
- Precision Formatting: The script automatically detects the currency type (for example, identifying JPY pairs vs. standard pairs) and adjusts the number of decimal places accordingly to ensure the displayed numbers are accurate and clean.
- Visual Alerts: The logic includes a color-changing system for the dashboard. It compares the current market closing price against the calculated midpoints. If the current price falls below a specific midpoint, the text on the dashboard changes color (e.g., from Red to Lime), providing an immediate visual cue about the price's position relative to those levels.
4. User Customization The script is designed to be highly adaptable through several user-defined settings:
- Timezone and Periods: Users can define specific timeframes and offsets to align the data with their preferred local time.
- Aesthetic Controls: Traders can customize the colors, symbols (Wingdings), and line styles of the visual indicators to match their personal charting style.
- Display Toggle: Users can choose between seeing the data as plotted arrows on the chart or as a clean text-based dashboard on the side.
Summary for the Trader
Essentially, this script removes the manual math of calculating price averages. It automatically finds the "middle ground" of previous price candles and presents that information to you either as visual markers on your candles or as a color-coded data dashboard, helping you quickly identify where the market's balance lies.
//+------------------------------------------------------------------+
//| _TRO_MID |
//| |
//| Copyright © 2007, Avery T. Horton, Jr. aka TheRumpledOne |
//| |
//| PO BOX 43575, TUCSON, AZ 85733 |
//| |
//| GIFT AND DONATIONS ACCEPTED |
//| |
//| http://docs.mql4.com/constants/wingdings | |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Avery T. Horton, Jr. aka TheRumpledOne"
#property link "therumpledone@gmail.com"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 MediumTurquoise
#property indicator_color2 Magenta
#property indicator_color3 MediumTurquoise
#property indicator_color4 Red
#property indicator_color5 Yellow
#property indicator_color6 Orange
#property indicator_color7 OrangeRed
//---- For the small screens
//extern string Display_infos = "=== If true, displayed on the chart ===";
//extern bool display_on_chart = true ; // If true, the open trade analysis, daily pivots and daily range will be displayed on the chart window
// indicators parameters
extern bool iPlotChart = true ;
extern bool iPlotGauge = false ;
extern int LocalTimeZone= 0;
extern int DestTimeZone= 0;
extern int myPeriod = 1440 ;
extern int myOffset = 1 ;
extern int myChartY = 1 ;
extern int myStyle1 = 2 ;
extern int myStyle2 = 2 ;
extern int myStyle3 = 2 ;
extern int myStyle4 = 2 ;
extern int myStyle5 = 2 ;
extern int myStyle6 = 2 ;
extern int myStyle7 = 2 ;
extern int myWingDing1 = 115 ;
extern int myWingDing2 = 115 ;
extern int myWingDing3 = 115 ;
extern int myWingDing4 = 115 ;
extern int myWingDing5 = 115 ;
extern int myWingDing6 = 115 ;
extern int myWingDing7 = 115 ;
extern color myColor1 =MediumTurquoise ;
extern color myColor2 =Magenta;
extern color myColor3 =MediumTurquoise ;
extern color myColor4 =Red;
extern color myColor5 =Yellow;
extern color myColor6 =Orange;
extern color myColor7 =OrangeRed;
//---- buffers
double P1Buffer[];
double P2Buffer[];
double P3Buffer[];
double P4Buffer[];
double P5Buffer[];
double P6Buffer[];
double P7Buffer[];
double yesterday_high=0;
double yesterday_open=0;
double yesterday_low=0;
double yesterday_close=0;
double today_open=0;
double today_high=0;
double today_low=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- name for indicator window
string short_name=" ";
IndicatorShortName(short_name);
SetIndexBuffer(0, P1Buffer);
SetIndexBuffer(1, P2Buffer);
SetIndexBuffer(2, P3Buffer);
SetIndexBuffer(3, P4Buffer);
SetIndexBuffer(4, P5Buffer);
SetIndexBuffer(5, P6Buffer);
SetIndexBuffer(6, P7Buffer);
//----
SetIndexArrow(0, myWingDing1);
SetIndexArrow(1, myWingDing2);
SetIndexArrow(2, myWingDing3);
SetIndexArrow(3, myWingDing4);
SetIndexArrow(4, myWingDing5);
SetIndexArrow(5, myWingDing6);
SetIndexArrow(6, myWingDing7);
SetIndexStyle(0, DRAW_ARROW, myStyle1, 1);
SetIndexStyle(1, DRAW_ARROW, myStyle2, 1);
SetIndexStyle(2, DRAW_ARROW, myStyle3, 1);
SetIndexStyle(3, DRAW_ARROW, myStyle4, 1);
SetIndexStyle(4, DRAW_ARROW, myStyle5, 1);
SetIndexStyle(5, DRAW_ARROW, myStyle6, 1);
SetIndexStyle(6, DRAW_ARROW, myStyle7, 1);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("MID");
ObjectDelete("line5MID");
ObjectDelete("X01_LabelMID");
ObjectDelete("X01_ValueMID");
ObjectDelete("X02_LabelMID");
ObjectDelete("X02_ValueMID");
ObjectDelete("X03_LabelMID");
ObjectDelete("X03_ValueMID");
ObjectDelete("X04_LabelMID");
ObjectDelete("X04_ValueMID");
ObjectDelete("X05_LabelMID");
ObjectDelete("X05_ValueMID");
ObjectDelete("X06_LabelMID");
ObjectDelete("X06_ValueMID");
ObjectDelete("X07_LabelMID");
ObjectDelete("X07_ValueMID");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, dayi, counted_bars = IndicatorCounted();
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars;
//----
for(i = limit - 1; i >= 0; i--)
{
double X01 = (iHigh(NULL,0,i) + iLow(NULL,0,i)) * 0.5 ;
double X02 = (iHigh(NULL,0,i+1) + iLow(NULL,0,i+1)) * 0.5 ;
double X03 = 0 ;
double X04 = 0 ;
double X05 = 0 ;
double X06 = 0 ;
double X07 = 0 ;
if ( iPlotChart ) {
P1Buffer[i] = X01 ;
P2Buffer[i] = X02 ;
P3Buffer[i] = X03 ;
P4Buffer[i] = X04 ;
P5Buffer[i] = X05 ;
P6Buffer[i] = X06 ;
P7Buffer[i] = X07 ;
} // iPlotChart
} // FOR
if ( iPlotGauge ) {
string StrX01 = "Mid" ;
string StrX02 = "Prev" ;
string StrX03 = "-XO3" ;
string StrX04 = "-XO4" ;
string StrX05 = "-XO5" ;
string StrX06 = "-XO6" ;
string StrX07 = "-XO7" ;
color color_MID_1=Orchid;
color color_X01=Red;
color color_X02=Red;
color color_X03=Red;
color color_X04=Red;
color color_X05=Red;
color color_X06=Red;
color color_X07=Red;
if( Close[0] < X01) { color_X01=Lime; }
if( Close[0] < X02) { color_X02=Lime; }
if( Close[0] < X03) { color_X03=Lime; }
if( Close[0] < X04) { color_X04=Lime; }
if( Close[0] < X05) { color_X05=Lime; }
if( Close[0] < X06) { color_X06=Lime; }
// if( Close[0] < X07) { color_X07=Lime; }
int Precision, dig;
if( StringFind( Symbol(), "JPY", 0) != -1 ) { Precision = 100; dig = 2;}
else { Precision = 10000; dig = 4; }
int sPeriod= Period();
if (myPeriod != NULL){ sPeriod= myPeriod ;}
//---- Set labels
int WindowToUse;
int Corner_line, Xdist_line;
int Corner_text, Corner_ValueMID, Xdist_text, Xdist_ValueMID;
int Ydist_line5;
int Corner_pivots, Xdist_pivots, Ydist_pivots;
int Ydist_X01, Ydist_X02, Ydist_X03, Ydist_X04, Ydist_X05, Ydist_X06, Ydist_X07;
int YdistInc ;
WindowToUse = 0;
Corner_line = 1;
Corner_text = 1;
Corner_ValueMID = 1;
Xdist_line = 21;
Xdist_text = 93;
Xdist_ValueMID = 23;
Corner_pivots = 1;
Xdist_pivots = 21;
Ydist_pivots = myChartY;
Ydist_line5 =
Ydist_pivots + 11;
YdistInc = 15 ;
Ydist_X01 = Ydist_pivots + 25;
Ydist_X02 = Ydist_X01 + YdistInc;
Ydist_X03 = Ydist_X01 + YdistInc*2;
Ydist_X04 = Ydist_X01 + YdistInc*3;
Ydist_X05 = Ydist_X01 + YdistInc*4;
Ydist_X06 = Ydist_X01 + YdistInc*5;
Ydist_X07 = Ydist_X01 + YdistInc*6;
ObjectCreate("MID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("MID",sPeriod + " MID ",9, "Verdana", color_MID_1);
ObjectSet("MID", OBJPROP_CORNER, Corner_pivots);
ObjectSet("MID", OBJPROP_XDISTANCE, Xdist_pivots);
ObjectSet("MID", OBJPROP_YDISTANCE, Ydist_pivots);
ObjectCreate("line5MID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("line5MID","---------------------",7, "Verdana", color_MID_1);
ObjectSet("line5MID", OBJPROP_CORNER, Corner_line);
ObjectSet("line5MID", OBJPROP_XDISTANCE, Xdist_line);
ObjectSet("line5MID", OBJPROP_YDISTANCE, Ydist_line5);
ObjectCreate("X01_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X01_LabelMID",StrX01,9, "Verdana", myColor1);
ObjectSet("X01_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X01_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X01_LabelMID", OBJPROP_YDISTANCE, Ydist_X01);
ObjectCreate("X01_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X01_ValueMID"," "+DoubleToStr(X01,dig),9, "Verdana", color_X01);
ObjectSet("X01_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X01_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X01_ValueMID", OBJPROP_YDISTANCE, Ydist_X01);
ObjectCreate("X02_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X02_LabelMID",StrX02,9, "Verdana", myColor2);
ObjectSet("X02_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X02_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X02_LabelMID", OBJPROP_YDISTANCE, Ydist_X02);
ObjectCreate("X02_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X02_ValueMID"," "+DoubleToStr(X02,dig),9, "Verdana", color_X02);
ObjectSet("X02_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X02_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X02_ValueMID", OBJPROP_YDISTANCE, Ydist_X02);
/*
ObjectCreate("X03_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X03_LabelMID",StrX03,9, "Verdana", myColor3 );
ObjectSet("X03_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X03_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X03_LabelMID", OBJPROP_YDISTANCE, Ydist_X03);
ObjectCreate("X03_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X03_ValueMID"," "+DoubleToStr(X03,dig),9, "Verdana", color_X03);
ObjectSet("X03_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X03_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X03_ValueMID", OBJPROP_YDISTANCE, Ydist_X03);
ObjectCreate("X04_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X04_LabelMID",StrX04,9, "Verdana", myColor4 );
ObjectSet("X04_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X04_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X04_LabelMID", OBJPROP_YDISTANCE, Ydist_X04);
ObjectCreate("X04_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X04_ValueMID"," "+DoubleToStr(X04,dig),9, "Verdana", color_X04);
ObjectSet("X04_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X04_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X04_ValueMID", OBJPROP_YDISTANCE, Ydist_X04);
ObjectCreate("X05_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X05_LabelMID",StrX05,9, "Verdana", myColor5 );
ObjectSet("X05_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X05_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X05_LabelMID", OBJPROP_YDISTANCE, Ydist_X05);
ObjectCreate("X05_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X05_ValueMID"," "+DoubleToStr(X05,dig),9, "Verdana", color_X05);
ObjectSet("X05_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X05_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X05_ValueMID", OBJPROP_YDISTANCE, Ydist_X05);
ObjectCreate("X06_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X06_LabelMID",StrX06,9, "Verdana", myColor6 );
ObjectSet("X06_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X06_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X06_LabelMID", OBJPROP_YDISTANCE, Ydist_X06);
ObjectCreate("X06_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X06_ValueMID"," "+DoubleToStr(X06,dig),9, "Verdana", color_X06);
ObjectSet("X06_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X06_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X06_ValueMID", OBJPROP_YDISTANCE, Ydist_X06);
ObjectCreate("X07_LabelMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X07_LabelMID",StrX07,9, "Verdana", myColor7 );
ObjectSet("X07_LabelMID", OBJPROP_CORNER, Corner_text);
ObjectSet("X07_LabelMID", OBJPROP_XDISTANCE, Xdist_text);
ObjectSet("X07_LabelMID", OBJPROP_YDISTANCE, Ydist_X07);
ObjectCreate("X07_ValueMID", OBJ_LABEL, WindowToUse, 0, 0);
ObjectSetText("X07_ValueMID"," "+DoubleToStr(X07,dig),9, "Verdana", color_X07);
ObjectSet("X07_ValueMID", OBJPROP_CORNER, Corner_ValueMID);
ObjectSet("X07_ValueMID", OBJPROP_XDISTANCE, Xdist_ValueMID);
ObjectSet("X07_ValueMID", OBJPROP_YDISTANCE, Ydist_X07);
*/
} // iPlotGauge
return(0);
}
Comments