Trendline break indicator showing OHLC break since manually created trendline object has been created
Thanks ffoorr
Im working on a combination of ibarshift and ObjectGetValueByShift
I have run into a brickwall.
On each chart (symbol) I might be drawing manual trendlines on 3 or more timeframes. The ObjectGetValueByShift on works on the current timeframe that the chart is in (I think).
i think i have got it but its hard to get a match to the visual
My solution. It works really well.
My solution, enjoy and let me know if it can be improved upon.
//+------------------------------------------------------------------+ //| TrendlineBreak.mqh | //| Christopher Barklem | //| http://www.barklem.es | //+------------------------------------------------------------------+ #property copyright "Christopher Barklem" #property link "http: //www.barklem.es" #property strict extern bool Include_Internal_Break_Detection = true; // This option allows you to either detect breaks past time2 or the whole line. extern bool Detect_OHLC_Break_Of_Trendline = true; // This option allows you to limit the break to be at least one candles open, high low and close across the line. extern bool Detect_Close_Break_Of_Trendline = true; // This option allows you to limit the break to a close past the line. extern bool Detect_Price_Break_Of_Trendline = true; // This option allows you to limit the break to any price action past the line. //+------------------------------------------------------------------+ //| Detect is price has created an OHLC break of a trendline | //+------------------------------------------------------------------+ bool CheckTrendlineBreak(string obj_name) { bool trendline_broken = false; string trend_direction; double obj_price1 = ObjectGet(obj_name, OBJPROP_PRICE1); double obj_price2 = ObjectGet(obj_name, OBJPROP_PRICE2); datetime obj_time1 = ObjectGet(obj_name, OBJPROP_TIME1); datetime obj_time2 = ObjectGet(obj_name, OBJPROP_TIME2); int obj_timeframes = ObjectGet(obj_name, OBJPROP_TIMEFRAMES); // Correct trendline drawing. Trendline should be drawn right to left. datetime temp_time1, temp_time2; if (obj_time1 > obj_time2) { temp_time1 = obj_time2; temp_time2 = obj_time1; obj_time1 = temp_time1; obj_time2 = temp_time2; } // Assume manual uptrend or downtrend if (obj_price1 > obj_price2) { trend_direction = "DOWN"; } // DOWN else if (obj_price2 > obj_price1) { trend_direction = "UP"; } // UP else if (obj_price2 == obj_price1) { trend_direction = "HORIZONTAL"; return false; } // No trend to check for break. int objectTimeFrame = visToPeriod(obj_timeframes); double tslope, tp3, ClosePrice, OpenPrice, HighPrice, LowPrice; int candleAbove, candleBelow; int tp1shift = iBarShift(NULL, objectTimeFrame, obj_time1, true); int tp2shift = iBarShift(NULL, objectTimeFrame, obj_time2, true); int shiftcheck; if (Include_Internal_Break_Detection == true) { shiftcheck = tp1shift; } else { shiftcheck = tp2shift; } if (trend_direction == "UP" && tp1shift - tp2shift > 0) { tslope = (obj_price2 - obj_price1) / (tp1shift - tp2shift); candleBelow = 0; candleBelow = 0; for (int ishift = shiftcheck - 1; ishift > 0; ishift--) { ClosePrice = iClose(NULL, objectTimeFrame, ishift); OpenPrice = iOpen(NULL, objectTimeFrame, ishift); HighPrice = iHigh(NULL, objectTimeFrame, ishift); LowPrice = iLow(NULL, objectTimeFrame, ishift); if (ishift > tp2shift) { tp3 = (tslope * (tp1shift - ishift)) + obj_price1; } else if (ishift == tp2shift) { tp3 = obj_trendline_array[ID].price2; } else { tp3 = (tslope * (tp2shift - ishift)) + obj_.price2; } if (Detect_OHLC_Break_Of_Trendline) { if (ClosePrice > tp3 && OpenPrice > tp3 && HighPrice > tp3 && LowPrice > tp3) { candleAbove++; } if (ClosePrice < tp3 && OpenPrice < tp3 && HighPrice < tp3 && LowPrice < tp3) { candleBelow++; } } if (Detect_Close_Break_Of_Trendline) { if (ClosePrice > tp3) { candleAbove++; } if (ClosePrice < tp3) { candleBelow++; } } if (Detect_OHLC_Break_Of_Trendline) { if (ClosePrice > tp3 || OpenPrice > tp3 || HighPrice > tp3 || LowPrice > tp3) { candleAbove++; } if (ClosePrice < tp3 || OpenPrice < tp3 || HighPrice < tp3 || LowPrice < tp3) { candleBelow++; } } } if (candleBelow > 0) trendline_broken = true; if (candleBelow == 0) trendline_broken = false; } if (trend_direction == "DOWN" && tp1shift - tp2shift > 0) { tslope = (obj_.price1 - obj_price2) / (tp1shift - tp2shift); candleBelow = 0; candleBelow = 0; for (int ishift = shiftcheck - 1; ishift > 0; ishift--) { ClosePrice = iClose(NULL, objectTimeFrame, ishift); OpenPrice = iOpen(NULL, objectTimeFrame, ishift); HighPrice = iHigh(NULL, objectTimeFrame, ishift); LowPrice = iLow(NULL, objectTimeFrame, ishift); // tp3 = tp2-((tp2shift-ishift)*tslope); if (ishift > tp2shift) { tp3 = obj_price1 - (tslope * (tp1shift - ishift)); } else if (ishift == tp2shift) { tp3 = obj_price2; } else { tp3 = obj_price2 - (tslope * (tp2shift - ishift)); } if (Detect_OHLC_Break_Of_Trendline) { if (ClosePrice > tp3 && OpenPrice > tp3 && HighPrice > tp3 && LowPrice > tp3) { candleAbove++; } if (ClosePrice < tp3 && OpenPrice < tp3 && HighPrice < tp3 && LowPrice < tp3) { candleBelow++; } } if (Detect_Close_Break_Of_Trendline) { if (ClosePrice > tp3) { candleAbove++; } if (ClosePrice < tp3) { candleBelow++; } } if (Detect_OHLC_Break_Of_Trendline) { if (ClosePrice > tp3 || OpenPrice > tp3 || HighPrice > tp3 || LowPrice > tp3) { candleAbove++; } if (ClosePrice < tp3 || OpenPrice < tp3 || HighPrice < tp3 || LowPrice < tp3) { candleBelow++; } } } if (candleAbove > 0) trendline_broken = true; if (candleAbove == 0) trendline_broken = false; } return(trendline_broken); } // Objects return an object timeframe like OBJ_PERIOD_M5, but functions like iBarShift want the chart period timeframe like PERIOD_M5. int visToPeriod(int objectVisTime) { switch (objectVisTime) { case OBJ_PERIOD_M5: return(PERIOD_M5); break; case OBJ_PERIOD_M15: return(PERIOD_M15); break; case OBJ_PERIOD_M30: return(PERIOD_M30); break; case OBJ_PERIOD_H1: return(PERIOD_H1); break; case OBJ_PERIOD_H4: return(PERIOD_H4); break; case OBJ_PERIOD_D1: return(PERIOD_D1); break; case OBJ_PERIOD_W1: return(PERIOD_W1); break; case OBJ_PERIOD_MN1: return(PERIOD_MN1); break; } return(0); }
start() is missing in your indicator.
How will you detect the line ? the name of the line is needed, so when drawing the line give it a name, so you can find the line with his name :
if( ObjectFind( name_of_the_line ) > -1 ) mean the line has been found
don't know if lines will be found on other timeframe or chart.
double ObjectGetValueByShift( string object_name, // object name int shift // bar index );
if( (ObjectGetValueByShift( name_of_the_line, Shift ) > Low[Shift] ) &&
(ObjectGetValueByShift( name_of_the_line, Shift ) < High[Shift] )
Something like that, you need the Shift, the "i", so you need the start()
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi everyone.
Im trying to figure out how I can detect if a manually drawn trendline has been broken with a OHLC since its creation.