Keine Beschreibung

BOS_CHOCH.mq5 32KB

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