Нема описа

BOS_CHOCH.mq5 75KB

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