No Description

BOS_CHOCH.mq5 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  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. #define orderNum 200
  10. struct tradeOrder
  11. {
  12. int choch_index;
  13. int reversal_index;
  14. string Signal;
  15. datetime Time_OF_Candle;
  16. datetime Time_of_candle_For_trade;
  17. tradeOrder()
  18. {
  19. choch_index = -1;
  20. Signal = "";
  21. reversal_index = 0;
  22. Time_OF_Candle = 0.0;
  23. Time_of_candle_For_trade = 0.0;
  24. }
  25. };
  26. tradeOrder od_1[orderNum];
  27. sinput string str = "<><><><><><> Object Name <><><><><><>";
  28. input string object_name = "line";
  29. int reversal_candle_index = 0;
  30. int ind = 0;
  31. string trend;
  32. bool bearish_found = false;
  33. bool bullish_found = false;
  34. int index_of_last_high = 0;
  35. int index_of_last_low = 0;
  36. double hi;
  37. double lo;
  38. int index_of_low = 0;
  39. int index_of_high = 0;
  40. int high_index=0;
  41. int low_index =0;
  42. double high,low,low1,high1,low2,high2;
  43. int Store_bos_last_index = 0;
  44. //int ind = 0;
  45. bool choch = false;
  46. int index = 0;
  47. string signal = "";
  48. datetime time_of_candle = 0.0;
  49. //+------------------------------------------------------------------+
  50. //| Expert initialization function |
  51. //+------------------------------------------------------------------+
  52. void Bos(int i)
  53. {
  54. if(trend == "uptrend")
  55. {
  56. high = iHigh(Symbol(),PERIOD_CURRENT,high_index);
  57. high1 = iHigh(Symbol(),PERIOD_CURRENT,i);
  58. if(high1 > high)
  59. {
  60. if(object_find("high") > 0)
  61. {
  62. ObjectDelete(0,"high");
  63. }
  64. high = high1;
  65. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  66. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  67. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  68. ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high);
  69. ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  70. Store_bos_last_index = i;
  71. int count = (high_index-1) - i;
  72. for(int j=1; j <= count; j++)
  73. {
  74. if(checkCandle(high_index-j) == "Bearish")
  75. {
  76. low = iLow(Symbol(),PERIOD_CURRENT,high_index-j);
  77. bearish_found = true;
  78. }
  79. }
  80. if(bearish_found == true)
  81. {
  82. for(int k=1; k < count; k++)
  83. {
  84. low1 = iLow(Symbol(),PERIOD_CURRENT,high_index - k);
  85. if(low1 <= low)
  86. {
  87. low = low1;
  88. index_of_low =high_index- k;
  89. }
  90. }
  91. if(object_find("low") > 0)
  92. {
  93. ObjectDelete(0,"low");
  94. }
  95. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  96. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  97. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  98. bearish_found = false;
  99. }
  100. high_index = i;
  101. }
  102. }
  103. if(trend == "downtrend")
  104. {
  105. low = iLow(Symbol(),PERIOD_CURRENT,low_index);
  106. low1 = iLow(Symbol(),PERIOD_CURRENT,i);
  107. if(low1 < low)
  108. {
  109. if(object_find("low") > 0)
  110. {
  111. ObjectDelete(0,"low");
  112. }
  113. low = low1;
  114. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  115. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  116. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  117. ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low);
  118. ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  119. Store_bos_last_index = i;
  120. int count = (low_index-1) - i;
  121. for(int j=1; j <= count; j++)
  122. {
  123. if(checkCandle(low_index-j) == "Bullish")
  124. {
  125. high = iHigh(Symbol(),PERIOD_CURRENT,low_index-j);
  126. bullish_found = true;
  127. }
  128. }
  129. if(bullish_found == true)
  130. {
  131. for(int k=1; k < count; k++)
  132. {
  133. high1 = iHigh(Symbol(),PERIOD_CURRENT,low_index - k);
  134. if(high1 >= high)
  135. {
  136. high = high1;
  137. index_of_high = low_index - k;
  138. }
  139. }
  140. if(object_find("high") > 0)
  141. {
  142. ObjectDelete(0,"high");
  143. }
  144. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  145. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  146. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  147. bullish_found = false;
  148. }
  149. low_index = i;
  150. }
  151. }
  152. }
  153. //+------------------------------------------------------------------+
  154. //| |
  155. //+------------------------------------------------------------------+
  156. void Entry_Action_1_down(int Store_bos_last_index, int i,int diff)
  157. {
  158. // i is the index of the choch
  159. for(int j=Store_bos_last_index+1; j < iBars(Symbol(),PERIOD_CURRENT); j++)
  160. {
  161. diff++;
  162. if(checkCandle(j) == "Bullish")
  163. {
  164. //Print("bullish found at index ",j);
  165. ind = j; // reversal candle index
  166. bullish_found = true;
  167. break;
  168. }
  169. }
  170. Print("condition satisfied : ",check_values_less_than_choch_high(diff,i));
  171. Print("choch candle open is ",iOpen(Symbol(),PERIOD_CURRENT,i));
  172. Print("reversal candle open is ",iOpen(Symbol(),PERIOD_CURRENT,ind));
  173. if(check_values_less_than_choch_high(diff,i) == true)
  174. {
  175. if(iOpen(Symbol(),PERIOD_CURRENT,ind) > iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) < iClose(Symbol(),PERIOD_CURRENT,i))
  176. {
  177. signal = "buy";
  178. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  179. Print("Place buy order -----------------------------------------------------------------------: ");
  180. }
  181. }
  182. //Print(diff);
  183. if(bullish_found == true)
  184. {
  185. 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));
  186. 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));
  187. ObjectSetInteger(0,"line14"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  188. ObjectSetInteger(0,"line15"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  189. 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));
  190. 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));
  191. ObjectSetInteger(0,"line16"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  192. ObjectSetInteger(0,"line17"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  193. diff = 0;
  194. bullish_found = false;
  195. }
  196. }
  197. //+------------------------------------------------------------------+
  198. //| |
  199. //+------------------------------------------------------------------+
  200. void Entry_Action_1_up(int Store_bos_last_index, int i,int diff)
  201. {
  202. for(int j=Store_bos_last_index+1; j < iBars(Symbol(),PERIOD_CURRENT); j++)
  203. {
  204. diff++;
  205. if(checkCandle(j) == "Bearish")
  206. {
  207. ind = j; // reversal candle index
  208. bearish_found = true;
  209. break;
  210. }
  211. }
  212. //Print("diff is ", diff);
  213. Print("condition satisfied : ",check_values_less_than_choch_low(diff,i));
  214. Print("choch candle open is ",iOpen(Symbol(),PERIOD_CURRENT,i));
  215. Print("reversal candle open is ",iOpen(Symbol(),PERIOD_CURRENT,ind));
  216. if(check_values_less_than_choch_low(diff,i) == true)
  217. {
  218. if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i))
  219. {
  220. signal = "sell";
  221. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  222. Print("Place sell order -----------------------------------------------------------------------: ");
  223. }
  224. }
  225. if(bearish_found == true)
  226. {
  227. 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));
  228. 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));
  229. ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  230. ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  231. 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));
  232. 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));
  233. ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  234. ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  235. bearish_found = false;
  236. }
  237. }
  238. //+------------------------------------------------------------------+
  239. //| |
  240. //+------------------------------------------------------------------+
  241. bool check_values_less_than_choch_high(int diff,int i) // downtrend
  242. {
  243. bool found = false;
  244. int value = (diff + i) - 1;
  245. for(int k=value; k>i; k--)
  246. {
  247. //Print("high values ",iHigh(Symbol(),PERIOD_CURRENT,k));
  248. //Print("close values ",iClose(Symbol(),PERIOD_CURRENT,i));
  249. if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i))
  250. {
  251. found = true;
  252. }
  253. }
  254. if(found == true)
  255. {
  256. return false;
  257. }
  258. return true;
  259. }
  260. //+------------------------------------------------------------------+
  261. //| |
  262. //+------------------------------------------------------------------+
  263. bool check_values_less_than_choch_low(int diff,int i) // uptrend
  264. {
  265. bool found = false;
  266. int value = (diff + i) - 1; // from which it start to check value is less in index
  267. //Print("value to be start is ",value);
  268. for(int k=value; k>i; k--)
  269. {
  270. if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i))
  271. {
  272. found = true;
  273. }
  274. }
  275. if(found == true)
  276. {
  277. return false;
  278. }
  279. return true;
  280. }
  281. //+------------------------------------------------------------------+
  282. //| |
  283. //+------------------------------------------------------------------+
  284. void choch(int i)
  285. {
  286. if(trend == "uptrend")
  287. {
  288. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  289. if(close < low)
  290. {
  291. ObjectCreate(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  292. ObjectSetString(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  293. ObjectCreate(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_DOWN,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+100*Point());
  294. ObjectSetInteger(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrRed);
  295. //Print("last bos index is ",Store_bos_last_index);
  296. int diff1 = Store_bos_last_index - (i);
  297. // Print("diff between bos and last choch is ",diff1);
  298. Entry_Action_1_up(Store_bos_last_index,i,diff1);
  299. low = iLow(Symbol(),PERIOD_CURRENT,i);
  300. low_index = i;
  301. if(object_find("low") > 0)
  302. {
  303. ObjectDelete(0,"low");
  304. }
  305. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  306. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  307. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  308. // Entry_Action_1_up(Store_bos_last_index,i);
  309. Print("low update due to choch : ", low);
  310. trend = "downtrend";
  311. Print("choch at uptrend index --- ", iTime(Symbol(),PERIOD_CURRENT,i));
  312. }
  313. }
  314. if(trend == "downtrend")
  315. {
  316. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  317. if(close > high)
  318. {
  319. ObjectCreate(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  320. ObjectSetString(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  321. ObjectCreate(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_UP,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)-100*Point());
  322. ObjectSetInteger(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrGreen);
  323. int diff = Store_bos_last_index - (i);
  324. Entry_Action_1_down(Store_bos_last_index,i,diff);
  325. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  326. high_index = i;
  327. if(object_find("high") > 0)
  328. {
  329. ObjectDelete(0,"high");
  330. }
  331. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  332. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  333. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  334. trend = "uptrend";
  335. Print("high is update due to choch : ", high);
  336. Print("choch at downtrend index ---- ", iTime(Symbol(),PERIOD_CURRENT,i));
  337. }
  338. }
  339. }
  340. //+------------------------------------------------------------------+
  341. //| |
  342. //+------------------------------------------------------------------+
  343. void third_Condition(int i)
  344. {
  345. if(trend == "uptrend")
  346. {
  347. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  348. if(low2 < low)
  349. {
  350. ObjectCreate(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  351. ObjectSetString(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  352. low = low2;
  353. low_index = i; // addtion to be minus
  354. if(object_find("low") > 0)
  355. {
  356. ObjectDelete(0,"low");
  357. }
  358. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  359. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  360. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  361. Print("low update due to third condition",low," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i));
  362. }
  363. }
  364. if(trend == "downtrend")
  365. {
  366. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  367. if(high2 > high)
  368. {
  369. ObjectCreate(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  370. ObjectSetString(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  371. high = high2;
  372. high_index = i; // addtion to be minus
  373. if(object_find("high") > 0)
  374. {
  375. ObjectDelete(0,"high");
  376. }
  377. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  378. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  379. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  380. Print("high update due to third condition",high);
  381. }
  382. }
  383. }
  384. //+------------------------------------------------------------------+
  385. //| |
  386. //+------------------------------------------------------------------+
  387. void store_value_in_structure(int i,int ind,string signal,datetime time_of_candle,datetime time_to_place_trade)
  388. {
  389. for(int l=0; l<200; l++)
  390. {
  391. if(od_1[l].choch_index == -1)
  392. {
  393. od_1[l].choch_index = i;
  394. od_1[l].reversal_index = ind;
  395. od_1[l].Signal = signal;
  396. od_1[l].Time_OF_Candle = time_of_candle;
  397. Print("saved time in the structure ",time_of_candle);
  398. od_1[l].Time_of_candle_For_trade = time_to_place_trade;
  399. Print("saved time in the structure ",time_to_place_trade);
  400. break;
  401. }
  402. }
  403. }
  404. //+------------------------------------------------------------------+
  405. //| |
  406. //+------------------------------------------------------------------+
  407. void foo(int value)
  408. {
  409. int l = 0;
  410. for(int i=value-1; i > 0; i--)
  411. {
  412. //Print("hi");
  413. //if(l < 2)
  414. {
  415. Bos(i);
  416. choch(i);
  417. third_Condition(i);
  418. if(signal == "buy" || signal == "sell")
  419. {
  420. MqlDateTime sdate,edate;
  421. datetime time_to_place_trade = 0.0;
  422. //Print("time of the candle ", time_of_candle);
  423. int current_time_frame = Period();
  424. string current_time_frame_String;
  425. switch(current_time_frame)
  426. {
  427. case PERIOD_M1:
  428. current_time_frame_String = "1 Minute";
  429. break;
  430. case PERIOD_M5:
  431. current_time_frame_String = "5 Minutes";
  432. break;
  433. case PERIOD_M15:
  434. current_time_frame_String = "15 Minutes";
  435. break;
  436. case PERIOD_M30:
  437. current_time_frame_String = "30 Minutes";
  438. break;
  439. case PERIOD_H1:
  440. current_time_frame_String = "1 Hour";
  441. if(TimeToStruct(time_of_candle,edate))
  442. {
  443. edate.hour = edate.hour + 2;
  444. edate.min = 0;
  445. edate.sec = 0;
  446. }
  447. // Print("hour of the candle is ",StructToTime(edate));
  448. time_to_place_trade = StructToTime(edate);
  449. store_value_in_structure(i,ind,signal,time_of_candle,time_to_place_trade);
  450. // for(int m=0; m < orderNum; m++)
  451. // {
  452. // if(od_1[m].choch_index != -1)
  453. // {
  454. // Print(" time to match the condition : ",TimeCurrent());
  455. //
  456. // if(TimeCurrent() > od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy")
  457. // {
  458. // Print("time to match the condition : ",TimeCurrent());
  459. //
  460. // //if(iHigh(Symbol(),PERIOD_CURRENT,od_1[m].reversal_index) > iLow(Symbol(),PERIOD_CURRENT,0) && iClose(Symbol(),PERIOD_CURRENT,od_1[m].choch_index) < iClose(Symbol(),PERIOD_CURRENT,0))
  461. // {
  462. // ObjectCreate(0,"buy trade"+time_to_place_trade,OBJ_ARROW_BUY,0,time_to_place_trade,iHigh(Symbol(),PERIOD_CURRENT,0));
  463. // Print("trade placed buy at index ",0);
  464. // od_1[m].choch_index = -1;
  465. //
  466. // }
  467. // Print(" time to take trade is ",od_1[m].Time_of_candle_For_trade);
  468. //
  469. //
  470. // }
  471. //
  472. // if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell")
  473. // {
  474. // Print(TimeCurrent());
  475. // //
  476. // Print(" time to take trade is ",od_1[m].Time_of_candle_For_trade);
  477. // od_1[m].choch_index = -1;
  478. //
  479. // }
  480. // }
  481. // }
  482. // if(TimeCurrent() >= time_to_place_trade)
  483. // {
  484. // Print("hi");
  485. // if(signal == "buy")
  486. // {
  487. // int index = iBarShift(Symbol(), PERIOD_CURRENT, time_of_candle, false);
  488. // Print("index of the 2 hour plus index is ",index);
  489. //
  490. // Print("choch index ", i);
  491. // Print("reversal index ",ind);
  492. // Print("value to be check index ",i-3);
  493. //
  494. // //if(iHigh(Symbol(),PERIOD_CURRENT,ind) > iLow(Symbol(),PERIOD_CURRENT,i-2) && iClose(Symbol(),PERIOD_CURRENT,i) < iClose(Symbol(),PERIOD_CURRENT,i-2))
  495. // // {
  496. // // ObjectCreate(0,"buy trade"+time_to_place_trade,OBJ_ARROW_BUY,0,time_to_place_trade,iHigh(Symbol(),PERIOD_CURRENT,i-3));
  497. // // Print("trade placed buy at index ",i-3);
  498. // // }
  499. // Print(time_to_place_trade);
  500. //
  501. // }
  502. // if(signal == "sell")
  503. // {
  504. // Print("trade placed ");
  505. // ObjectCreate(0,"sell trade"+time_to_place_trade,OBJ_ARROW_SELL,0,time_to_place_trade,iLow(Symbol(),PERIOD_CURRENT,i-3));
  506. //
  507. // Print(ind);
  508. // Print(time_to_place_trade);
  509. // }
  510. // }
  511. // else
  512. // {
  513. // time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  514. // }
  515. break;
  516. default:
  517. current_time_frame_String = "Unknown";
  518. break;
  519. }
  520. //Print("Current Timeframe: ", current_time_frame_String);
  521. signal = "";
  522. }
  523. }
  524. }
  525. }
  526. //+------------------------------------------------------------------+
  527. //| |
  528. //+------------------------------------------------------------------+
  529. int OnInit()
  530. {
  531. object_find(object_name);
  532. if(object_find(object_name) == true)
  533. {
  534. datetime time_of_candle = (datetime)ObjectGetInteger(0,"line",OBJPROP_TIME,0);
  535. index = iBarShift(Symbol(), PERIOD_CURRENT, time_of_candle, false);
  536. checkCandle(index);
  537. if(checkCandle(index) == "Bullish")
  538. {
  539. trend = "uptrend";
  540. }
  541. if(checkCandle(index) == "Bearish")
  542. {
  543. trend = "downtrend";
  544. }
  545. high = iHigh(Symbol(),PERIOD_CURRENT,index);
  546. low = iLow(Symbol(),PERIOD_CURRENT,index);
  547. high_index = index;
  548. low_index = index;
  549. foo(index);
  550. }
  551. else
  552. {
  553. Print("Object Not Found");
  554. }
  555. return(INIT_SUCCEEDED);
  556. }
  557. //+------------------------------------------------------------------+
  558. //| Expert deinitialization function |
  559. //+------------------------------------------------------------------+
  560. void OnDeinit(const int reason)
  561. {
  562. //---
  563. }
  564. //+------------------------------------------------------------------+
  565. //| Expert tick function |
  566. //+------------------------------------------------------------------+
  567. void OnTick()
  568. {
  569. // for(int m=0; m < orderNum; m++)
  570. // {
  571. // if(od_1[m].choch_index != -1)
  572. // {
  573. // Print(" time to match the condition : ",TimeCurrent());
  574. //
  575. // if(TimeCurrent() > od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy")
  576. // {
  577. // Print("time to match the condition : ",TimeCurrent());
  578. //
  579. // //if(iHigh(Symbol(),PERIOD_CURRENT,od_1[m].reversal_index) > iLow(Symbol(),PERIOD_CURRENT,0) && iClose(Symbol(),PERIOD_CURRENT,od_1[m].choch_index) < iClose(Symbol(),PERIOD_CURRENT,0))
  580. // {
  581. // ObjectCreate(0,"buy trade"+TimeCurrent(),OBJ_ARROW_BUY,0,TimeCurrent(),iHigh(Symbol(),PERIOD_CURRENT,0));
  582. // Print("trade placed buy at index ",0);
  583. // od_1[m].choch_index = -1;
  584. //
  585. // }
  586. // Print(" time to take trade is ",od_1[m].Time_of_candle_For_trade);
  587. //
  588. //
  589. // }
  590. //
  591. // if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell")
  592. // {
  593. // Print(TimeCurrent());
  594. // //
  595. // // Print(" time to take trade is ",od_1[m].Time_of_candle_For_trade);
  596. // od_1[m].choch_index = -1;
  597. //
  598. // }
  599. // }
  600. // }
  601. }
  602. //+------------------------------------------------------------------+
  603. //| |
  604. //+------------------------------------------------------------------+
  605. bool NewBar()
  606. {
  607. static datetime Last_bar ;
  608. datetime Current_bar = iTime(Symbol(), PERIOD_CURRENT,0);
  609. if(Current_bar != Last_bar)
  610. {
  611. Last_bar = Current_bar;
  612. return (true);
  613. }
  614. else
  615. {
  616. return (false);
  617. }
  618. }
  619. //+------------------------------------------------------------------+
  620. //| |
  621. //+------------------------------------------------------------------+
  622. bool object_find(string obj) // to find object placed by user in the chart
  623. {
  624. if(ObjectFind(0,obj) >= 0)
  625. {
  626. return true;
  627. }
  628. return false;
  629. }
  630. //+------------------------------------------------------------------+
  631. //| |
  632. //+------------------------------------------------------------------+
  633. string checkCandle(int i) // to check the candle is bullish or bearish
  634. {
  635. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  636. double open = iOpen(Symbol(),PERIOD_CURRENT,i);
  637. if(close > open)
  638. {
  639. return "Bullish";
  640. }
  641. else
  642. if(close < open)
  643. {
  644. return "Bearish";
  645. }
  646. return "empty";
  647. }
  648. //+------------------------------------------------------------------+
  649. //+------------------------------------------------------------------+