//+------------------------------------------------------------------+ //| 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"; int ind = 0; string trend; bool bearish_found = false; bool bullish_found = false; int index_of_last_high = 0; int index_of_last_low = 0; double hi; double lo; int index_of_low = 0; int index_of_high = 0; int high_index=0; int low_index =0; double high,low,low1,high1,low2,high2; int Store_bos_last_index = 0; //int ind = 0; bool choch = false; int index = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ void Bos(int i) { if(trend == "uptrend") { high = iHigh(Symbol(),PERIOD_CURRENT,high_index); high1 = iHigh(Symbol(),PERIOD_CURRENT,i); if(high1 > high) { if(object_find("high") > 0) { ObjectDelete(0,"high"); } high = high1; ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high); ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue); ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high); ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos"); Store_bos_last_index = i; int count = (high_index-1) - i; for(int j=1; j <= count; j++) { if(checkCandle(high_index-j) == "Bearish") { low = iLow(Symbol(),PERIOD_CURRENT,high_index-j); bearish_found = true; } } if(bearish_found == true) { for(int k=1; k < count; k++) { low1 = iLow(Symbol(),PERIOD_CURRENT,high_index - k); if(low1 <= low) { low = low1; index_of_low =high_index- k; } } if(object_find("low") > 0) { ObjectDelete(0,"low"); } ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low); ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed); bearish_found = false; } high_index = i; } } if(trend == "downtrend") { low = iLow(Symbol(),PERIOD_CURRENT,low_index); low1 = iLow(Symbol(),PERIOD_CURRENT,i); if(low1 < low) { if(object_find("low") > 0) { ObjectDelete(0,"low"); } low = low1; ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low); ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed); ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low); ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos"); Store_bos_last_index = i; int count = (low_index-1) - i; for(int j=1; j <= count; j++) { if(checkCandle(low_index-j) == "Bullish") { high = iHigh(Symbol(),PERIOD_CURRENT,low_index-j); bullish_found = true; } } if(bullish_found == true) { for(int k=1; k < count; k++) { high1 = iHigh(Symbol(),PERIOD_CURRENT,low_index - k); if(high1 >= high) { high = high1; index_of_high = low_index - k; } } if(object_find("high") > 0) { ObjectDelete(0,"high"); } ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high); ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue); bullish_found = false; } low_index = i; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Entry_Action_1_down(int Store_bos_last_index, int i,int diff) { // i is the index of the choch for(int j=Store_bos_last_index+1; j < iBars(Symbol(),PERIOD_CURRENT); j++) { diff++; if(checkCandle(j) == "Bullish") { //Print("bullish found at index ",j); ind = j; // reversal candle index bullish_found = true; break; } } Print("condition satisfied : ",check_values_less_than_choch_high(diff,i)); Print("choch candle open is ",iOpen(Symbol(),PERIOD_CURRENT,i)); Print("reversal candle open is ",iOpen(Symbol(),PERIOD_CURRENT,ind)); if(check_values_less_than_choch_high(diff,i) == true) { if(iOpen(Symbol(),PERIOD_CURRENT,ind) > iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) < iClose(Symbol(),PERIOD_CURRENT,i)) { Print("Place buy order -----------------------------------------------------------------------: "); } } //Print(diff); if(bullish_found == true) { ObjectCreate(0,"line14"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iHigh(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,ind)); ObjectCreate(0,"line15"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iLow(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,ind)); ObjectSetInteger(0,"line14"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue); ObjectSetInteger(0,"line15"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue); ObjectCreate(0,"line16"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iClose(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iClose(Symbol(),PERIOD_CURRENT,ind)); ObjectCreate(0,"line17"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iOpen(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iOpen(Symbol(),PERIOD_CURRENT,ind)); ObjectSetInteger(0,"line16"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,"line17"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT); diff = 0; bullish_found = false; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Entry_Action_1_up(int Store_bos_last_index, int i,int diff) { for(int j=Store_bos_last_index+1; j < iBars(Symbol(),PERIOD_CURRENT); j++) { diff++; if(checkCandle(j) == "Bearish") { ind = j; // reversal candle index bearish_found = true; break; } } Print("diff is ", diff); Print("condition satisfied : ",check_values_less_than_choch_low(diff,i)); Print("choch candle open is ",iOpen(Symbol(),PERIOD_CURRENT,i)); Print("reversal candle open is ",iOpen(Symbol(),PERIOD_CURRENT,ind)); if(check_values_less_than_choch_low(diff,i) == true) { if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i)) { Print("Place sell order -----------------------------------------------------------------------: "); } } if(bearish_found == true) { ObjectCreate(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iHigh(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,ind)); ObjectCreate(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iLow(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,ind)); ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue); ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue); ObjectCreate(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iClose(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iClose(Symbol(),PERIOD_CURRENT,ind)); ObjectCreate(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,ind),iOpen(Symbol(),PERIOD_CURRENT,ind),iTime(Symbol(),PERIOD_CURRENT,i),iOpen(Symbol(),PERIOD_CURRENT,ind)); ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT); bearish_found = false; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool check_values_less_than_choch_high(int diff,int i) // downtrend { bool found = false; int value = (diff + i) - 1; for(int k=value; k>i; k--) { //Print("high values ",iHigh(Symbol(),PERIOD_CURRENT,k)); //Print("close values ",iClose(Symbol(),PERIOD_CURRENT,i)); if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i)) { found = true; } } if(found == true) { return false; } return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool check_values_less_than_choch_low(int diff,int i) // uptrend { bool found = false; int value = (diff + i) - 1; // from which it start to check value is less in index Print("value to be start is ",value); for(int k=value; k>i; k--) { if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i)) { found = true; } } if(found == true) { return false; } return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void choch(int i) { if(trend == "uptrend") { double close = iClose(Symbol(),PERIOD_CURRENT,i); if(close < low) { ObjectCreate(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)); ObjectSetString(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch"); ObjectCreate(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_DOWN,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+100*Point()); ObjectSetInteger(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrRed); Print("last bos index is ",Store_bos_last_index); int diff1 = Store_bos_last_index - (i); Print("diff between bos and last choch is ",diff1); Entry_Action_1_up(Store_bos_last_index,i,diff1); low = iLow(Symbol(),PERIOD_CURRENT,i); low_index = i; if(object_find("low") > 0) { ObjectDelete(0,"low"); } ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low); ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed); // Entry_Action_1_up(Store_bos_last_index,i); Print("low update due to choch : ", low); trend = "downtrend"; Print("choch at uptrend index --- ", iTime(Symbol(),PERIOD_CURRENT,i)); } } if(trend == "downtrend") { double close = iClose(Symbol(),PERIOD_CURRENT,i); if(close > high) { ObjectCreate(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)); ObjectSetString(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch"); ObjectCreate(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_UP,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)-100*Point()); ObjectSetInteger(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrGreen); int diff = Store_bos_last_index - (i); Entry_Action_1_down(Store_bos_last_index,i,diff); high = iHigh(Symbol(),PERIOD_CURRENT,i); high_index = i; if(object_find("high") > 0) { ObjectDelete(0,"high"); } ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high); ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue); trend = "uptrend"; Print("high is update due to choch : ", high); Print("choch at downtrend index ---- ", iTime(Symbol(),PERIOD_CURRENT,i)); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void third_Condition(int i) { if(trend == "uptrend") { low2 = iLow(Symbol(),PERIOD_CURRENT,i); if(low2 < low) { ObjectCreate(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)); ObjectSetString(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C"); low = low2; //low_index = i; if(object_find("low") > 0) { Print("object deleted "); ObjectDelete(0,"low"); } ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low); ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed); Print("low update due to third condition",low," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i)); } } if(trend == "downtrend") { high2 = iHigh(Symbol(),PERIOD_CURRENT,i); if(high2 > high) { ObjectCreate(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)); ObjectSetString(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C"); high = high2; //high_index = i; if(object_find("high") > 0) { ObjectDelete(0,"high"); } ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high); ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue); Print("high update due to third condition",high); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void foo(int value) { int l = 0; for(int i=value-1; i > 0; i--) { //Print("hi"); //if(l < 2) { Bos(i); choch(i); third_Condition(i); l++; } //Bos(i); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { object_find(object_name); if(object_find(object_name) == true) { datetime time_of_candle = (datetime)ObjectGetInteger(0,"line",OBJPROP_TIME,0); index = iBarShift(Symbol(), PERIOD_CURRENT, time_of_candle, false); checkCandle(index); if(checkCandle(index) == "Bullish") { trend = "uptrend"; } if(checkCandle(index) == "Bearish") { trend = "downtrend"; } high = iHigh(Symbol(),PERIOD_CURRENT,index); low = iLow(Symbol(),PERIOD_CURRENT,index); high_index = index; low_index = index; foo(index); } else { Print("Object Not Found"); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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"; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+