//+------------------------------------------------------------------+ //| 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" #include CTrade trade; #define orderNum 200 struct tradeOrder { datetime choch_index_date_time; datetime reversal_index_date_time; string Signal; datetime Time_OF_Candle; datetime Time_of_candle_For_trade; tradeOrder() { choch_index_date_time = 0; Signal = ""; reversal_index_date_time = 0; Time_OF_Candle = 0.0; Time_of_candle_For_trade = 0.0; } }; tradeOrder od_1[orderNum]; sinput string str = "<><><><><><> Set Object Name <><><><><><>"; input string object_name = "line"; sinput string str1 = "<><><><><><> Set time of vertical line <><><><><><>"; input datetime inpTime = 0;//First Line Draw time sinput string str2 = "<><><><><><> Default Settings <><><><><><>"; input double lot_size = 0.1; input double stoploss = 20; input double takeProfit = 20; input int magic_no = 123; string trend = " "; string signal = ""; datetime reversal_bar_time = 0; datetime choch_index_time ; datetime index_of_low_time; datetime index_of_high_time; datetime store_last_bos_index_time; datetime time_of_candle = 0.0; datetime time_to_place_trade = 0.0; datetime high_index_time; datetime low_index_time; double hi; double lo; double high,low,low1,high1,low2,high2; bool bearish_found = false; bool bullish_found = false; bool choch_at_index = false; int choch_index = 0; int reversal_candle_index = 0; int ind = 0; int index_of_last_high = 0; int index_of_last_low = 0; int index_of_low = 0; int index_of_high = 0; int high_index=0; int low_index =0; int Store_bos_last_index = 0; int index = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ void Bos(int i) { int save_bullish_index = 0; int save_bearish_index = 0; if(trend == "uptrend") { high1 = iHigh(Symbol(),PERIOD_CURRENT,i); double close = iClose(Symbol(),PERIOD_CURRENT,i); if(close > high) { high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false); for(int j=high_index-1; j > i; j--) { if(checkCandle(j) == "Bearish") { save_bullish_index = j; 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+40*Point()); ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos"); store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); low = iLow(Symbol(),PERIOD_CURRENT,j); bearish_found = true; index_of_low_time = iTime(Symbol(),PERIOD_CURRENT,j); break; } } if(bearish_found == true) { for(int k=save_bullish_index; k > i ; k--) { low1 = iLow(Symbol(),PERIOD_CURRENT,k); if(low1 < low) { low = low1; index_of_low_time = iTime(Symbol(),PERIOD_CURRENT,k); bearish_found = false; } } if(object_find("low") > 0) { if(ObjectDelete(0,"low")) { //Print("object deleted :"); } } index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, index_of_low_time, false); 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_RAY_LEFT,false); ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed); } high_index_time = iTime(Symbol(),PERIOD_CURRENT,i); } } if(trend == "downtrend") { low1 = iLow(Symbol(),PERIOD_CURRENT,i); double close1 = iClose(Symbol(),PERIOD_CURRENT,i); if(close1 < low) { low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); for(int j=low_index - 1; j > i; j--) { if(checkCandle(j) == "Bullish") { save_bullish_index = j; 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_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); high = iHigh(Symbol(),PERIOD_CURRENT,j); bullish_found = true; index_of_high_time = iTime(Symbol(),PERIOD_CURRENT,j); break; } } if(bullish_found == true) { for(int k=save_bullish_index; k > i ; k--) { high1 = iHigh(Symbol(),PERIOD_CURRENT,k); if(high1 > high) { high = high1; index_of_high_time = iTime(Symbol(),PERIOD_CURRENT,k); bullish_found = false; } } if(object_find("high") > 0) { ObjectDelete(0,"high"); } index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, index_of_high_time, false); 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_time = iTime(Symbol(),PERIOD_CURRENT,i); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Entry_Action_1_down(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) == "Bullish") { //Print("bullish found at index ",j); ind = j; // reversal candle index reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,j); bullish_found = true; break; } } Print("condition satisfied in downtrend buy trade : ",check_values_less_than_choch_high(diff,i)); 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)) { signal = "buy"; time_of_candle = iTime(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 reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,j); bearish_found = true; break; } } Print("condition satisfied in uptrend sell trade : ",check_values_less_than_choch_low(diff,i)); 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)) { signal = "sell"; time_of_candle = iTime(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) { remove_value_from_structure(); choch_at_index = true; 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); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); int diff1 = Store_bos_last_index - (i); Entry_Action_1_up(Store_bos_last_index,i,diff1); low = iLow(Symbol(),PERIOD_CURRENT,i); low_index_time = iTime(Symbol(),PERIOD_CURRENT,i); low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); 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); trend = "downtrend"; choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i); int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false); chock_index++; iHigh(Symbol(),PERIOD_CURRENT,chock_index); iLow(Symbol(),PERIOD_CURRENT,chock_index); if(object_find("target line") > 0) { ObjectDelete(0,"target line"); } ObjectCreate(0,"target line",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iHigh(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iHigh(Symbol(),PERIOD_CURRENT,chock_index)); ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen); if(object_find("target line1") > 0) { ObjectDelete(0,"target line1"); } ObjectCreate(0,"target line1",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iLow(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iLow(Symbol(),PERIOD_CURRENT,chock_index)); ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen); if(signal == "sell") { MqlDateTime edate; time_to_place_trade = 0.0; int current_time_frame = Period(); string current_time_frame_string; switch(current_time_frame) { case PERIOD_M1: current_time_frame_string = "1 minute"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 2; edate.sec = 0; } break; case PERIOD_M5: current_time_frame_string = "5 minutes"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 10; edate.sec = 0; } break; case PERIOD_M15: current_time_frame_string = "15 minutes"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 30; edate.sec = 0; } break; case PERIOD_M30: current_time_frame_string = "30 minutes"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 60; edate.sec = 0; } break; case PERIOD_H1: current_time_frame_string = "1 hour"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = edate.hour + 2; edate.min = 0; edate.sec = 0; } time_to_place_trade = StructToTime(edate); Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0)); store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade); //Print("choch_index_time ",choch_index_time); //Print("reversal_bar_time ",reversal_bar_time); //Print("time_of_candle",time_of_candle); //Print("time_to_place_trade",time_to_place_trade); //Print("signal is ",signal); break; default: current_time_frame_string = "unknown"; break; } //signal = ""; } signal = ""; } } if(trend == "downtrend") { double close = iClose(Symbol(),PERIOD_CURRENT,i); if(close > high) { remove_value_from_structure(); choch_at_index = true; ObjectCreate(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+20*Point()); 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); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); 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_time = iTime(Symbol(),PERIOD_CURRENT,i); high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false); 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"; choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i); int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false); chock_index++; iHigh(Symbol(),PERIOD_CURRENT,chock_index); iLow(Symbol(),PERIOD_CURRENT,chock_index); if(object_find("target line") > 0) { ObjectDelete(0,"target line"); } ObjectCreate(0,"target line",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iHigh(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iHigh(Symbol(),PERIOD_CURRENT,chock_index)); ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen); if(object_find("target line1") > 0) { ObjectDelete(0,"target line1"); } ObjectCreate(0,"target line1",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iLow(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iLow(Symbol(),PERIOD_CURRENT,chock_index)); ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen); if(signal == "buy") { MqlDateTime edate; time_to_place_trade = 0.0; int current_time_frame = Period(); string current_time_frame_string; switch(current_time_frame) { case PERIOD_M1: current_time_frame_string = "1 minute"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 2; edate.sec = 0; } break; case PERIOD_M5: current_time_frame_string = "5 minutes"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 10; edate.sec = 0; } break; case PERIOD_M15: current_time_frame_string = "15 minutes"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 30; edate.sec = 0; } break; case PERIOD_M30: current_time_frame_string = "30 minutes"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = 0; edate.min = edate.min + 60; edate.sec = 0; } break; case PERIOD_H1: current_time_frame_string = "1 hour"; if(TimeToStruct(time_of_candle,edate)) { edate.hour = edate.hour + 2; edate.min = 0; edate.sec = 0; } time_to_place_trade = StructToTime(edate); Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0)); store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade); //Print("choch_index_time ",choch_index_time); //Print("reversal_bar_time ",reversal_bar_time); //Print("time_of_candle",time_of_candle); //Print("time_to_place_trade",time_to_place_trade); //Print("signal is ",signal); break; default: current_time_frame_string = "unknown"; break; } } signal = ""; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void bos2(int i) { bool cnd; bool candle_bullish = false; bool candle_bearish = false; double find_high = 0.0; datetime find_high_time = 0.0; int save_bullish_index = 0; int save_bearish_index = 0; double find_low = 0.0; datetime find_low_time = 0.0; if(trend == "downtrend") { choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index) { cnd = false; } else { cnd = true; } if(choch_index_time > store_last_bos_index_time) { for(int m=choch_index; m>i; m--) { if(checkCandle(m) == "Bullish") { save_bullish_index = m; candle_bullish = true; break; } } find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index); for(int m=save_bullish_index; m>i; m--) { double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m); find_high_time = iTime(Symbol(),PERIOD_CURRENT,m); if(find_high < find_high1) { find_high = find_high1; find_high_time = iTime(Symbol(),PERIOD_CURRENT,m); } } for(int j=choch_index; j>=i; j--) { if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i)) { cnd = false; } } } if(choch_index_time < store_last_bos_index_time) { for(int m=Store_bos_last_index; m>i; m--) { if(checkCandle(m) == "Bullish") { save_bullish_index = m; candle_bullish = true; break; } } find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index); for(int m=save_bullish_index; m>i; m--) { double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m); find_high_time = iTime(Symbol(),PERIOD_CURRENT,m); if(find_high < find_high1) { find_high = find_high1; find_high_time = iTime(Symbol(),PERIOD_CURRENT,m); } } for(int j=Store_bos_last_index; j>=i; j--) { if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i)) { cnd = false; } } } if(cnd == true && candle_bullish == true) { if(object_find("high") > 0) { ObjectDelete(0,"high"); } high = find_high; index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, find_high_time, false); 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); if(object_find("low") > 0) { ObjectDelete(0,"low"); } low = iLow(Symbol(),PERIOD_CURRENT,i); 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_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); low_index_time = iTime(Symbol(),PERIOD_CURRENT,i); low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); cnd = false; candle_bullish = false; } } //------- if(trend == "uptrend") { choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index) { cnd = false; } else { cnd = true; } if(choch_index_time < store_last_bos_index_time) { for(int m=Store_bos_last_index; m>i; m--) { if(checkCandle(m) == "Bearish") { candle_bearish = true; save_bearish_index = m; break; } } find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index); for(int m=save_bearish_index; m>i; m--) { double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m); find_low_time = iTime(Symbol(),PERIOD_CURRENT,m); if(find_low > find_low1) { find_low = find_low1; find_low_time = iTime(Symbol(),PERIOD_CURRENT,m); } } for(int j=Store_bos_last_index; j>=i; j--) { if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i)) { cnd = false; } } } if(choch_index_time > store_last_bos_index_time) { for(int m=choch_index; m>i; m--) { if(checkCandle(m) == "Bearish") { candle_bearish = true; save_bearish_index = m; break; } } find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index); for(int m=save_bearish_index; m>i; m--) { double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m); find_low_time = iTime(Symbol(),PERIOD_CURRENT,m); if(find_low > find_low1) { find_low = find_low1; find_low_time = iTime(Symbol(),PERIOD_CURRENT,m); } } for(int j=choch_index; j>=i; j--) { if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i)) { cnd = false; } } } if(cnd == true && candle_bearish == true) { if(object_find("low") > 0) { ObjectDelete(0,"low"); } low = find_low; index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, find_low_time, false); 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); if(object_find("high") > 0) { ObjectDelete(0,"high"); } high = iHigh(Symbol(),PERIOD_CURRENT,i); 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+40*Point()); ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos"); store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i); Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false); high_index_time = iTime(Symbol(),PERIOD_CURRENT,i); high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false); cnd = false; candle_bearish = false; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void third_Condition(int i) { if(trend == "uptrend") { low2 = iLow(Symbol(),PERIOD_CURRENT,i); high2 = iHigh(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_time = iTime(Symbol(),PERIOD_CURRENT,i); low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); low_index = i; // addtion to be minus 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); // Print("low update due to third condition",low," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i)); } if(high2 > high) { ObjectCreate(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)); ObjectSetString(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C"); high = high2; high_index_time = iTime(Symbol(),PERIOD_CURRENT,i); high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); high_index = i; // addtion to be minus 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," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i)); } } if(trend == "downtrend") { high2 = iHigh(Symbol(),PERIOD_CURRENT,i); low2 = iLow(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_time = iTime(Symbol(),PERIOD_CURRENT,i); high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); high_index = i; // addtion to be minus 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); } if(low2 < low) { ObjectCreate(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)); ObjectSetString(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C"); low = low2; low_index_time = iTime(Symbol(),PERIOD_CURRENT,i); low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false); low_index = i; // addtion to be minus if(object_find("low") > 0) { ObjectDelete(0,"low"); } // Print("low value is ", 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); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void store_value_in_structure(datetime chock_time,datetime ind,string signal,datetime time_of_candle,datetime time_to_place_trade) { for(int l=0; l<200; l++) { if(od_1[l].choch_index_date_time == 0) { od_1[l].choch_index_date_time = chock_time; od_1[l].reversal_index_date_time = ind; od_1[l].Signal = signal; od_1[l].Time_OF_Candle = time_of_candle; // Print("saved time in the structure ",time_of_candle); od_1[l].Time_of_candle_For_trade = time_to_place_trade; // Print("saved time in the structure ",time_to_place_trade); break; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void remove_value_from_structure() { for(int l=0; l<200; l++) { if(od_1[l].choch_index_date_time != 0) { // Print("value removed from structure "); od_1[l].choch_index_date_time = 0; od_1[l].reversal_index_date_time = 0; od_1[l].Signal = ""; od_1[l].Time_OF_Candle = 0; od_1[l].Time_of_candle_For_trade = 0; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Entry_strategy(int value) { for(int i=value; i > 0; i--) { Bos(i); bos2(i); choch(i); third_Condition(i); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void placeBuyTrade() { double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0; openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK); double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(stoploss != 0) { buySL = Ask - (stoploss *10* Point()); } if(takeProfit != 0) { buyTp = Ask + (takeProfit *10* Point()); } if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,lot_size,Ask,buySL,buyTp,"Buy Trade Placed")) { Print("Buy Trade Placed: ",trade.ResultOrder()); } else { Print("Error in placing Buy: "+Symbol()+" ",GetLastError()); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void placeSellTrade() { double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0; openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID); double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID); if(stoploss != 0) { sell_SL = Bid + (stoploss *10* Point()); } if(takeProfit != 0) { sell_Tp = Bid - (takeProfit *10* Point()); } if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,lot_size,Bid,sell_SL,sell_Tp,"Sell Trade Placed")) { Print("Sell Trade PLaced: ",trade.ResultOrder()); } else { Print("Error in placing Sell: "+Symbol()+" ",GetLastError()); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { trade.SetExpertMagicNumber(magic_no); trade.SetDeviationInPoints(10); trade.SetTypeFilling(ORDER_FILLING_IOC); trade.LogLevel(LOG_LEVEL_ALL); trade.SetAsyncMode(false); int idx = 0; int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false); if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index))) { Print("vertical line created on chart : "); } else { Print("error in creating line : "); } //int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false); //if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index))) // { // Print("object created on chart : "); // } //else // { // Print("object not created : "); // } object_find(object_name); if(object_find(object_name) == true) { Print("object found"); if(checkCandle(user_input_index) == "Bullish") { trend = "uptrend"; high = iHigh(Symbol(),PERIOD_CURRENT,user_input_index); high_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index); // ambiguity high_index = user_input_index; for(int j=user_input_index; j < 1000; j++) { if(checkCandle(j) == "Bearish") { low = iLow(Symbol(),PERIOD_CURRENT,j); idx = j; break; } } idx = iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,idx,user_input_index+1); low = iLow(Symbol(),PERIOD_CURRENT,idx); low_index_time = iTime(Symbol(),PERIOD_CURRENT,idx); low_index = idx; } if(checkCandle(user_input_index) == "Bearish") { trend = "downtrend"; low = iLow(Symbol(),PERIOD_CURRENT,user_input_index); low_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index); low_index = user_input_index; for(int j=user_input_index; j < 1000; j++) { if(checkCandle(j) == "Bullish") { high = iHigh(Symbol(),PERIOD_CURRENT,j); idx = j; break; } } for(int k=idx; k high) { high = highh; high_index_time = iTime(Symbol(),PERIOD_CURRENT,k); high_index = k; } } } Entry_strategy(user_input_index); } else { Print("Object Not Found"); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(NewBar() == true) { Entry_strategy(1); for(int m=0; m < orderNum; m++) { if(od_1[m].choch_index_date_time != 0) { //Print("current time is ",TimeCurrent()); //Print("time is ",od_1[m].Time_of_candle_For_trade); //Print("signal is ",od_1[m].Signal); if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy" && od_1[m].Time_of_candle_For_trade != 0) { // Print("time is greater and signal is buy ",TimeCurrent()); int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false); int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false); // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time); // Print("choch_index_date_time ",od_1[m].choch_index_date_time); // // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx)); // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0)); // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index)); // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0)); if(iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx) > iLow(Symbol(),PERIOD_CURRENT,1) && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1)) { placeBuyTrade(); remove_value_from_structure(); od_1[m].choch_index_date_time = 0; od_1[m].Signal == ""; od_1[m].reversal_index_date_time = 0; od_1[m].choch_index_date_time = 0; signal = ""; Print("buy trade placed -------------------------------------------------------------"); Print("time at which trade is placed : ",TimeCurrent()); } } if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell" && od_1[m].Time_of_candle_For_trade != 0) { // Print("time is greater and signal is sell ",TimeCurrent()); int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false); int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false); // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time); // Print("choch_index_date_time ",od_1[m].choch_index_date_time); // // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx)); // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0)); // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index)); // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0)); if(iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx) < iLow(Symbol(),PERIOD_CURRENT,1) && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1)) { placeSellTrade(); remove_value_from_structure(); od_1[m].choch_index_date_time = 0; od_1[m].Signal == ""; od_1[m].reversal_index_date_time = 0; od_1[m].choch_index_date_time = 0; signal = ""; Print("sell trade placed -------------------------------------------------------------"); Print("time at which trade is placed : ",TimeCurrent()); } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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 v) // to check the candle is bullish or bearish { double close = iClose(Symbol(),PERIOD_CURRENT,v); double open = iOpen(Symbol(),PERIOD_CURRENT,v); if(close > open) { return "Bullish"; } else if(close < open) { return "Bearish"; } return "empty"; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+