No Description

BOS_CHOCH.mq5 50KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555
  1. //+------------------------------------------------------------------+
  2. //| MK_BOS_CHOCH.mq5 |
  3. //| Copyright 2023, MetaQuotes Ltd. |
  4. //| https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2023, MetaQuotes Ltd."
  7. #property link "https://www.mql5.com"
  8. #property version "1.00"
  9. #include <Trade\Trade.mqh>
  10. CTrade trade;
  11. #define orderNum 200
  12. struct tradeOrder
  13. {
  14. datetime choch_index_date_time;
  15. datetime reversal_index_date_time;
  16. string Signal;
  17. datetime Time_OF_Candle;
  18. datetime Time_of_candle_For_trade;
  19. tradeOrder()
  20. {
  21. choch_index_date_time = 0;
  22. Signal = "";
  23. reversal_index_date_time = 0;
  24. Time_OF_Candle = 0.0;
  25. Time_of_candle_For_trade = 0.0;
  26. }
  27. };
  28. tradeOrder od_1[orderNum];
  29. sinput string str = "<><><><><><> Set Object Name <><><><><><>";
  30. input string object_name = "line";
  31. sinput string str1 = "<><><><><><> Set time of vertical line <><><><><><>";
  32. input datetime inpTime = 0;//First Line Draw time
  33. sinput string str2 = "<><><><><><> Default Settings <><><><><><>";
  34. input double lot_size = 0.1;
  35. input double stoploss = 20;
  36. input double takeProfit = 20;
  37. input int magic_no = 123;
  38. string trend = " ";
  39. string signal = "";
  40. datetime reversal_bar_time = 0;
  41. datetime choch_index_time ;
  42. datetime index_of_low_time;
  43. datetime index_of_high_time;
  44. datetime store_last_bos_index_time;
  45. datetime time_of_candle = 0.0;
  46. datetime time_to_place_trade = 0.0;
  47. datetime high_index_time;
  48. datetime low_index_time;
  49. double hi;
  50. double lo;
  51. double high,low,low1,high1,low2,high2;
  52. bool bearish_found = false;
  53. bool bullish_found = false;
  54. bool choch_at_index = false;
  55. int choch_index = 0;
  56. int reversal_candle_index = 0;
  57. int ind = 0;
  58. int index_of_last_high = 0;
  59. int index_of_last_low = 0;
  60. int index_of_low = 0;
  61. int index_of_high = 0;
  62. int high_index=0;
  63. int low_index =0;
  64. int Store_bos_last_index = 0;
  65. int index = 0;
  66. //+------------------------------------------------------------------+
  67. //| Expert initialization function |
  68. //+------------------------------------------------------------------+
  69. void Bos(int i)
  70. {
  71. int save_bullish_index = 0;
  72. int save_bearish_index = 0;
  73. if(trend == "uptrend")
  74. {
  75. high1 = iHigh(Symbol(),PERIOD_CURRENT,i);
  76. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  77. if(close > high)
  78. {
  79. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  80. for(int j=high_index-1; j > i; j--)
  81. {
  82. if(checkCandle(j) == "Bearish")
  83. {
  84. save_bullish_index = j;
  85. if(object_find("high") > 0)
  86. {
  87. ObjectDelete(0,"high");
  88. }
  89. high = high1;
  90. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  91. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  92. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  93. ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high+40*Point());
  94. ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  95. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  96. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  97. low = iLow(Symbol(),PERIOD_CURRENT,j);
  98. bearish_found = true;
  99. index_of_low_time = iTime(Symbol(),PERIOD_CURRENT,j);
  100. break;
  101. }
  102. }
  103. if(bearish_found == true)
  104. {
  105. for(int k=save_bullish_index; k > i ; k--)
  106. {
  107. low1 = iLow(Symbol(),PERIOD_CURRENT,k);
  108. if(low1 < low)
  109. {
  110. low = low1;
  111. index_of_low_time = iTime(Symbol(),PERIOD_CURRENT,k);
  112. bearish_found = false;
  113. }
  114. }
  115. if(object_find("low") > 0)
  116. {
  117. if(ObjectDelete(0,"low"))
  118. {
  119. //Print("object deleted :");
  120. }
  121. }
  122. index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, index_of_low_time, false);
  123. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  124. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  125. ObjectSetInteger(0,"low",OBJPROP_RAY_LEFT,false);
  126. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  127. }
  128. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  129. }
  130. }
  131. if(trend == "downtrend")
  132. {
  133. low1 = iLow(Symbol(),PERIOD_CURRENT,i);
  134. double close1 = iClose(Symbol(),PERIOD_CURRENT,i);
  135. if(close1 < low)
  136. {
  137. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  138. for(int j=low_index - 1; j > i; j--)
  139. {
  140. if(checkCandle(j) == "Bullish")
  141. {
  142. save_bullish_index = j;
  143. if(object_find("low") > 0)
  144. {
  145. ObjectDelete(0,"low");
  146. }
  147. low = low1;
  148. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  149. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  150. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  151. ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low);
  152. ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  153. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  154. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  155. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  156. high = iHigh(Symbol(),PERIOD_CURRENT,j);
  157. bullish_found = true;
  158. index_of_high_time = iTime(Symbol(),PERIOD_CURRENT,j);
  159. break;
  160. }
  161. }
  162. if(bullish_found == true)
  163. {
  164. for(int k=save_bullish_index; k > i ; k--)
  165. {
  166. high1 = iHigh(Symbol(),PERIOD_CURRENT,k);
  167. if(high1 > high)
  168. {
  169. high = high1;
  170. index_of_high_time = iTime(Symbol(),PERIOD_CURRENT,k);
  171. bullish_found = false;
  172. }
  173. }
  174. if(object_find("high") > 0)
  175. {
  176. ObjectDelete(0,"high");
  177. }
  178. index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, index_of_high_time, false);
  179. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  180. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  181. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  182. bullish_found = false;
  183. }
  184. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  185. }
  186. }
  187. }
  188. //+------------------------------------------------------------------+
  189. //| |
  190. //+------------------------------------------------------------------+
  191. void Entry_Action_1_down(int Store_bos_last_index, int i,int diff)
  192. {
  193. for(int j=Store_bos_last_index+1; j < iBars(Symbol(),PERIOD_CURRENT); j++)
  194. {
  195. diff++;
  196. if(checkCandle(j) == "Bullish")
  197. {
  198. //Print("bullish found at index ",j);
  199. ind = j; // reversal candle index
  200. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,j);
  201. bullish_found = true;
  202. break;
  203. }
  204. }
  205. Print("condition satisfied in downtrend buy trade : ",check_values_less_than_choch_high(diff,i));
  206. if(check_values_less_than_choch_high(diff,i) == true)
  207. {
  208. if(iOpen(Symbol(),PERIOD_CURRENT,ind) > iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) < iClose(Symbol(),PERIOD_CURRENT,i))
  209. {
  210. signal = "buy";
  211. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  212. // Print("Place buy order -----------------------------------------------------------------------: ");
  213. }
  214. }
  215. //Print(diff);
  216. if(bullish_found == true)
  217. {
  218. 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));
  219. 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));
  220. ObjectSetInteger(0,"line14"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  221. ObjectSetInteger(0,"line15"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  222. 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));
  223. 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));
  224. ObjectSetInteger(0,"line16"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  225. ObjectSetInteger(0,"line17"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  226. diff = 0;
  227. bullish_found = false;
  228. }
  229. }
  230. //+------------------------------------------------------------------+
  231. //| |
  232. //+------------------------------------------------------------------+
  233. void Entry_Action_1_up(int Store_bos_last_index, int i,int diff)
  234. {
  235. for(int j=Store_bos_last_index+1; j < iBars(Symbol(),PERIOD_CURRENT); j++)
  236. {
  237. diff++;
  238. if(checkCandle(j) == "Bearish")
  239. {
  240. ind = j; // reversal candle index
  241. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,j);
  242. bearish_found = true;
  243. break;
  244. }
  245. }
  246. Print("condition satisfied in uptrend sell trade : ",check_values_less_than_choch_low(diff,i));
  247. if(check_values_less_than_choch_low(diff,i) == true)
  248. {
  249. if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i))
  250. {
  251. signal = "sell";
  252. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  253. // Print("Place sell order -----------------------------------------------------------------------: ");
  254. }
  255. }
  256. if(bearish_found == true)
  257. {
  258. 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));
  259. 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));
  260. ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  261. ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  262. 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));
  263. 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));
  264. ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  265. ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  266. bearish_found = false;
  267. }
  268. }
  269. //+------------------------------------------------------------------+
  270. //| |
  271. //+------------------------------------------------------------------+
  272. bool check_values_less_than_choch_high(int diff,int i) // downtrend
  273. {
  274. bool found = false;
  275. int value = (diff + i) - 1;
  276. for(int k=value; k>i; k--)
  277. {
  278. //Print("high values ",iHigh(Symbol(),PERIOD_CURRENT,k));
  279. //Print("close values ",iClose(Symbol(),PERIOD_CURRENT,i));
  280. if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i))
  281. {
  282. found = true;
  283. }
  284. }
  285. if(found == true)
  286. {
  287. return false;
  288. }
  289. return true;
  290. }
  291. //+------------------------------------------------------------------+
  292. //| |
  293. //+------------------------------------------------------------------+
  294. bool check_values_less_than_choch_low(int diff,int i) // uptrend
  295. {
  296. bool found = false;
  297. int value = (diff + i) - 1; // from which it start to check value is less in index
  298. //Print("value to be start is ",value);
  299. for(int k=value; k>i; k--)
  300. {
  301. if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i))
  302. {
  303. found = true;
  304. }
  305. }
  306. if(found == true)
  307. {
  308. return false;
  309. }
  310. return true;
  311. }
  312. //+------------------------------------------------------------------+
  313. //| |
  314. //+------------------------------------------------------------------+
  315. void choch(int i)
  316. {
  317. if(trend == "uptrend")
  318. {
  319. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  320. if(close < low)
  321. {
  322. remove_value_from_structure();
  323. choch_at_index = true;
  324. ObjectCreate(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  325. ObjectSetString(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  326. ObjectCreate(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_DOWN,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+100*Point());
  327. ObjectSetInteger(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrRed);
  328. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  329. int diff1 = Store_bos_last_index - (i);
  330. Entry_Action_1_up(Store_bos_last_index,i,diff1);
  331. low = iLow(Symbol(),PERIOD_CURRENT,i);
  332. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  333. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  334. low_index = i;
  335. if(object_find("low") > 0)
  336. {
  337. ObjectDelete(0,"low");
  338. }
  339. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  340. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  341. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  342. trend = "downtrend";
  343. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  344. int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  345. chock_index++;
  346. iHigh(Symbol(),PERIOD_CURRENT,chock_index);
  347. iLow(Symbol(),PERIOD_CURRENT,chock_index);
  348. if(object_find("target line") > 0)
  349. {
  350. ObjectDelete(0,"target line");
  351. }
  352. 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));
  353. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  354. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  355. if(object_find("target line1") > 0)
  356. {
  357. ObjectDelete(0,"target line1");
  358. }
  359. 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));
  360. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  361. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  362. if(signal == "sell")
  363. {
  364. MqlDateTime edate;
  365. time_to_place_trade = 0.0;
  366. int current_time_frame = Period();
  367. string current_time_frame_string;
  368. switch(current_time_frame)
  369. {
  370. case PERIOD_M1:
  371. current_time_frame_string = "1 minute";
  372. if(TimeToStruct(time_of_candle,edate))
  373. {
  374. edate.hour = 0;
  375. edate.min = edate.min + 2;
  376. edate.sec = 0;
  377. }
  378. break;
  379. case PERIOD_M5:
  380. current_time_frame_string = "5 minutes";
  381. if(TimeToStruct(time_of_candle,edate))
  382. {
  383. edate.hour = 0;
  384. edate.min = edate.min + 10;
  385. edate.sec = 0;
  386. }
  387. break;
  388. case PERIOD_M15:
  389. current_time_frame_string = "15 minutes";
  390. if(TimeToStruct(time_of_candle,edate))
  391. {
  392. edate.hour = 0;
  393. edate.min = edate.min + 30;
  394. edate.sec = 0;
  395. }
  396. break;
  397. case PERIOD_M30:
  398. current_time_frame_string = "30 minutes";
  399. if(TimeToStruct(time_of_candle,edate))
  400. {
  401. edate.hour = 0;
  402. edate.min = edate.min + 60;
  403. edate.sec = 0;
  404. }
  405. break;
  406. case PERIOD_H1:
  407. current_time_frame_string = "1 hour";
  408. if(TimeToStruct(time_of_candle,edate))
  409. {
  410. edate.hour = edate.hour + 2;
  411. edate.min = 0;
  412. edate.sec = 0;
  413. }
  414. time_to_place_trade = StructToTime(edate);
  415. Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0));
  416. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade);
  417. //Print("choch_index_time ",choch_index_time);
  418. //Print("reversal_bar_time ",reversal_bar_time);
  419. //Print("time_of_candle",time_of_candle);
  420. //Print("time_to_place_trade",time_to_place_trade);
  421. //Print("signal is ",signal);
  422. break;
  423. default:
  424. current_time_frame_string = "unknown";
  425. break;
  426. }
  427. //signal = "";
  428. }
  429. signal = "";
  430. }
  431. }
  432. if(trend == "downtrend")
  433. {
  434. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  435. if(close > high)
  436. {
  437. remove_value_from_structure();
  438. choch_at_index = true;
  439. ObjectCreate(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+20*Point());
  440. ObjectSetString(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  441. ObjectCreate(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_UP,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)-100*Point());
  442. ObjectSetInteger(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrGreen);
  443. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  444. int diff = Store_bos_last_index - (i);
  445. Entry_Action_1_down(Store_bos_last_index,i,diff);
  446. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  447. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  448. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  449. high_index = i;
  450. if(object_find("high") > 0)
  451. {
  452. ObjectDelete(0,"high");
  453. }
  454. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  455. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  456. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  457. trend = "uptrend";
  458. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  459. int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  460. chock_index++;
  461. iHigh(Symbol(),PERIOD_CURRENT,chock_index);
  462. iLow(Symbol(),PERIOD_CURRENT,chock_index);
  463. if(object_find("target line") > 0)
  464. {
  465. ObjectDelete(0,"target line");
  466. }
  467. 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));
  468. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  469. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  470. if(object_find("target line1") > 0)
  471. {
  472. ObjectDelete(0,"target line1");
  473. }
  474. 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));
  475. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  476. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  477. if(signal == "buy")
  478. {
  479. MqlDateTime edate;
  480. time_to_place_trade = 0.0;
  481. int current_time_frame = Period();
  482. string current_time_frame_string;
  483. switch(current_time_frame)
  484. {
  485. case PERIOD_M1:
  486. current_time_frame_string = "1 minute";
  487. if(TimeToStruct(time_of_candle,edate))
  488. {
  489. edate.hour = 0;
  490. edate.min = edate.min + 2;
  491. edate.sec = 0;
  492. }
  493. break;
  494. case PERIOD_M5:
  495. current_time_frame_string = "5 minutes";
  496. if(TimeToStruct(time_of_candle,edate))
  497. {
  498. edate.hour = 0;
  499. edate.min = edate.min + 10;
  500. edate.sec = 0;
  501. }
  502. break;
  503. case PERIOD_M15:
  504. current_time_frame_string = "15 minutes";
  505. if(TimeToStruct(time_of_candle,edate))
  506. {
  507. edate.hour = 0;
  508. edate.min = edate.min + 30;
  509. edate.sec = 0;
  510. }
  511. break;
  512. case PERIOD_M30:
  513. current_time_frame_string = "30 minutes";
  514. if(TimeToStruct(time_of_candle,edate))
  515. {
  516. edate.hour = 0;
  517. edate.min = edate.min + 60;
  518. edate.sec = 0;
  519. }
  520. break;
  521. case PERIOD_H1:
  522. current_time_frame_string = "1 hour";
  523. if(TimeToStruct(time_of_candle,edate))
  524. {
  525. edate.hour = edate.hour + 2;
  526. edate.min = 0;
  527. edate.sec = 0;
  528. }
  529. time_to_place_trade = StructToTime(edate);
  530. Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0));
  531. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade);
  532. //Print("choch_index_time ",choch_index_time);
  533. //Print("reversal_bar_time ",reversal_bar_time);
  534. //Print("time_of_candle",time_of_candle);
  535. //Print("time_to_place_trade",time_to_place_trade);
  536. //Print("signal is ",signal);
  537. break;
  538. default:
  539. current_time_frame_string = "unknown";
  540. break;
  541. }
  542. }
  543. signal = "";
  544. }
  545. }
  546. }
  547. //+------------------------------------------------------------------+
  548. //| |
  549. //+------------------------------------------------------------------+
  550. void bos2(int i)
  551. {
  552. bool cnd;
  553. bool candle_bullish = false;
  554. bool candle_bearish = false;
  555. double find_high = 0.0;
  556. datetime find_high_time = 0.0;
  557. int save_bullish_index = 0;
  558. int save_bearish_index = 0;
  559. double find_low = 0.0;
  560. datetime find_low_time = 0.0;
  561. if(trend == "downtrend")
  562. {
  563. choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  564. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  565. if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index)
  566. {
  567. cnd = false;
  568. }
  569. else
  570. {
  571. cnd = true;
  572. }
  573. if(choch_index_time > store_last_bos_index_time)
  574. {
  575. for(int m=choch_index; m>i; m--)
  576. {
  577. if(checkCandle(m) == "Bullish")
  578. {
  579. save_bullish_index = m;
  580. candle_bullish = true;
  581. break;
  582. }
  583. }
  584. find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index);
  585. for(int m=save_bullish_index; m>i; m--)
  586. {
  587. double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m);
  588. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  589. if(find_high < find_high1)
  590. {
  591. find_high = find_high1;
  592. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  593. }
  594. }
  595. for(int j=choch_index; j>=i; j--)
  596. {
  597. if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i))
  598. {
  599. cnd = false;
  600. }
  601. }
  602. }
  603. if(choch_index_time < store_last_bos_index_time)
  604. {
  605. for(int m=Store_bos_last_index; m>i; m--)
  606. {
  607. if(checkCandle(m) == "Bullish")
  608. {
  609. save_bullish_index = m;
  610. candle_bullish = true;
  611. break;
  612. }
  613. }
  614. find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index);
  615. for(int m=save_bullish_index; m>i; m--)
  616. {
  617. double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m);
  618. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  619. if(find_high < find_high1)
  620. {
  621. find_high = find_high1;
  622. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  623. }
  624. }
  625. for(int j=Store_bos_last_index; j>=i; j--)
  626. {
  627. if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i))
  628. {
  629. cnd = false;
  630. }
  631. }
  632. }
  633. if(cnd == true && candle_bullish == true)
  634. {
  635. if(object_find("high") > 0)
  636. {
  637. ObjectDelete(0,"high");
  638. }
  639. high = find_high;
  640. index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, find_high_time, false);
  641. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  642. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  643. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  644. if(object_find("low") > 0)
  645. {
  646. ObjectDelete(0,"low");
  647. }
  648. low = iLow(Symbol(),PERIOD_CURRENT,i);
  649. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  650. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  651. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  652. ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low);
  653. ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  654. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  655. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  656. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  657. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  658. cnd = false;
  659. candle_bullish = false;
  660. }
  661. }
  662. //-------
  663. if(trend == "uptrend")
  664. {
  665. choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  666. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  667. if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index)
  668. {
  669. cnd = false;
  670. }
  671. else
  672. {
  673. cnd = true;
  674. }
  675. if(choch_index_time < store_last_bos_index_time)
  676. {
  677. for(int m=Store_bos_last_index; m>i; m--)
  678. {
  679. if(checkCandle(m) == "Bearish")
  680. {
  681. candle_bearish = true;
  682. save_bearish_index = m;
  683. break;
  684. }
  685. }
  686. find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index);
  687. for(int m=save_bearish_index; m>i; m--)
  688. {
  689. double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m);
  690. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  691. if(find_low > find_low1)
  692. {
  693. find_low = find_low1;
  694. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  695. }
  696. }
  697. for(int j=Store_bos_last_index; j>=i; j--)
  698. {
  699. if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i))
  700. {
  701. cnd = false;
  702. }
  703. }
  704. }
  705. if(choch_index_time > store_last_bos_index_time)
  706. {
  707. for(int m=choch_index; m>i; m--)
  708. {
  709. if(checkCandle(m) == "Bearish")
  710. {
  711. candle_bearish = true;
  712. save_bearish_index = m;
  713. break;
  714. }
  715. }
  716. find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index);
  717. for(int m=save_bearish_index; m>i; m--)
  718. {
  719. double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m);
  720. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  721. if(find_low > find_low1)
  722. {
  723. find_low = find_low1;
  724. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  725. }
  726. }
  727. for(int j=choch_index; j>=i; j--)
  728. {
  729. if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i))
  730. {
  731. cnd = false;
  732. }
  733. }
  734. }
  735. if(cnd == true && candle_bearish == true)
  736. {
  737. if(object_find("low") > 0)
  738. {
  739. ObjectDelete(0,"low");
  740. }
  741. low = find_low;
  742. index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, find_low_time, false);
  743. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  744. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  745. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  746. if(object_find("high") > 0)
  747. {
  748. ObjectDelete(0,"high");
  749. }
  750. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  751. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  752. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  753. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  754. ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high+40*Point());
  755. ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  756. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  757. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  758. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  759. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  760. cnd = false;
  761. candle_bearish = false;
  762. }
  763. }
  764. }
  765. //+------------------------------------------------------------------+
  766. //| |
  767. //+------------------------------------------------------------------+
  768. //+------------------------------------------------------------------+
  769. //| |
  770. //+------------------------------------------------------------------+
  771. void third_Condition(int i)
  772. {
  773. if(trend == "uptrend")
  774. {
  775. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  776. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  777. if(low2 < low)
  778. {
  779. ObjectCreate(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  780. ObjectSetString(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  781. low = low2;
  782. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  783. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  784. low_index = i; // addtion to be minus
  785. if(object_find("low") > 0)
  786. {
  787. ObjectDelete(0,"low");
  788. }
  789. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  790. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  791. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  792. // Print("low update due to third condition",low," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i));
  793. }
  794. if(high2 > high)
  795. {
  796. ObjectCreate(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  797. ObjectSetString(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  798. high = high2;
  799. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  800. high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  801. high_index = i; // addtion to be minus
  802. if(object_find("high") > 0)
  803. {
  804. ObjectDelete(0,"high");
  805. }
  806. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  807. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  808. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  809. // Print("high update due to third condition",high," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i));
  810. }
  811. }
  812. if(trend == "downtrend")
  813. {
  814. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  815. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  816. if(high2 > high)
  817. {
  818. ObjectCreate(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  819. ObjectSetString(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  820. high = high2;
  821. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  822. high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  823. high_index = i; // addtion to be minus
  824. if(object_find("high") > 0)
  825. {
  826. ObjectDelete(0,"high");
  827. }
  828. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  829. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  830. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  831. // Print("high update due to third condition",high);
  832. }
  833. if(low2 < low)
  834. {
  835. ObjectCreate(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  836. ObjectSetString(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  837. low = low2;
  838. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  839. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  840. low_index = i; // addtion to be minus
  841. if(object_find("low") > 0)
  842. {
  843. ObjectDelete(0,"low");
  844. }
  845. // Print("low value is ", low);
  846. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  847. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  848. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  849. // Print("low update due to third condition",low);
  850. }
  851. }
  852. }
  853. //+------------------------------------------------------------------+
  854. //| |
  855. //+------------------------------------------------------------------+
  856. void store_value_in_structure(datetime chock_time,datetime ind,string signal,datetime time_of_candle,datetime time_to_place_trade)
  857. {
  858. for(int l=0; l<200; l++)
  859. {
  860. if(od_1[l].choch_index_date_time == 0)
  861. {
  862. od_1[l].choch_index_date_time = chock_time;
  863. od_1[l].reversal_index_date_time = ind;
  864. od_1[l].Signal = signal;
  865. od_1[l].Time_OF_Candle = time_of_candle;
  866. // Print("saved time in the structure ",time_of_candle);
  867. od_1[l].Time_of_candle_For_trade = time_to_place_trade;
  868. // Print("saved time in the structure ",time_to_place_trade);
  869. break;
  870. }
  871. }
  872. }
  873. //+------------------------------------------------------------------+
  874. //| |
  875. //+------------------------------------------------------------------+
  876. void remove_value_from_structure()
  877. {
  878. for(int l=0; l<200; l++)
  879. {
  880. if(od_1[l].choch_index_date_time != 0)
  881. {
  882. // Print("value removed from structure ");
  883. od_1[l].choch_index_date_time = 0;
  884. od_1[l].reversal_index_date_time = 0;
  885. od_1[l].Signal = "";
  886. od_1[l].Time_OF_Candle = 0;
  887. od_1[l].Time_of_candle_For_trade = 0;
  888. }
  889. }
  890. }
  891. //+------------------------------------------------------------------+
  892. //| |
  893. //+------------------------------------------------------------------+
  894. void Entry_strategy(int value)
  895. {
  896. for(int i=value; i > 0; i--)
  897. {
  898. Bos(i);
  899. bos2(i);
  900. choch(i);
  901. third_Condition(i);
  902. }
  903. }
  904. //+------------------------------------------------------------------+
  905. //| |
  906. //+------------------------------------------------------------------+
  907. void placeBuyTrade()
  908. {
  909. double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
  910. openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  911. double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  912. if(stoploss != 0)
  913. {
  914. buySL = Ask - (stoploss *10* Point());
  915. }
  916. if(takeProfit != 0)
  917. {
  918. buyTp = Ask + (takeProfit *10* Point());
  919. }
  920. if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,lot_size,Ask,buySL,buyTp,"Buy Trade Placed"))
  921. {
  922. Print("Buy Trade Placed: ",trade.ResultOrder());
  923. }
  924. else
  925. {
  926. Print("Error in placing Buy: "+Symbol()+" ",GetLastError());
  927. }
  928. }
  929. //+------------------------------------------------------------------+
  930. //| |
  931. //+------------------------------------------------------------------+
  932. void placeSellTrade()
  933. {
  934. double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
  935. openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
  936. double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);
  937. if(stoploss != 0)
  938. {
  939. sell_SL = Bid + (stoploss *10* Point());
  940. }
  941. if(takeProfit != 0)
  942. {
  943. sell_Tp = Bid - (takeProfit *10* Point());
  944. }
  945. if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,lot_size,Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
  946. {
  947. Print("Sell Trade PLaced: ",trade.ResultOrder());
  948. }
  949. else
  950. {
  951. Print("Error in placing Sell: "+Symbol()+" ",GetLastError());
  952. }
  953. }
  954. //+------------------------------------------------------------------+
  955. //| |
  956. //+------------------------------------------------------------------+
  957. int OnInit()
  958. {
  959. trade.SetExpertMagicNumber(magic_no);
  960. trade.SetDeviationInPoints(10);
  961. trade.SetTypeFilling(ORDER_FILLING_IOC);
  962. trade.LogLevel(LOG_LEVEL_ALL);
  963. trade.SetAsyncMode(false);
  964. int idx = 0;
  965. int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
  966. if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
  967. {
  968. Print("vertical line created on chart : ");
  969. }
  970. else
  971. {
  972. Print("error in creating line : ");
  973. }
  974. //int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false);
  975. //if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
  976. // {
  977. // Print("object created on chart : ");
  978. // }
  979. //else
  980. // {
  981. // Print("object not created : ");
  982. // }
  983. object_find(object_name);
  984. if(object_find(object_name) == true)
  985. {
  986. Print("object found");
  987. if(checkCandle(user_input_index) == "Bullish")
  988. {
  989. trend = "uptrend";
  990. high = iHigh(Symbol(),PERIOD_CURRENT,user_input_index);
  991. high_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index); // ambiguity
  992. high_index = user_input_index;
  993. for(int j=user_input_index; j < 1000; j++)
  994. {
  995. if(checkCandle(j) == "Bearish")
  996. {
  997. low = iLow(Symbol(),PERIOD_CURRENT,j);
  998. idx = j;
  999. break;
  1000. }
  1001. }
  1002. idx = iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,idx,user_input_index+1);
  1003. low = iLow(Symbol(),PERIOD_CURRENT,idx);
  1004. low_index_time = iTime(Symbol(),PERIOD_CURRENT,idx);
  1005. low_index = idx;
  1006. }
  1007. if(checkCandle(user_input_index) == "Bearish")
  1008. {
  1009. trend = "downtrend";
  1010. low = iLow(Symbol(),PERIOD_CURRENT,user_input_index);
  1011. low_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index);
  1012. low_index = user_input_index;
  1013. for(int j=user_input_index; j < 1000; j++)
  1014. {
  1015. if(checkCandle(j) == "Bullish")
  1016. {
  1017. high = iHigh(Symbol(),PERIOD_CURRENT,j);
  1018. idx = j;
  1019. break;
  1020. }
  1021. }
  1022. for(int k=idx; k<user_input_index; k++)
  1023. {
  1024. double highh = iHigh(Symbol(),PERIOD_CURRENT,k);
  1025. if(highh > high)
  1026. {
  1027. high = highh;
  1028. high_index_time = iTime(Symbol(),PERIOD_CURRENT,k);
  1029. high_index = k;
  1030. }
  1031. }
  1032. }
  1033. Entry_strategy(user_input_index);
  1034. }
  1035. else
  1036. {
  1037. Print("Object Not Found");
  1038. }
  1039. return(INIT_SUCCEEDED);
  1040. }
  1041. //+------------------------------------------------------------------+
  1042. //| Expert deinitialization function |
  1043. //+------------------------------------------------------------------+
  1044. void OnDeinit(const int reason)
  1045. {
  1046. //---
  1047. }
  1048. //+------------------------------------------------------------------+
  1049. //| Expert tick function |
  1050. //+------------------------------------------------------------------+
  1051. void OnTick()
  1052. {
  1053. if(NewBar() == true)
  1054. {
  1055. Entry_strategy(1);
  1056. for(int m=0; m < orderNum; m++)
  1057. {
  1058. if(od_1[m].choch_index_date_time != 0)
  1059. {
  1060. //Print("current time is ",TimeCurrent());
  1061. //Print("time is ",od_1[m].Time_of_candle_For_trade);
  1062. //Print("signal is ",od_1[m].Signal);
  1063. if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy" && od_1[m].Time_of_candle_For_trade != 0)
  1064. {
  1065. // Print("time is greater and signal is buy ",TimeCurrent());
  1066. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1067. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1068. // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1069. // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1070. //
  1071. // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1072. // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1073. // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1074. // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1075. if(iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx) > iLow(Symbol(),PERIOD_CURRENT,1)
  1076. && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1))
  1077. {
  1078. placeBuyTrade();
  1079. remove_value_from_structure();
  1080. od_1[m].choch_index_date_time = 0;
  1081. od_1[m].Signal == "";
  1082. od_1[m].reversal_index_date_time = 0;
  1083. od_1[m].choch_index_date_time = 0;
  1084. signal = "";
  1085. Print("buy trade placed -------------------------------------------------------------");
  1086. Print("time at which trade is placed : ",TimeCurrent());
  1087. }
  1088. }
  1089. if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell" && od_1[m].Time_of_candle_For_trade != 0)
  1090. {
  1091. // Print("time is greater and signal is sell ",TimeCurrent());
  1092. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1093. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1094. // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1095. // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1096. //
  1097. // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1098. // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1099. // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1100. // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1101. if(iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx) < iLow(Symbol(),PERIOD_CURRENT,1)
  1102. && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1))
  1103. {
  1104. placeSellTrade();
  1105. remove_value_from_structure();
  1106. od_1[m].choch_index_date_time = 0;
  1107. od_1[m].Signal == "";
  1108. od_1[m].reversal_index_date_time = 0;
  1109. od_1[m].choch_index_date_time = 0;
  1110. signal = "";
  1111. Print("sell trade placed -------------------------------------------------------------");
  1112. Print("time at which trade is placed : ",TimeCurrent());
  1113. }
  1114. }
  1115. }
  1116. }
  1117. }
  1118. }
  1119. //+------------------------------------------------------------------+
  1120. //| |
  1121. //+------------------------------------------------------------------+
  1122. bool NewBar()
  1123. {
  1124. static datetime Last_bar ;
  1125. datetime Current_bar = iTime(Symbol(), PERIOD_CURRENT,0);
  1126. if(Current_bar != Last_bar)
  1127. {
  1128. Last_bar = Current_bar;
  1129. return (true);
  1130. }
  1131. else
  1132. {
  1133. return (false);
  1134. }
  1135. }
  1136. //+------------------------------------------------------------------+
  1137. //| |
  1138. //+------------------------------------------------------------------+
  1139. bool object_find(string obj) // to find object placed by user in the chart
  1140. {
  1141. if(ObjectFind(0,obj) >= 0)
  1142. {
  1143. return true;
  1144. }
  1145. return false;
  1146. }
  1147. //+------------------------------------------------------------------+
  1148. //| |
  1149. //+------------------------------------------------------------------+
  1150. string checkCandle(int v) // to check the candle is bullish or bearish
  1151. {
  1152. double close = iClose(Symbol(),PERIOD_CURRENT,v);
  1153. double open = iOpen(Symbol(),PERIOD_CURRENT,v);
  1154. if(close > open)
  1155. {
  1156. return "Bullish";
  1157. }
  1158. else
  1159. if(close < open)
  1160. {
  1161. return "Bearish";
  1162. }
  1163. return "empty";
  1164. }
  1165. //+------------------------------------------------------------------+
  1166. //+------------------------------------------------------------------+