//+------------------------------------------------------------------+ //| MK_BOS_CHOCH.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" sinput string str = "<><><><><><> Object Name <><><><><><>"; input string object_name = "line"; string trend; bool bearish_found = false; bool bullish_found = false; int index_of_low = 0; int high_index=0; double high,low,low1,high1; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ void foo(int index) { for(int i=index; i > 0; i--) { if(checkCandle(index) == "Bullish") { trend = "uptrend"; //double high,low = 0.0; // to store high and low of the value after the object high = iHigh(Symbol(),PERIOD_CURRENT,index); //low = iLow(Symbol(),PERIOD_CURRENT,index-1); if(trend == "uptrend") { high1 = iHigh(Symbol(),PERIOD_CURRENT,i); //double low1 = iLow(Symbol(),PERIOD_CURRENT,i); if(high1 > high) { high = high1; // Print("high break at index value",i); // Print("index is ",index); int count = (index-1) - i; Print("count is ", count); // Print("index updated ",index); // Print("count",count); for(int j=1; j <= count; j++) { if(checkCandle(index-j) == "Bearish") { low = iLow(Symbol(),PERIOD_CURRENT,index-j); bearish_found = true; } } if(bearish_found == true) { //double low1 ; //Print("where"); for(int k=1; k <= count; k++) { low1 = iLow(Symbol(),PERIOD_CURRENT,index - k); if(low1 <= low) { //Print("here"); low = low1; index_of_low = index - k; Print("low is updated at index : ",index - k); } } bearish_found = false; } Print(" high price is ", high); Print("low price is ", low); Print("index of low is ", index_of_low); for(int l=index_of_low; l > 0; l--) { // print("hi"); double close = iClose(Symbol(),PERIOD_CURRENT,l); if(close < low) { double price_low = iLow(Symbol(),PERIOD_CURRENT,l+1); double time = iTime(Symbol(),PERIOD_CURRENT,l+1); double time1 = iTime(Symbol(),PERIOD_CURRENT,l+1); ObjectCreate(0,"tline1",OBJ_TREND,0,time,price_low,time1,price_low); trend = "downtrend"; Print("choch"); Print("close", close); break; } } index = i; } } // } if(checkCandle(index) == "Bearish") { trend = "downtrend"; // double high,low = 0.0; // to store high and low of the value after the object low = iLow(Symbol(),PERIOD_CURRENT,index); //low = iLow(Symbol(),PERIOD_CURRENT,index-1); if(trend == "downtrend") { low1 = iLow(Symbol(),PERIOD_CURRENT,i); //double low1 = iLow(Symbol(),PERIOD_CURRENT,i); if(low1 < low) { low = low1; // Print("high break at index value",i); // Print("index is ",index); int count = (index-1) - i; Print("count is ", count); // Print("index updated ",index); // Print("count",count); for(int j=1; j <= count; j++) { if(checkCandle(index-j) == "Bullish") { high = iHigh(Symbol(),PERIOD_CURRENT,index-j); bullish_found = true; } } if(bullish_found == true) { high1; //Print("where"); for(int k=1; k <= count; k++) { high1 = iHigh(Symbol(),PERIOD_CURRENT,index - k); if(high1 > high) { //Print("here"); high = high1; index_of_low = index - k; Print("high is updated at index : ",index - k); } } bullish_found = false; } Print(" high price is ", high); Print("low price is ", low); Print("index of low is ", index_of_low); for(int l=index_of_low; l > 0; l--) { // print("hi"); double close = iClose(Symbol(),PERIOD_CURRENT,l); if(close > high) { double price_high = iLow(Symbol(),PERIOD_CURRENT,l+1); double time = iTime(Symbol(),PERIOD_CURRENT,l+1); double time1 = iTime(Symbol(),PERIOD_CURRENT,l+1); ObjectCreate(0,"tline2",OBJ_TREND,0,time,price_high,time1,price_high); trend = "uptrend"; Print("choch"); Print(l); Print("close", close); break; } } index = i; } } // } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { ObjectCreate(0,"line",OBJ_VLINE,0,D'2023.07.01 10:00:27',0); object_find(object_name); //Print(ObjectFind(0,"line")); // to find the object drawn on the chart if(object_find(object_name) == true) { datetime time_of_candle = (datetime)ObjectGetInteger(0,"line",OBJPROP_TIME,0); Print("line time: ",time_of_candle); int index = iBarShift(Symbol(), PERIOD_CURRENT, time_of_candle, false); Print(index); // datetime time_of_candle = (datetime)ObjectGetInteger(0,"line",OBJPROP_TIME,0); // Print("time is " , time_of_candle); // // int index = iBarShift(0, PERIOD_CURRENT,time_of_candle, true); // Print("index is " , index); foo(index); } else { Print("Object Not Found"); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(NewBar()) { ObjectSetInteger(0,"tline1",OBJPROP_TIME,iTime(Symbol(), PERIOD_CURRENT,0)); ObjectSetInteger(0,"tline2",OBJPROP_TIME,iTime(Symbol(), PERIOD_CURRENT,0)); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool NewBar() { static datetime Last_bar ; datetime Current_bar = iTime(Symbol(), PERIOD_CURRENT,0); if(Current_bar != Last_bar) { Last_bar = Current_bar; return (true); } else { return (false); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool object_find(string obj) // to find object placed by user in the chart { if(ObjectFind(0,obj) >= 0) { return true; } return false; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ string checkCandle(int i) // to check the candle is bullish or bearish { double close = iClose(Symbol(),PERIOD_CURRENT,i); double open = iOpen(Symbol(),PERIOD_CURRENT,i); if(close > open) { return "Bullish"; } else if(close < open) { return "Bearish"; } return "empty"; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+