Bez popisu

BOS_CHOCH.mq5 79KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290
  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. int EntryCon;
  20. tradeOrder()
  21. {
  22. choch_index_date_time = 0;
  23. Signal = "";
  24. reversal_index_date_time = 0;
  25. Time_OF_Candle = 0.0;
  26. Time_of_candle_For_trade = 0.0;
  27. EntryCon = 0.0;
  28. }
  29. };
  30. tradeOrder od_1[orderNum];
  31. bool entry_condition_candle_1_met = false;
  32. enum entryCondition
  33. {
  34. one, // Entry A1
  35. two, // Entry A2
  36. };
  37. input entryCondition Entry_condition_1 = one; // Entry Condition
  38. sinput string str = "<><><><><><> Set Object Name <><><><><><>";
  39. input string object_name = "line";
  40. sinput string str1 = "<><><><><><> Set time of vertical line <><><><><><>";
  41. input datetime inpTime = 0;//First Line Draw time
  42. sinput string str2 = "<><><><><><> Default Settings <><><><><><>";
  43. input double lot_size = 0.1;
  44. input double stoploss = 20;
  45. input double takeProfit = 20;
  46. input int magic_no = 123;
  47. string trend = " ";
  48. string signal = "";
  49. datetime reversal_bar_time = 0;
  50. datetime choch_index_time ;
  51. datetime index_of_low_time;
  52. datetime index_of_high_time;
  53. datetime store_last_bos_index_time;
  54. datetime time_of_candle = 0.0;
  55. datetime time_to_place_trade = 0.0;
  56. datetime high_index_time;
  57. datetime low_index_time;
  58. double hi;
  59. double lo;
  60. double high,low,low1,high1,low2,high2;
  61. double HIGH;
  62. double LOW;
  63. bool bearish_found = false;
  64. bool bullish_found = false;
  65. bool choch_at_index = false;
  66. int choch_index = 0;
  67. int reversal_candle_index = 0;
  68. int ind = 0;
  69. int index_of_last_high = 0;
  70. int index_of_last_low = 0;
  71. int index_of_low = 0;
  72. int index_of_high = 0;
  73. int high_index=0;
  74. int low_index =0;
  75. int Store_bos_last_index = 0;
  76. int index = 0;
  77. //+------------------------------------------------------------------+
  78. //| Expert initialization function |
  79. //+------------------------------------------------------------------+
  80. void Bos(int i)
  81. {
  82. int save_bullish_index = 0;
  83. int save_bearish_index = 0;
  84. if(trend == "uptrend")
  85. {
  86. high1 = iHigh(Symbol(),PERIOD_CURRENT,i);
  87. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  88. if(close > high)
  89. {
  90. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  91. for(int j=high_index-1; j > i; j--)
  92. {
  93. if(checkCandle(j) == "Bearish")
  94. {
  95. save_bullish_index = j;
  96. if(object_find("high") > 0)
  97. {
  98. ObjectDelete(0,"high");
  99. }
  100. high = high1;
  101. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  102. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  103. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  104. ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high+40*Point());
  105. ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  106. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  107. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  108. //low = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  109. low = iLow(Symbol(),PERIOD_CURRENT,j);
  110. bearish_found = true;
  111. index_of_low_time = iTime(Symbol(),PERIOD_CURRENT,j);
  112. break;
  113. }
  114. }
  115. if(bearish_found == true)
  116. {
  117. for(int k=save_bullish_index; k > i ; k--)
  118. {
  119. low1 = iLow(Symbol(),PERIOD_CURRENT,k);
  120. if(low1 < low)
  121. {
  122. low = low1;
  123. index_of_low_time = iTime(Symbol(),PERIOD_CURRENT,k);
  124. bearish_found = false;
  125. }
  126. }
  127. if(object_find("low") > 0)
  128. {
  129. if(ObjectDelete(0,"low"))
  130. {
  131. //Print("object deleted :");
  132. }
  133. }
  134. index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, index_of_low_time, false);
  135. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  136. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  137. ObjectSetInteger(0,"low",OBJPROP_RAY_LEFT,false);
  138. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  139. }
  140. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  141. }
  142. }
  143. if(trend == "downtrend")
  144. {
  145. low1 = iLow(Symbol(),PERIOD_CURRENT,i);
  146. double close1 = iClose(Symbol(),PERIOD_CURRENT,i);
  147. if(close1 < low)
  148. {
  149. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  150. for(int j=low_index - 1; j > i; j--)
  151. {
  152. if(checkCandle(j) == "Bullish")
  153. {
  154. save_bullish_index = j;
  155. if(object_find("low") > 0)
  156. {
  157. ObjectDelete(0,"low");
  158. }
  159. low = low1;
  160. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  161. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  162. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  163. ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low);
  164. ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  165. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  166. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  167. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  168. high = iHigh(Symbol(),PERIOD_CURRENT,j);
  169. bullish_found = true;
  170. index_of_high_time = iTime(Symbol(),PERIOD_CURRENT,j);
  171. break;
  172. }
  173. }
  174. if(bullish_found == true)
  175. {
  176. for(int k=save_bullish_index; k > i ; k--)
  177. {
  178. high1 = iHigh(Symbol(),PERIOD_CURRENT,k);
  179. if(high1 > high)
  180. {
  181. high = high1;
  182. index_of_high_time = iTime(Symbol(),PERIOD_CURRENT,k);
  183. bullish_found = false;
  184. }
  185. }
  186. if(object_find("high") > 0)
  187. {
  188. ObjectDelete(0,"high");
  189. }
  190. index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, index_of_high_time, false);
  191. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  192. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  193. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  194. bullish_found = false;
  195. }
  196. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  197. }
  198. }
  199. }
  200. //+------------------------------------------------------------------+
  201. //| |
  202. //+------------------------------------------------------------------+
  203. void Entry_Action_1_down(int Store_bos_last_index, int i,int diff)
  204. {
  205. //Print("bullish found at index ",j);
  206. ind = Store_bos_last_index +1; // reversal candle index
  207. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,ind);
  208. Print("condition satisfied in downtrend buy trade : ",check_values_less_than_choch_high(ind,i));
  209. if(check_values_less_than_choch_high(ind,i) == true)
  210. {
  211. if(iOpen(Symbol(),PERIOD_CURRENT,ind) > iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) < iClose(Symbol(),PERIOD_CURRENT,i))
  212. {
  213. signal = "buy";
  214. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  215. // Print("Place buy order -----------------------------------------------------------------------: ");
  216. }
  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. }
  228. //+------------------------------------------------------------------+
  229. //| |
  230. //+------------------------------------------------------------------+
  231. void Entry_Action_2_down(int Store_bos_last_index, int i,int diff)
  232. {
  233. ind = Store_bos_last_index +1; // reversal candle index
  234. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,ind);
  235. Print("condition satisfied in downtrend buy trade : ",check_values_less_than_choch_high1(ind,i));
  236. if(check_values_less_than_choch_high(ind,i) == true)
  237. {
  238. if(iOpen(Symbol(),PERIOD_CURRENT,ind) > iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) < iClose(Symbol(),PERIOD_CURRENT,i))
  239. {
  240. signal = "buy";
  241. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  242. // Print("Place buy order -----------------------------------------------------------------------: ");
  243. }
  244. }
  245. 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));
  246. 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));
  247. ObjectSetInteger(0,"line14"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  248. ObjectSetInteger(0,"line15"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  249. 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));
  250. 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));
  251. ObjectSetInteger(0,"line16"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  252. ObjectSetInteger(0,"line17"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  253. diff = 0;
  254. }
  255. //+------------------------------------------------------------------+
  256. //| |
  257. //+------------------------------------------------------------------+
  258. void Entry_Action_1_up(int Store_bos_last_index, int i,int diff)
  259. {
  260. ind = Store_bos_last_index +1; // reversal candle index
  261. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,ind);
  262. Print("condition satisfied in uptrend sell trade : ",check_values_less_than_choch_low(ind,i));
  263. if(check_values_less_than_choch_low(ind,i) == true)
  264. {
  265. if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i))
  266. {
  267. signal = "sell";
  268. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  269. // Print("Place sell order -----------------------------------------------------------------------: ");
  270. }
  271. }
  272. 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));
  273. 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));
  274. ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  275. ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  276. 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));
  277. 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));
  278. ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  279. ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  280. }
  281. //+------------------------------------------------------------------+
  282. //| |
  283. //+------------------------------------------------------------------+
  284. void Entry_Action_2_up(int Store_bos_last_index, int i,int diff)
  285. {
  286. ind = Store_bos_last_index +1; // reversal candle index
  287. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,ind);
  288. Print("condition satisfied in uptrend sell trade : ",check_values_less_than_choch_low(ind,i));
  289. if(check_values_less_than_choch_low1(ind,i) == true)
  290. {
  291. if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i))
  292. {
  293. signal = "sell";
  294. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  295. // Print("Place sell order -----------------------------------------------------------------------: ");
  296. }
  297. }
  298. 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));
  299. 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));
  300. ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  301. ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  302. 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));
  303. 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));
  304. ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  305. ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  306. }
  307. //+------------------------------------------------------------------+
  308. //| |
  309. //+------------------------------------------------------------------+
  310. bool check_values_less_than_choch_high(int ind,int i) // downtrend
  311. {
  312. for(int k=ind; k>i; k--)
  313. {
  314. if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i))
  315. {
  316. return false;
  317. }
  318. }
  319. return true;
  320. }
  321. //+------------------------------------------------------------------+
  322. //| |
  323. //+------------------------------------------------------------------+
  324. bool check_values_less_than_choch_high1(int ind,int i) // downtrend
  325. {
  326. for(int k=ind; k>i; k--)
  327. {
  328. if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i))
  329. {
  330. return false;
  331. }
  332. }
  333. return true;
  334. }
  335. //+------------------------------------------------------------------+
  336. //| |
  337. //+------------------------------------------------------------------+
  338. bool check_values_less_than_choch_low(int ind,int i) // uptrend
  339. {
  340. for(int k=ind; k>i; k--)
  341. {
  342. if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i))
  343. {
  344. return false;
  345. }
  346. }
  347. return true;
  348. }
  349. //+------------------------------------------------------------------+
  350. //| |
  351. //+------------------------------------------------------------------+
  352. bool check_values_less_than_choch_low1(int ind,int i) // uptrend
  353. {
  354. for(int k=ind; k>i; k--)
  355. {
  356. if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i))
  357. {
  358. return false;
  359. }
  360. }
  361. return true;
  362. }
  363. //+------------------------------------------------------------------+
  364. //| |
  365. //+------------------------------------------------------------------+
  366. void choch(int i)
  367. {
  368. int a = 0;
  369. HIGH = 0.0;
  370. LOW = 0.0;
  371. if(trend == "uptrend")
  372. {
  373. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  374. if(close < low)
  375. {
  376. remove_value_from_structure();
  377. choch_at_index = true;
  378. ObjectCreate(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  379. ObjectSetString(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  380. ObjectCreate(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_DOWN,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+100*Point());
  381. ObjectSetInteger(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrRed);
  382. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  383. int diff1 = Store_bos_last_index - (i);
  384. // condition on 1st candle
  385. Entry_Action_1_up(Store_bos_last_index,i,diff1);
  386. a=1;
  387. low = iLow(Symbol(),PERIOD_CURRENT,i);
  388. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  389. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  390. low_index = i;
  391. if(object_find("low") > 0)
  392. {
  393. ObjectDelete(0,"low");
  394. }
  395. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  396. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  397. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  398. trend = "downtrend";
  399. // choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  400. // -----------------------------------------------------------------------------------------------------------------------------------------------------------
  401. int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  402. chock_index++;
  403. HIGH = iHigh(Symbol(),PERIOD_CURRENT,chock_index); // save high and low of the chock prev index to compare
  404. LOW = iLow(Symbol(),PERIOD_CURRENT,chock_index);
  405. Print("from where you start ",chock_index);
  406. if(object_find("target line") > 0)
  407. {
  408. ObjectDelete(0,"target line");
  409. }
  410. 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));
  411. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  412. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  413. if(object_find("target line1") > 0)
  414. {
  415. ObjectDelete(0,"target line1");
  416. }
  417. 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));
  418. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  419. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  420. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  421. int chock_index1 = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  422. Print("from where you end ",chock_index1);
  423. bool condition_not_match = false;
  424. for(int p=chock_index +1 ; p >=chock_index1; p--)
  425. {
  426. if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
  427. {
  428. condition_not_match = true;
  429. }
  430. }
  431. if(condition_not_match == true)
  432. {
  433. HIGH = 0.0;
  434. LOW = 0.0;
  435. condition_not_match = false;
  436. if(object_find("target line") > 0)
  437. {
  438. ObjectDelete(0,"target line");
  439. }
  440. if(object_find("target line1") > 0)
  441. {
  442. ObjectDelete(0,"target line1");
  443. }
  444. }
  445. //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
  446. if(signal == "sell")
  447. {
  448. MqlDateTime edate;
  449. time_to_place_trade = 0.0;
  450. int current_time_frame = Period();
  451. string current_time_frame_string;
  452. switch(current_time_frame)
  453. {
  454. case PERIOD_M1:
  455. current_time_frame_string = "1 minute";
  456. if(TimeToStruct(time_of_candle,edate))
  457. {
  458. edate.hour = 0;
  459. edate.min = edate.min + 2;
  460. edate.sec = 0;
  461. }
  462. break;
  463. case PERIOD_M5:
  464. current_time_frame_string = "5 minutes";
  465. if(TimeToStruct(time_of_candle,edate))
  466. {
  467. edate.hour = 0;
  468. edate.min = edate.min + 10;
  469. edate.sec = 0;
  470. }
  471. break;
  472. case PERIOD_M15:
  473. current_time_frame_string = "15 minutes";
  474. if(TimeToStruct(time_of_candle,edate))
  475. {
  476. edate.hour = 0;
  477. edate.min = edate.min + 30;
  478. edate.sec = 0;
  479. }
  480. break;
  481. case PERIOD_M30:
  482. current_time_frame_string = "30 minutes";
  483. if(TimeToStruct(time_of_candle,edate))
  484. {
  485. edate.hour = 0;
  486. edate.min = edate.min + 60;
  487. edate.sec = 0;
  488. }
  489. break;
  490. case PERIOD_H1:
  491. current_time_frame_string = "1 hour";
  492. if(TimeToStruct(time_of_candle,edate))
  493. {
  494. edate.hour = edate.hour + 1;
  495. edate.min = 0;
  496. edate.sec = 0;
  497. }
  498. time_to_place_trade = StructToTime(edate);
  499. // Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0));
  500. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,1);
  501. //Print("choch_index_time ",choch_index_time);
  502. //Print("reversal_bar_time ",reversal_bar_time);
  503. //Print("time_of_candle",time_of_candle);
  504. //Print("time_to_place_trade",time_to_place_trade);
  505. //Print("signal is ",signal);
  506. break;
  507. default:
  508. current_time_frame_string = "unknown";
  509. break;
  510. }
  511. //signal = "";
  512. }
  513. signal = "";
  514. // condition on 2st candle
  515. Entry_Action_2_up(Store_bos_last_index,i,diff1);
  516. a=2;
  517. low = iLow(Symbol(),PERIOD_CURRENT,i);
  518. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  519. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  520. low_index = i;
  521. if(object_find("low") > 0)
  522. {
  523. ObjectDelete(0,"low");
  524. }
  525. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  526. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  527. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  528. trend = "downtrend";
  529. // choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  530. // -----------------------------------------------------------------------------------------------------------------------------------------------------------
  531. chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  532. chock_index++;
  533. HIGH = iHigh(Symbol(),PERIOD_CURRENT,chock_index); // save high and low of the chock prev index to compare
  534. LOW = iLow(Symbol(),PERIOD_CURRENT,chock_index);
  535. Print("from where you start ",chock_index);
  536. if(object_find("target line") > 0)
  537. {
  538. ObjectDelete(0,"target line");
  539. }
  540. 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));
  541. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  542. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  543. if(object_find("target line1") > 0)
  544. {
  545. ObjectDelete(0,"target line1");
  546. }
  547. 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));
  548. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  549. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  550. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  551. chock_index1 = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  552. Print("from where you end ",chock_index1);
  553. condition_not_match = false;
  554. for(int p=chock_index +1 ; p >=chock_index1; p--)
  555. {
  556. if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
  557. {
  558. condition_not_match = true;
  559. }
  560. }
  561. if(condition_not_match == true)
  562. {
  563. HIGH = 0.0;
  564. LOW = 0.0;
  565. condition_not_match = false;
  566. if(object_find("target line") > 0)
  567. {
  568. ObjectDelete(0,"target line");
  569. }
  570. if(object_find("target line1") > 0)
  571. {
  572. ObjectDelete(0,"target line1");
  573. }
  574. }
  575. //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
  576. if(signal == "sell")
  577. {
  578. MqlDateTime edate;
  579. time_to_place_trade = 0.0;
  580. int current_time_frame = Period();
  581. string current_time_frame_string;
  582. switch(current_time_frame)
  583. {
  584. case PERIOD_M1:
  585. current_time_frame_string = "1 minute";
  586. if(TimeToStruct(time_of_candle,edate))
  587. {
  588. edate.hour = 0;
  589. edate.min = edate.min + 2;
  590. edate.sec = 0;
  591. }
  592. break;
  593. case PERIOD_M5:
  594. current_time_frame_string = "5 minutes";
  595. if(TimeToStruct(time_of_candle,edate))
  596. {
  597. edate.hour = 0;
  598. edate.min = edate.min + 10;
  599. edate.sec = 0;
  600. }
  601. break;
  602. case PERIOD_M15:
  603. current_time_frame_string = "15 minutes";
  604. if(TimeToStruct(time_of_candle,edate))
  605. {
  606. edate.hour = 0;
  607. edate.min = edate.min + 30;
  608. edate.sec = 0;
  609. }
  610. break;
  611. case PERIOD_M30:
  612. current_time_frame_string = "30 minutes";
  613. if(TimeToStruct(time_of_candle,edate))
  614. {
  615. edate.hour = 0;
  616. edate.min = edate.min + 60;
  617. edate.sec = 0;
  618. }
  619. break;
  620. case PERIOD_H1:
  621. current_time_frame_string = "1 hour";
  622. if(TimeToStruct(time_of_candle,edate))
  623. {
  624. edate.hour = edate.hour + 2;
  625. edate.min = 0;
  626. edate.sec = 0;
  627. }
  628. time_to_place_trade = StructToTime(edate);
  629. Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0));
  630. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,2);
  631. //Print("choch_index_time ",choch_index_time);
  632. //Print("reversal_bar_time ",reversal_bar_time);
  633. //Print("time_of_candle",time_of_candle);
  634. //Print("time_to_place_trade",time_to_place_trade);
  635. //Print("signal is ",signal);
  636. break;
  637. default:
  638. current_time_frame_string = "unknown";
  639. break;
  640. }
  641. //signal = "";
  642. }
  643. signal = "";
  644. }
  645. }
  646. if(trend == "downtrend")
  647. {
  648. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  649. if(close > high)
  650. {
  651. remove_value_from_structure();
  652. choch_at_index = true;
  653. ObjectCreate(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+20*Point());
  654. ObjectSetString(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  655. ObjectCreate(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_UP,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)-100*Point());
  656. ObjectSetInteger(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrGreen);
  657. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  658. int diff = Store_bos_last_index - (i);
  659. Entry_Action_1_down(Store_bos_last_index,i,diff);
  660. a = 1;
  661. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  662. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  663. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  664. high_index = i;
  665. if(object_find("high") > 0)
  666. {
  667. ObjectDelete(0,"high");
  668. }
  669. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  670. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  671. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  672. trend = "uptrend";
  673. // choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  674. //--------------------------------------------------------------------------------------------------------------------------------------------------------------------
  675. int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  676. chock_index++;
  677. HIGH = iHigh(Symbol(),PERIOD_CURRENT,chock_index); // save high and low of the chock prev index to compare
  678. LOW = iLow(Symbol(),PERIOD_CURRENT,chock_index);
  679. Print("from where you start ",chock_index);
  680. if(object_find("target line") > 0)
  681. {
  682. ObjectDelete(0,"target line");
  683. }
  684. 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));
  685. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  686. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  687. if(object_find("target line1") > 0)
  688. {
  689. ObjectDelete(0,"target line1");
  690. }
  691. 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));
  692. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  693. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  694. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  695. int chock_index1 = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  696. Print("from where you end ",chock_index1);
  697. bool condition_not_match = false;
  698. for(int p=chock_index +1 ; p >=chock_index1; p--)
  699. {
  700. if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
  701. {
  702. condition_not_match = true;
  703. }
  704. }
  705. if(condition_not_match == true)
  706. {
  707. HIGH = 0.0;
  708. LOW = 0.0;
  709. condition_not_match = false;
  710. if(object_find("target line") > 0)
  711. {
  712. ObjectDelete(0,"target line");
  713. }
  714. if(object_find("target line1") > 0)
  715. {
  716. ObjectDelete(0,"target line1");
  717. }
  718. }
  719. //------------------------------------------------------------------------------------------------------------------------------------------------------------------
  720. if(signal == "buy")
  721. {
  722. MqlDateTime edate;
  723. time_to_place_trade = 0.0;
  724. int current_time_frame = Period();
  725. string current_time_frame_string;
  726. switch(current_time_frame)
  727. {
  728. case PERIOD_M1:
  729. current_time_frame_string = "1 minute";
  730. if(TimeToStruct(time_of_candle,edate))
  731. {
  732. edate.hour = 0;
  733. edate.min = edate.min + 2;
  734. edate.sec = 0;
  735. }
  736. break;
  737. case PERIOD_M5:
  738. current_time_frame_string = "5 minutes";
  739. if(TimeToStruct(time_of_candle,edate))
  740. {
  741. edate.hour = 0;
  742. edate.min = edate.min + 10;
  743. edate.sec = 0;
  744. }
  745. break;
  746. case PERIOD_M15:
  747. current_time_frame_string = "15 minutes";
  748. if(TimeToStruct(time_of_candle,edate))
  749. {
  750. edate.hour = 0;
  751. edate.min = edate.min + 30;
  752. edate.sec = 0;
  753. }
  754. break;
  755. case PERIOD_M30:
  756. current_time_frame_string = "30 minutes";
  757. if(TimeToStruct(time_of_candle,edate))
  758. {
  759. edate.hour = 0;
  760. edate.min = edate.min + 60;
  761. edate.sec = 0;
  762. }
  763. break;
  764. case PERIOD_H1:
  765. current_time_frame_string = "1 hour";
  766. if(TimeToStruct(time_of_candle,edate))
  767. {
  768. edate.hour = edate.hour + 1;
  769. edate.min = 0;
  770. edate.sec = 0;
  771. }
  772. time_to_place_trade = StructToTime(edate);
  773. Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0));
  774. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,1);
  775. //Print("choch_index_time ",choch_index_time);
  776. //Print("reversal_bar_time ",reversal_bar_time);
  777. //Print("time_of_candle",time_of_candle);
  778. //Print("time_to_place_trade",time_to_place_trade);
  779. //Print("signal is ",signal);
  780. break;
  781. default:
  782. current_time_frame_string = "unknown";
  783. break;
  784. }
  785. }
  786. signal = "";
  787. Entry_Action_2_down(Store_bos_last_index,i,diff);
  788. a = 2;
  789. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  790. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  791. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  792. high_index = i;
  793. if(object_find("high") > 0)
  794. {
  795. ObjectDelete(0,"high");
  796. }
  797. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  798. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  799. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  800. trend = "uptrend";
  801. // choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  802. //--------------------------------------------------------------------------------------------------------------------------------------------------------------------
  803. chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  804. chock_index++;
  805. HIGH = iHigh(Symbol(),PERIOD_CURRENT,chock_index); // save high and low of the chock prev index to compare
  806. LOW = iLow(Symbol(),PERIOD_CURRENT,chock_index);
  807. Print("from where you start ",chock_index);
  808. if(object_find("target line") > 0)
  809. {
  810. ObjectDelete(0,"target line");
  811. }
  812. 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));
  813. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  814. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  815. if(object_find("target line1") > 0)
  816. {
  817. ObjectDelete(0,"target line1");
  818. }
  819. 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));
  820. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  821. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  822. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  823. chock_index1 = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  824. Print("from where you end ",chock_index1);
  825. condition_not_match = false;
  826. for(int p=chock_index +1 ; p >=chock_index1; p--)
  827. {
  828. if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
  829. {
  830. condition_not_match = true;
  831. }
  832. }
  833. if(condition_not_match == true)
  834. {
  835. HIGH = 0.0;
  836. LOW = 0.0;
  837. condition_not_match = false;
  838. if(object_find("target line") > 0)
  839. {
  840. ObjectDelete(0,"target line");
  841. }
  842. if(object_find("target line1") > 0)
  843. {
  844. ObjectDelete(0,"target line1");
  845. }
  846. }
  847. //------------------------------------------------------------------------------------------------------------------------------------------------------------------
  848. if(signal == "buy")
  849. {
  850. MqlDateTime edate;
  851. time_to_place_trade = 0.0;
  852. int current_time_frame = Period();
  853. string current_time_frame_string;
  854. switch(current_time_frame)
  855. {
  856. case PERIOD_M1:
  857. current_time_frame_string = "1 minute";
  858. if(TimeToStruct(time_of_candle,edate))
  859. {
  860. edate.hour = 0;
  861. edate.min = edate.min + 2;
  862. edate.sec = 0;
  863. }
  864. break;
  865. case PERIOD_M5:
  866. current_time_frame_string = "5 minutes";
  867. if(TimeToStruct(time_of_candle,edate))
  868. {
  869. edate.hour = 0;
  870. edate.min = edate.min + 10;
  871. edate.sec = 0;
  872. }
  873. break;
  874. case PERIOD_M15:
  875. current_time_frame_string = "15 minutes";
  876. if(TimeToStruct(time_of_candle,edate))
  877. {
  878. edate.hour = 0;
  879. edate.min = edate.min + 30;
  880. edate.sec = 0;
  881. }
  882. break;
  883. case PERIOD_M30:
  884. current_time_frame_string = "30 minutes";
  885. if(TimeToStruct(time_of_candle,edate))
  886. {
  887. edate.hour = 0;
  888. edate.min = edate.min + 60;
  889. edate.sec = 0;
  890. }
  891. break;
  892. case PERIOD_H1:
  893. current_time_frame_string = "1 hour";
  894. if(TimeToStruct(time_of_candle,edate))
  895. {
  896. edate.hour = edate.hour + 2;
  897. edate.min = 0;
  898. edate.sec = 0;
  899. }
  900. time_to_place_trade = StructToTime(edate);
  901. Print("Time: ",iTime(Symbol(),PERIOD_CURRENT,0));
  902. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,2);
  903. //Print("choch_index_time ",choch_index_time);
  904. //Print("reversal_bar_time ",reversal_bar_time);
  905. //Print("time_of_candle",time_of_candle);
  906. //Print("time_to_place_trade",time_to_place_trade);
  907. //Print("signal is ",signal);
  908. break;
  909. default:
  910. current_time_frame_string = "unknown";
  911. break;
  912. }
  913. }
  914. signal = "";
  915. }
  916. }
  917. }
  918. //+------------------------------------------------------------------+
  919. //| |
  920. //+------------------------------------------------------------------+
  921. void bos2(int i)
  922. {
  923. bool cnd;
  924. bool candle_bullish = false;
  925. bool candle_bearish = false;
  926. double find_high = 0.0;
  927. datetime find_high_time = 0.0;
  928. int save_bullish_index = 0;
  929. int save_bearish_index = 0;
  930. double find_low = 0.0;
  931. datetime find_low_time = 0.0;
  932. if(trend == "downtrend")
  933. {
  934. choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  935. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  936. if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index)
  937. {
  938. cnd = false;
  939. }
  940. else
  941. {
  942. cnd = true;
  943. }
  944. if(choch_index_time > store_last_bos_index_time)
  945. {
  946. for(int m=choch_index; m>i; m--)
  947. {
  948. if(checkCandle(m) == "Bullish")
  949. {
  950. save_bullish_index = m;
  951. candle_bullish = true;
  952. break;
  953. }
  954. }
  955. find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index);
  956. for(int m=save_bullish_index; m>i; m--)
  957. {
  958. double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m);
  959. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  960. if(find_high < find_high1)
  961. {
  962. find_high = find_high1;
  963. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  964. }
  965. }
  966. for(int j=choch_index; j>=i; j--)
  967. {
  968. if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i))
  969. {
  970. cnd = false;
  971. }
  972. }
  973. }
  974. if(choch_index_time < store_last_bos_index_time)
  975. {
  976. for(int m=Store_bos_last_index; m>i; m--)
  977. {
  978. if(checkCandle(m) == "Bullish")
  979. {
  980. save_bullish_index = m;
  981. candle_bullish = true;
  982. break;
  983. }
  984. }
  985. find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index);
  986. for(int m=save_bullish_index; m>i; m--)
  987. {
  988. double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m);
  989. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  990. if(find_high < find_high1)
  991. {
  992. find_high = find_high1;
  993. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  994. }
  995. }
  996. for(int j=Store_bos_last_index; j>=i; j--)
  997. {
  998. if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i))
  999. {
  1000. cnd = false;
  1001. }
  1002. }
  1003. }
  1004. if(cnd == true && candle_bullish == true)
  1005. {
  1006. if(object_find("high") > 0)
  1007. {
  1008. ObjectDelete(0,"high");
  1009. }
  1010. high = find_high;
  1011. index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, find_high_time, false);
  1012. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1013. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1014. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1015. if(object_find("low") > 0)
  1016. {
  1017. ObjectDelete(0,"low");
  1018. }
  1019. low = iLow(Symbol(),PERIOD_CURRENT,i);
  1020. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1021. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1022. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1023. ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low);
  1024. ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  1025. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1026. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  1027. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1028. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1029. cnd = false;
  1030. candle_bullish = false;
  1031. }
  1032. }
  1033. //-------
  1034. if(trend == "uptrend")
  1035. {
  1036. choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  1037. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  1038. if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index)
  1039. {
  1040. cnd = false;
  1041. }
  1042. else
  1043. {
  1044. cnd = true;
  1045. }
  1046. if(choch_index_time < store_last_bos_index_time)
  1047. {
  1048. for(int m=Store_bos_last_index; m>i; m--)
  1049. {
  1050. if(checkCandle(m) == "Bearish")
  1051. {
  1052. candle_bearish = true;
  1053. save_bearish_index = m;
  1054. break;
  1055. }
  1056. }
  1057. find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index);
  1058. for(int m=save_bearish_index; m>i; m--)
  1059. {
  1060. double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m);
  1061. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  1062. if(find_low > find_low1)
  1063. {
  1064. find_low = find_low1;
  1065. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  1066. }
  1067. }
  1068. for(int j=Store_bos_last_index; j>=i; j--)
  1069. {
  1070. if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i))
  1071. {
  1072. cnd = false;
  1073. }
  1074. }
  1075. }
  1076. if(choch_index_time > store_last_bos_index_time)
  1077. {
  1078. for(int m=choch_index; m>i; m--)
  1079. {
  1080. if(checkCandle(m) == "Bearish")
  1081. {
  1082. candle_bearish = true;
  1083. save_bearish_index = m;
  1084. break;
  1085. }
  1086. }
  1087. find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index);
  1088. for(int m=save_bearish_index; m>i; m--)
  1089. {
  1090. double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m);
  1091. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  1092. // find_low = find_low1; // here is the addition
  1093. if(find_low > find_low1)
  1094. {
  1095. find_low = find_low1;
  1096. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  1097. }
  1098. }
  1099. for(int j=choch_index; j>=i; j--)
  1100. {
  1101. if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i))
  1102. {
  1103. cnd = false;
  1104. }
  1105. }
  1106. }
  1107. if(cnd == true && candle_bearish == true)
  1108. {
  1109. if(object_find("low") > 0)
  1110. {
  1111. ObjectDelete(0,"low");
  1112. }
  1113. low = find_low;
  1114. index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, find_low_time, false);
  1115. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1116. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1117. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1118. if(object_find("high") > 0)
  1119. {
  1120. ObjectDelete(0,"high");
  1121. }
  1122. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  1123. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1124. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1125. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1126. ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high+40*Point());
  1127. ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  1128. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1129. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  1130. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1131. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  1132. cnd = false;
  1133. candle_bearish = false;
  1134. }
  1135. }
  1136. }
  1137. //+------------------------------------------------------------------+
  1138. //| |
  1139. //+------------------------------------------------------------------+
  1140. //+------------------------------------------------------------------+
  1141. //| |
  1142. //+------------------------------------------------------------------+
  1143. void third_Condition(int i)
  1144. {
  1145. if(trend == "uptrend")
  1146. {
  1147. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  1148. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  1149. if(low2 < low)
  1150. {
  1151. ObjectCreate(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  1152. ObjectSetString(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1153. low = low2;
  1154. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1155. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1156. low_index = i; // addtion to be minus
  1157. if(object_find("low") > 0)
  1158. {
  1159. ObjectDelete(0,"low");
  1160. }
  1161. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1162. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1163. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1164. // Print("low update due to third condition",low," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i));
  1165. }
  1166. if(high2 > high)
  1167. {
  1168. ObjectCreate(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  1169. ObjectSetString(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1170. high = high2;
  1171. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1172. high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1173. high_index = i; // addtion to be minus
  1174. if(object_find("high") > 0)
  1175. {
  1176. ObjectDelete(0,"high");
  1177. }
  1178. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1179. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1180. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1181. // Print("high update due to third condition",high," time of the candle is ",iTime(Symbol(),PERIOD_CURRENT,i));
  1182. }
  1183. }
  1184. if(trend == "downtrend")
  1185. {
  1186. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  1187. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  1188. if(high2 > high)
  1189. {
  1190. ObjectCreate(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  1191. ObjectSetString(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1192. high = high2;
  1193. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1194. high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1195. high_index = i; // addtion to be minus
  1196. if(object_find("high") > 0)
  1197. {
  1198. ObjectDelete(0,"high");
  1199. }
  1200. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1201. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1202. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1203. // Print("high update due to third condition",high);
  1204. }
  1205. if(low2 < low)
  1206. {
  1207. ObjectCreate(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  1208. ObjectSetString(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1209. low = low2;
  1210. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1211. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1212. low_index = i; // addtion to be minus
  1213. if(object_find("low") > 0)
  1214. {
  1215. ObjectDelete(0,"low");
  1216. }
  1217. // Print("low value is ", low);
  1218. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1219. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1220. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1221. // Print("low update due to third condition",low);
  1222. }
  1223. }
  1224. }
  1225. //+------------------------------------------------------------------+
  1226. //| |
  1227. //+------------------------------------------------------------------+
  1228. void store_value_in_structure(datetime chock_time,datetime ind,string signal,datetime time_of_candle,datetime time_to_place_trade, int entry)
  1229. {
  1230. for(int l=0; l<200; l++)
  1231. {
  1232. if(od_1[l].choch_index_date_time == 0)
  1233. {
  1234. od_1[l].choch_index_date_time = chock_time;
  1235. od_1[l].reversal_index_date_time = ind;
  1236. od_1[l].Signal = signal;
  1237. od_1[l].Time_OF_Candle = time_of_candle;
  1238. // Print("saved time in the structure ",time_of_candle);
  1239. od_1[l].Time_of_candle_For_trade = time_to_place_trade;
  1240. // Print("saved time in the structure ",time_to_place_trade);
  1241. od_1[l].EntryCon = entry;
  1242. break;
  1243. }
  1244. }
  1245. }
  1246. //+------------------------------------------------------------------+
  1247. //| |
  1248. //+------------------------------------------------------------------+
  1249. void remove_value_from_structure()
  1250. {
  1251. for(int l=0; l<200; l++)
  1252. {
  1253. if(od_1[l].choch_index_date_time != 0)
  1254. {
  1255. // Print("value removed from structure ");
  1256. od_1[l].choch_index_date_time = 0;
  1257. od_1[l].reversal_index_date_time = 0;
  1258. od_1[l].Signal = "";
  1259. od_1[l].Time_OF_Candle = 0;
  1260. od_1[l].Time_of_candle_For_trade = 0;
  1261. }
  1262. }
  1263. }
  1264. //+------------------------------------------------------------------+
  1265. //| |
  1266. //+------------------------------------------------------------------+
  1267. void Entry_strategy(int value)
  1268. {
  1269. for(int i=value; i > 0; i--)
  1270. {
  1271. Bos(i);
  1272. bos2(i);
  1273. choch(i);
  1274. third_Condition(i);
  1275. }
  1276. }
  1277. //+------------------------------------------------------------------+
  1278. //| |
  1279. //+------------------------------------------------------------------+
  1280. void placeBuyTrade()
  1281. {
  1282. double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
  1283. openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  1284. double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  1285. if(stoploss != 0)
  1286. {
  1287. buySL = Ask - (stoploss *10* Point());
  1288. }
  1289. if(takeProfit != 0)
  1290. {
  1291. buyTp = Ask + (takeProfit *10* Point());
  1292. }
  1293. if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,lot_size,Ask,buySL,buyTp,"Buy Trade Placed"))
  1294. {
  1295. Print("Buy Trade Placed: ",trade.ResultOrder());
  1296. }
  1297. else
  1298. {
  1299. Print("Error in placing Buy: "+Symbol()+" ",GetLastError());
  1300. }
  1301. }
  1302. //+------------------------------------------------------------------+
  1303. //| |
  1304. //+------------------------------------------------------------------+
  1305. void placeSellTrade()
  1306. {
  1307. double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
  1308. openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
  1309. double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);
  1310. if(stoploss != 0)
  1311. {
  1312. sell_SL = Bid + (stoploss *10* Point());
  1313. }
  1314. if(takeProfit != 0)
  1315. {
  1316. sell_Tp = Bid - (takeProfit *10* Point());
  1317. }
  1318. if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,lot_size,Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
  1319. {
  1320. Print("Sell Trade PLaced: ",trade.ResultOrder());
  1321. }
  1322. else
  1323. {
  1324. Print("Error in placing Sell: "+Symbol()+" ",GetLastError());
  1325. }
  1326. }
  1327. //+------------------------------------------------------------------+
  1328. //| |
  1329. //+------------------------------------------------------------------+
  1330. int OnInit()
  1331. {
  1332. trade.SetExpertMagicNumber(magic_no);
  1333. trade.SetDeviationInPoints(10);
  1334. trade.SetTypeFilling(ORDER_FILLING_IOC);
  1335. trade.LogLevel(LOG_LEVEL_ALL);
  1336. trade.SetAsyncMode(false);
  1337. int idx = 0;
  1338. //int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
  1339. //if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
  1340. // {
  1341. // Print("vertical line created on chart : ");
  1342. // }
  1343. //else
  1344. // {
  1345. // Print("error in creating line : ");
  1346. // }
  1347. int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false);
  1348. if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
  1349. {
  1350. Print("object created on chart : ");
  1351. }
  1352. else
  1353. {
  1354. Print("object not created : ");
  1355. }
  1356. object_find(object_name);
  1357. if(object_find(object_name) == true)
  1358. {
  1359. Print("object found");
  1360. if(checkCandle(user_input_index) == "Bullish")
  1361. {
  1362. trend = "uptrend";
  1363. high = iHigh(Symbol(),PERIOD_CURRENT,user_input_index);
  1364. high_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index); // ambiguity
  1365. high_index = user_input_index;
  1366. for(int j=user_input_index; j < 1000; j++)
  1367. {
  1368. if(checkCandle(j) == "Bearish")
  1369. {
  1370. low = iLow(Symbol(),PERIOD_CURRENT,j);
  1371. idx = j;
  1372. break;
  1373. }
  1374. }
  1375. idx = iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,idx,user_input_index+1);
  1376. low = iLow(Symbol(),PERIOD_CURRENT,idx);
  1377. low_index_time = iTime(Symbol(),PERIOD_CURRENT,idx);
  1378. low_index = idx;
  1379. }
  1380. if(checkCandle(user_input_index) == "Bearish")
  1381. {
  1382. trend = "downtrend";
  1383. low = iLow(Symbol(),PERIOD_CURRENT,user_input_index);
  1384. low_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index);
  1385. low_index = user_input_index;
  1386. for(int j=user_input_index; j < 1000; j++)
  1387. {
  1388. if(checkCandle(j) == "Bullish")
  1389. {
  1390. high = iHigh(Symbol(),PERIOD_CURRENT,j);
  1391. idx = j;
  1392. break;
  1393. }
  1394. }
  1395. for(int k=idx; k<user_input_index; k++)
  1396. {
  1397. double highh = iHigh(Symbol(),PERIOD_CURRENT,k);
  1398. if(highh > high)
  1399. {
  1400. high = highh;
  1401. high_index_time = iTime(Symbol(),PERIOD_CURRENT,k);
  1402. high_index = k;
  1403. }
  1404. }
  1405. }
  1406. Entry_strategy(user_input_index);
  1407. }
  1408. else
  1409. {
  1410. Print("Object Not Found");
  1411. }
  1412. return(INIT_SUCCEEDED);
  1413. }
  1414. //+------------------------------------------------------------------+
  1415. //| |
  1416. //+------------------------------------------------------------------+
  1417. bool value_close_low(int chockIndex)
  1418. {
  1419. for(int i=chockIndex; i>1; i--)
  1420. {
  1421. if(iLow(Symbol(),PERIOD_CURRENT,i) < iClose(Symbol(),PERIOD_CURRENT,1))
  1422. {
  1423. return false;
  1424. }
  1425. }
  1426. return true;
  1427. }
  1428. //+------------------------------------------------------------------+
  1429. //| |
  1430. //+------------------------------------------------------------------+
  1431. bool value_close_high(int chockIndex)
  1432. {
  1433. for(int i=chockIndex; i>1; i--)
  1434. {
  1435. if(iHigh(Symbol(),PERIOD_CURRENT,i) > iClose(Symbol(),PERIOD_CURRENT,1))
  1436. {
  1437. return false;
  1438. }
  1439. }
  1440. return true;
  1441. }
  1442. //+------------------------------------------------------------------+
  1443. //| Expert deinitialization function |
  1444. //+------------------------------------------------------------------+
  1445. void OnDeinit(const int reason)
  1446. {
  1447. //---
  1448. }
  1449. //+------------------------------------------------------------------+
  1450. //| Expert tick function |
  1451. //+------------------------------------------------------------------+
  1452. void OnTick()
  1453. {
  1454. if(NewBar() == true)
  1455. {
  1456. Entry_strategy(1);
  1457. // for entry condition candel 1
  1458. for(int m=0; m < orderNum; m++)
  1459. {
  1460. if(od_1[m].choch_index_date_time != 0)
  1461. {
  1462. //Print("current time is ",TimeCurrent());
  1463. //Print("time is ",od_1[m].Time_of_candle_For_trade);
  1464. //Print("signal is ",od_1[m].Signal);
  1465. if(od_1[m].EntryCon == 1 && iTime(Symbol(),PERIOD_CURRENT,1) == od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy" && od_1[m].Time_of_candle_For_trade != 0 /*&& HIGH != 0 && LOW != 0*/)
  1466. {
  1467. // Print("time is greater and signal is buy ",TimeCurrent());
  1468. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1469. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1470. // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1471. // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1472. //
  1473. // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1474. // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1475. // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1476. // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1477. double reversalMax = iOpen(Symbol(),PERIOD_CURRENT,reversal_indexx) < iClose(Symbol(),PERIOD_CURRENT,reversal_indexx) ? iClose(Symbol(),PERIOD_CURRENT,reversal_indexx) : iOpen(Symbol(),PERIOD_CURRENT,reversal_indexx);
  1478. if(reversalMax > iLow(Symbol(),PERIOD_CURRENT,1)
  1479. && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1))
  1480. {
  1481. Print("<<<<<<<<<<<< Entry 1 >>>>>>>>>");
  1482. placeBuyTrade();
  1483. remove_value_from_structure();
  1484. od_1[m].choch_index_date_time = 0;
  1485. od_1[m].Signal == "";
  1486. od_1[m].reversal_index_date_time = 0;
  1487. od_1[m].choch_index_date_time = 0;
  1488. signal = "";
  1489. Print("buy trade placed -------------------------------------------------------------");
  1490. Print("time at which trade is placed : ",TimeCurrent());
  1491. }
  1492. }
  1493. if(od_1[m].EntryCon == 1 && iTime(Symbol(),PERIOD_CURRENT,1) == od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell" && od_1[m].Time_of_candle_For_trade != 0 /*&& HIGH != 0 && LOW != 0*/)
  1494. {
  1495. Print("i am in enrtry condition 1 : ");
  1496. // Print("time is greater and signal is sell ",TimeCurrent());
  1497. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1498. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1499. // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1500. // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1501. //
  1502. // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1503. // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1504. // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1505. // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1506. double reversalMin = iOpen(Symbol(),PERIOD_CURRENT,reversal_indexx) > iClose(Symbol(),PERIOD_CURRENT,reversal_indexx) ? iClose(Symbol(),PERIOD_CURRENT,reversal_indexx) : iOpen(Symbol(),PERIOD_CURRENT,reversal_indexx);
  1507. if(reversalMin < iHigh(Symbol(),PERIOD_CURRENT,1)
  1508. && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1))
  1509. {
  1510. placeSellTrade();
  1511. remove_value_from_structure();
  1512. od_1[m].choch_index_date_time = 0;
  1513. od_1[m].Signal == "";
  1514. od_1[m].reversal_index_date_time = 0;
  1515. od_1[m].choch_index_date_time = 0;
  1516. signal = "";
  1517. Print("sell trade placed -------------------------------------------------------------");
  1518. Print("time at which trade is placed : ",TimeCurrent());
  1519. }
  1520. }
  1521. // second condition match
  1522. if(od_1[m].EntryCon == 2 && TimeCurrent() > od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy" && od_1[m].Time_of_candle_For_trade != 0 /*&& HIGH != 0 && LOW != 0*/)
  1523. {
  1524. // Print("time is greater and signal is buy ",TimeCurrent());
  1525. Print("i am in enrtry condition 1 : ");
  1526. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1527. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1528. // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1529. // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1530. //
  1531. // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1532. // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1533. // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1534. // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1535. if(value_close_high(close_index) == true)
  1536. {
  1537. if(iClose(Symbol(),PERIOD_CURRENT,close_index) > iLow(Symbol(),PERIOD_CURRENT,1)
  1538. && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1))
  1539. {
  1540. Print("<<<<<<<<<<<< Entry 2 >>>>>>>>>");
  1541. placeBuyTrade();
  1542. remove_value_from_structure();
  1543. od_1[m].choch_index_date_time = 0;
  1544. od_1[m].Signal == "";
  1545. od_1[m].reversal_index_date_time = 0;
  1546. od_1[m].choch_index_date_time = 0;
  1547. signal = "";
  1548. Print("buy trade placed -------------------------------------------------------------");
  1549. Print("time at which trade is placed : ",TimeCurrent());
  1550. }
  1551. }
  1552. }
  1553. if(od_1[m].EntryCon == 2 && TimeCurrent() > od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell" && od_1[m].Time_of_candle_For_trade != 0 /*&& HIGH != 0 && LOW != 0*/)
  1554. {
  1555. // Print("time is greater and signal is sell ",TimeCurrent());
  1556. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1557. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1558. // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1559. // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1560. //
  1561. // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1562. // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1563. // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1564. // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1565. if(value_close_low(close_index) == true)
  1566. {
  1567. if(iClose(Symbol(),PERIOD_CURRENT,close_index) < iHigh(Symbol(),PERIOD_CURRENT,1)
  1568. && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1))
  1569. {
  1570. placeSellTrade();
  1571. remove_value_from_structure();
  1572. od_1[m].choch_index_date_time = 0;
  1573. od_1[m].Signal == "";
  1574. od_1[m].reversal_index_date_time = 0;
  1575. od_1[m].choch_index_date_time = 0;
  1576. signal = "";
  1577. Print("sell trade placed -------------------------------------------------------------");
  1578. Print("time at which trade is placed : ",TimeCurrent());
  1579. }
  1580. }
  1581. }
  1582. }
  1583. }
  1584. // for(int m=0; m < orderNum; m++)
  1585. // {
  1586. // if(od_1[m].choch_index_date_time != 0)
  1587. // {
  1588. //
  1589. // //Print("current time is ",TimeCurrent());
  1590. // //Print("time is ",od_1[m].Time_of_candle_For_trade);
  1591. // //Print("signal is ",od_1[m].Signal);
  1592. //
  1593. //
  1594. // if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy" && od_1[m].Time_of_candle_For_trade != 0)
  1595. // {
  1596. // // Print("time is greater and signal is buy ",TimeCurrent());
  1597. //
  1598. // int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1599. // int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1600. //
  1601. // // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1602. // // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1603. // //
  1604. // // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1605. // // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1606. // // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1607. // // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1608. //
  1609. // if(iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx) > iLow(Symbol(),PERIOD_CURRENT,1)
  1610. // && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1))
  1611. // {
  1612. // placeBuyTrade();
  1613. // remove_value_from_structure();
  1614. // od_1[m].choch_index_date_time = 0;
  1615. // od_1[m].Signal == "";
  1616. // od_1[m].reversal_index_date_time = 0;
  1617. // od_1[m].choch_index_date_time = 0;
  1618. //
  1619. // signal = "";
  1620. // Print("buy trade placed -------------------------------------------------------------");
  1621. // Print("time at which trade is placed : ",TimeCurrent());
  1622. //
  1623. // }
  1624. //
  1625. //
  1626. // }
  1627. //
  1628. // if(TimeCurrent() >= od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell" && od_1[m].Time_of_candle_For_trade != 0)
  1629. // {
  1630. //
  1631. // // Print("time is greater and signal is sell ",TimeCurrent());
  1632. //
  1633. // int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1634. // int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1635. //
  1636. // // Print("reversal_index_date_time ",od_1[m].reversal_index_date_time);
  1637. // // Print("choch_index_date_time ",od_1[m].choch_index_date_time);
  1638. // //
  1639. // // Print(" high is ",iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx));
  1640. // // Print("low of current candle ",iLow(Symbol(),PERIOD_CURRENT,0));
  1641. // // Print("close of chock is ",iClose(Symbol(),PERIOD_CURRENT,close_index));
  1642. // // Print("close of current candle is ",iClose(Symbol(),PERIOD_CURRENT,0));
  1643. //
  1644. // if(iHigh(Symbol(),PERIOD_CURRENT,reversal_indexx) < iLow(Symbol(),PERIOD_CURRENT,1)
  1645. // && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1))
  1646. // {
  1647. // placeSellTrade();
  1648. // remove_value_from_structure();
  1649. // od_1[m].choch_index_date_time = 0;
  1650. // od_1[m].Signal == "";
  1651. // od_1[m].reversal_index_date_time = 0;
  1652. // od_1[m].choch_index_date_time = 0;
  1653. // signal = "";
  1654. // Print("sell trade placed -------------------------------------------------------------");
  1655. // Print("time at which trade is placed : ",TimeCurrent());
  1656. //
  1657. // }
  1658. //
  1659. // }
  1660. // }
  1661. // }
  1662. }
  1663. }
  1664. //+------------------------------------------------------------------+
  1665. //| |
  1666. //+------------------------------------------------------------------+
  1667. bool NewBar()
  1668. {
  1669. static datetime Last_bar ;
  1670. datetime Current_bar = iTime(Symbol(), PERIOD_CURRENT,0);
  1671. if(Current_bar != Last_bar)
  1672. {
  1673. Last_bar = Current_bar;
  1674. return (true);
  1675. }
  1676. else
  1677. {
  1678. return (false);
  1679. }
  1680. }
  1681. //+------------------------------------------------------------------+
  1682. //| |
  1683. //+------------------------------------------------------------------+
  1684. bool object_find(string obj) // to find object placed by user in the chart
  1685. {
  1686. if(ObjectFind(0,obj) >= 0)
  1687. {
  1688. return true;
  1689. }
  1690. return false;
  1691. }
  1692. //+------------------------------------------------------------------+
  1693. //| |
  1694. //+------------------------------------------------------------------+
  1695. string checkCandle(int v) // to check the candle is bullish or bearish
  1696. {
  1697. double close = iClose(Symbol(),PERIOD_CURRENT,v);
  1698. double open = iOpen(Symbol(),PERIOD_CURRENT,v);
  1699. if(close > open)
  1700. {
  1701. return "Bullish";
  1702. }
  1703. else
  1704. if(close < open)
  1705. {
  1706. return "Bearish";
  1707. }
  1708. return "empty";
  1709. }
  1710. //+------------------------------------------------------------------+
  1711. //+------------------------------------------------------------------+
  1712. //+------------------------------------------------------------------+