Sin descripción

BOS_CHOCH.mq5 75KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135
  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+2; 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+2; 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. ObjectDelete(0,"target line");
  357. }
  358. if(object_find("target line1") > 0)
  359. {
  360. ObjectDelete(0,"target line1");
  361. }
  362. }
  363. }
  364. if(checkCandle(j) == "Bullish" && checkCandle(j-1) == "Bullish")
  365. {
  366. if(iHigh(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,j-1) && iLow(Symbol(),PERIOD_CURRENT,j) < iOpen(Symbol(),PERIOD_CURRENT,j-1))
  367. {
  368. tp_date_time_sell = 0.0;
  369. tp_date_time_buy = 0.0;
  370. Print("Target line deleted due to in bar ");
  371. if(object_find("target line") > 0)
  372. {
  373. ObjectDelete(0,"target line");
  374. }
  375. if(object_find("target line1") > 0)
  376. {
  377. ObjectDelete(0,"target line1");
  378. }
  379. }
  380. }
  381. }
  382. }
  383. //+------------------------------------------------------------------+
  384. //| |
  385. //+------------------------------------------------------------------+
  386. void Entry_Action_1_up(int Store_bos_last_index, int i,int diff)
  387. {
  388. ind = Store_bos_last_index +1; // reversal candle index
  389. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,ind);
  390. bool addtional_condition = true;
  391. for(int j=Store_bos_last_index-1; j>i+2; j--)
  392. {
  393. if(checkCandle(j) == "Bearish" && checkCandle(j-1) == "Bearish")
  394. {
  395. if(iHigh(Symbol(),PERIOD_CURRENT,j) > iOpen(Symbol(),PERIOD_CURRENT,j-1) && iLow(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,j-1))
  396. {
  397. tp_date_time_sell = 0.0;
  398. Print("Target line deleted due to in bar ");
  399. if(object_find("target line") > 0)
  400. {
  401. ObjectDelete(0,"target line");
  402. }
  403. if(object_find("target line1") > 0)
  404. {
  405. ObjectDelete(0,"target line1");
  406. }
  407. addtional_condition = false;
  408. }
  409. }
  410. if(checkCandle(j) == "Bullish" && checkCandle(j-1) == "Bullish")
  411. {
  412. if(iHigh(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,j-1) && iLow(Symbol(),PERIOD_CURRENT,j) < iOpen(Symbol(),PERIOD_CURRENT,j-1))
  413. {
  414. tp_date_time_sell = 0.0;
  415. Print("Target line deleted due to in bar ");
  416. if(object_find("target line") > 0)
  417. {
  418. ObjectDelete(0,"target line");
  419. }
  420. if(object_find("target line1") > 0)
  421. {
  422. ObjectDelete(0,"target line1");
  423. }
  424. addtional_condition = false;
  425. }
  426. }
  427. }
  428. // Print("condition satisfied in uptrend sell trade : ",check_values_less_than_choch_low(ind,i));
  429. if(check_values_less_than_choch_low(ind,i) == true && addtional_condition == true)
  430. {
  431. if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i))
  432. {
  433. signal = "sell";
  434. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  435. // Print("Place sell order -----------------------------------------------------------------------: ");
  436. }
  437. }
  438. 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));
  439. 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));
  440. ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  441. ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  442. 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));
  443. 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));
  444. ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  445. ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  446. }
  447. //+------------------------------------------------------------------+
  448. //| |
  449. //+------------------------------------------------------------------+
  450. void Entry_Action_2_up(int Store_bos_last_index, int i,int diff)
  451. {
  452. ind = Store_bos_last_index +1; // reversal candle index
  453. reversal_bar_time = iTime(Symbol(),PERIOD_CURRENT,ind);
  454. bool addtional_condition = true;
  455. for(int j=Store_bos_last_index-1; j>i+2; j--)
  456. {
  457. if(checkCandle(j) == "Bearish" && checkCandle(j-1) == "Bearish")
  458. {
  459. if(iHigh(Symbol(),PERIOD_CURRENT,j) > iOpen(Symbol(),PERIOD_CURRENT,j-1) && iLow(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,j-1))
  460. {
  461. tp_date_time_sell = 0.0;
  462. Print("Target line deleted due to in bar ");
  463. if(object_find("target line") > 0)
  464. {
  465. ObjectDelete(0,"target line");
  466. }
  467. if(object_find("target line1") > 0)
  468. {
  469. ObjectDelete(0,"target line1");
  470. }
  471. addtional_condition = false;
  472. }
  473. }
  474. if(checkCandle(j) == "Bullish" && checkCandle(j-1) == "Bullish")
  475. {
  476. if(iHigh(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,j-1) && iLow(Symbol(),PERIOD_CURRENT,j) < iOpen(Symbol(),PERIOD_CURRENT,j-1))
  477. {
  478. tp_date_time_sell = 0.0;
  479. Print("Target line deleted due to in bar ");
  480. if(object_find("target line") > 0)
  481. {
  482. ObjectDelete(0,"target line");
  483. }
  484. if(object_find("target line1") > 0)
  485. {
  486. ObjectDelete(0,"target line1");
  487. }
  488. addtional_condition = false;
  489. }
  490. }
  491. }
  492. if(check_values_less_than_choch_low(ind,i) == true && addtional_condition == true)
  493. {
  494. if(iOpen(Symbol(),PERIOD_CURRENT,ind) < iOpen(Symbol(),PERIOD_CURRENT,i) && iClose(Symbol(),PERIOD_CURRENT,ind) > iClose(Symbol(),PERIOD_CURRENT,i))
  495. {
  496. signal = "sell";
  497. time_of_candle = iTime(Symbol(),PERIOD_CURRENT,i);
  498. }
  499. }
  500. 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));
  501. 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));
  502. ObjectSetInteger(0,"line10"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  503. ObjectSetInteger(0,"line11"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_COLOR,clrBlue);
  504. 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));
  505. 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));
  506. ObjectSetInteger(0,"line12"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  507. ObjectSetInteger(0,"line13"+iTime(Symbol(),PERIOD_CURRENT,ind),OBJPROP_STYLE,STYLE_DOT);
  508. }
  509. //+------------------------------------------------------------------+
  510. //| |
  511. //+------------------------------------------------------------------+
  512. bool check_values_less_than_choch_high(int ind,int i) // downtrend
  513. {
  514. for(int k=ind; k>i; k--)
  515. {
  516. if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i))
  517. {
  518. return false;
  519. }
  520. }
  521. return true;
  522. }
  523. //+------------------------------------------------------------------+
  524. //| |
  525. //+------------------------------------------------------------------+
  526. bool check_values_less_than_choch_high1(int ind,int i) // downtrend
  527. {
  528. for(int k=ind; k>i; k--)
  529. {
  530. if(iHigh(Symbol(),PERIOD_CURRENT,k) > iClose(Symbol(),PERIOD_CURRENT,i))
  531. {
  532. return false;
  533. }
  534. }
  535. return true;
  536. }
  537. //+------------------------------------------------------------------+
  538. //| |
  539. //+------------------------------------------------------------------+
  540. bool check_values_less_than_choch_low(int ind,int i) // uptrend
  541. {
  542. for(int k=ind; k>i; k--)
  543. {
  544. if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i))
  545. {
  546. return false;
  547. }
  548. }
  549. return true;
  550. }
  551. //+------------------------------------------------------------------+
  552. //| |
  553. //+------------------------------------------------------------------+
  554. bool check_values_less_than_choch_low1(int ind,int i) // uptrend
  555. {
  556. for(int k=ind; k>i; k--)
  557. {
  558. if(iLow(Symbol(),PERIOD_CURRENT,k) < iClose(Symbol(),PERIOD_CURRENT,i))
  559. {
  560. return false;
  561. }
  562. }
  563. return true;
  564. }
  565. //+------------------------------------------------------------------+
  566. //| |
  567. //+------------------------------------------------------------------+
  568. void choch(int i)
  569. {
  570. HIGH = 0.0;
  571. LOW = 0.0;
  572. if(trend == "uptrend")
  573. {
  574. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  575. if(close < low)
  576. {
  577. remove_value_from_structure();
  578. choch_at_index = true;
  579. ObjectCreate(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  580. ObjectSetString(0,"line3"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  581. ObjectCreate(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_DOWN,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+100*Point());
  582. ObjectSetInteger(0,"line8"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrRed);
  583. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  584. int diff1 = Store_bos_last_index - (i);
  585. // condition on 1st candle
  586. if(Entry_condition_one_Enable)
  587. {
  588. Entry_Action_1_up(Store_bos_last_index,i,diff1);
  589. }
  590. low = iLow(Symbol(),PERIOD_CURRENT,i);
  591. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  592. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  593. low_index = i;
  594. if(object_find("low") > 0)
  595. {
  596. ObjectDelete(0,"low");
  597. }
  598. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  599. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  600. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  601. trend = "downtrend";
  602. // choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  603. // -----------------------------------------------------------------------------------------------------------------------------------------------------------
  604. int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  605. chock_index++;
  606. datetime lastChochTimeUp = iTime(Symbol(),PERIOD_CURRENT,chock_index);
  607. HIGH = iHigh(Symbol(),PERIOD_CURRENT,chock_index); // save high and low of the chock prev index to compare
  608. LOW = iLow(Symbol(),PERIOD_CURRENT,chock_index);
  609. if(object_find("target line") > 0)
  610. {
  611. ObjectDelete(0,"target line");
  612. }
  613. 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)));
  614. {
  615. //Print("object created from uptrend to downtrend ");
  616. }
  617. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  618. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  619. if(object_find("target line1") > 0)
  620. {
  621. ObjectDelete(0,"target line1");
  622. }
  623. 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));
  624. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  625. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  626. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  627. int chock_index1 = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  628. bool condition_not_match = false;
  629. for(int p=chock_index - 2 ; p > chock_index1; p--)
  630. {
  631. if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
  632. {
  633. condition_not_match = true;
  634. }
  635. }
  636. if(condition_not_match == true)
  637. {
  638. HIGH = 0.0;
  639. LOW = 0.0;
  640. tp_date_time_sell = 0.0;
  641. Print("Target line deleted in choch");
  642. condition_not_match = false;
  643. if(object_find("target line") > 0)
  644. {
  645. ObjectDelete(0,"target line");
  646. }
  647. if(object_find("target line1") > 0)
  648. {
  649. ObjectDelete(0,"target line1");
  650. }
  651. }
  652. else
  653. {
  654. tp_date_time_sell = lastChochTimeUp;
  655. }
  656. //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
  657. if(signal == "sell")
  658. {
  659. time_to_place_trade = 0.0;
  660. int current_time_frame = Period();
  661. string current_time_frame_string;
  662. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,1);
  663. }
  664. signal = "";
  665. // condition on 2st candle
  666. if(Entry_condition_two_Enable)
  667. {
  668. Entry_Action_2_up(Store_bos_last_index,i,diff1);
  669. }
  670. low = iLow(Symbol(),PERIOD_CURRENT,i);
  671. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  672. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  673. low_index = i;
  674. if(object_find("low") > 0)
  675. {
  676. ObjectDelete(0,"low");
  677. }
  678. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  679. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  680. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  681. trend = "downtrend";
  682. if(signal == "sell")
  683. {
  684. time_to_place_trade = 0.0;
  685. int current_time_frame = Period();
  686. string current_time_frame_string;
  687. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,2);
  688. }
  689. signal = "";
  690. }
  691. }
  692. if(trend == "downtrend")
  693. {
  694. double close = iClose(Symbol(),PERIOD_CURRENT,i);
  695. if(close > high)
  696. {
  697. remove_value_from_structure();
  698. choch_at_index = true;
  699. ObjectCreate(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i)+60*Point());
  700. ObjectSetString(0,"line4"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"choch");
  701. ObjectCreate(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_ARROW_UP,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i)-100*Point());
  702. ObjectSetInteger(0,"line7"+iTime(Symbol(),PERIOD_CURRENT,i),OBJPROP_COLOR,clrGreen);
  703. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  704. int diff = Store_bos_last_index - (i);
  705. if(Entry_condition_one_Enable)
  706. {
  707. Entry_Action_1_down(Store_bos_last_index,i,diff);
  708. }
  709. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  710. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  711. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  712. high_index = i;
  713. if(object_find("high") > 0)
  714. {
  715. ObjectDelete(0,"high");
  716. }
  717. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  718. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  719. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  720. trend = "uptrend";
  721. // choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  722. //--------------------------------------------------------------------------------------------------------------------------------------------------------------------
  723. int chock_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  724. chock_index++;
  725. datetime t = iTime(Symbol(),PERIOD_CURRENT,chock_index);
  726. HIGH = iHigh(Symbol(),PERIOD_CURRENT,chock_index); // save high and low of the chock prev index to compare
  727. LOW = iLow(Symbol(),PERIOD_CURRENT,chock_index);
  728. if(object_find("target line") > 0)
  729. {
  730. ObjectDelete(0,"target line");
  731. }
  732. 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)));
  733. {
  734. //Print("object created from downtrend to uptrend ");
  735. }
  736. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  737. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  738. if(object_find("target line1") > 0)
  739. {
  740. ObjectDelete(0,"target line1");
  741. }
  742. 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));
  743. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  744. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  745. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  746. int chock_index1 = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  747. bool condition_not_match = false;
  748. for(int p=chock_index - 2 ; p > chock_index1; p--)
  749. {
  750. if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
  751. {
  752. condition_not_match = true;
  753. }
  754. }
  755. if(condition_not_match == true)
  756. {
  757. Print("line target deleted :");
  758. HIGH = 0.0;
  759. LOW = 0.0;
  760. tp_date_time_buy = 0.0;
  761. condition_not_match = false;
  762. if(object_find("target line") > 0)
  763. {
  764. ObjectDelete(0,"target line");
  765. }
  766. if(object_find("target line1") > 0)
  767. {
  768. ObjectDelete(0,"target line1");
  769. }
  770. }
  771. else
  772. {
  773. tp_date_time_buy = t;
  774. }
  775. if(signal == "buy")
  776. {
  777. time_to_place_trade = 0.0;
  778. int current_time_frame = Period();
  779. string current_time_frame_string;
  780. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,1);
  781. }
  782. signal = "";
  783. if(Entry_condition_two_Enable)
  784. {
  785. Entry_Action_2_down(Store_bos_last_index,i,diff);
  786. }
  787. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  788. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  789. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  790. high_index = i;
  791. if(object_find("high") > 0)
  792. {
  793. ObjectDelete(0,"high");
  794. }
  795. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  796. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  797. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  798. trend = "uptrend";
  799. if(signal == "buy")
  800. {
  801. time_to_place_trade = 0.0;
  802. int current_time_frame = Period();
  803. string current_time_frame_string;
  804. store_value_in_structure(choch_index_time,reversal_bar_time,signal,time_of_candle,time_to_place_trade,2);
  805. }
  806. signal = "";
  807. }
  808. }
  809. }
  810. //+------------------------------------------------------------------+
  811. //| |
  812. //+------------------------------------------------------------------+
  813. void bos2(int i)
  814. {
  815. bool cnd;
  816. bool candle_bullish = false;
  817. bool candle_bearish = false;
  818. double find_high = 0.0;
  819. datetime find_high_time = 0.0;
  820. int save_bullish_index = 0;
  821. int save_bearish_index = 0;
  822. double find_low = 0.0;
  823. datetime find_low_time = 0.0;
  824. if(trend == "downtrend")
  825. {
  826. choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  827. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  828. if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index)
  829. {
  830. cnd = false;
  831. }
  832. else
  833. {
  834. cnd = true;
  835. }
  836. if(choch_index_time > store_last_bos_index_time)
  837. {
  838. for(int m=choch_index; m>i; m--)
  839. {
  840. if(checkCandle(m) == "Bullish")
  841. {
  842. save_bullish_index = m;
  843. candle_bullish = true;
  844. break;
  845. }
  846. }
  847. find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index);
  848. find_high_time = iTime(Symbol(),PERIOD_CURRENT,save_bullish_index); // here is the addition
  849. for(int m=save_bullish_index; m>i; m--)
  850. {
  851. double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m);
  852. // find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  853. if(find_high < find_high1)
  854. {
  855. find_high = find_high1;
  856. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  857. }
  858. }
  859. for(int j=choch_index; j>=i; j--)
  860. {
  861. if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i))
  862. {
  863. cnd = false;
  864. }
  865. }
  866. }
  867. if(choch_index_time < store_last_bos_index_time)
  868. {
  869. for(int m=Store_bos_last_index; m>i; m--)
  870. {
  871. if(checkCandle(m) == "Bullish")
  872. {
  873. save_bullish_index = m;
  874. candle_bullish = true;
  875. break;
  876. }
  877. }
  878. find_high = iHigh(Symbol(),PERIOD_CURRENT,save_bullish_index);
  879. find_high_time = iTime(Symbol(),PERIOD_CURRENT,save_bullish_index); // here is the addition
  880. for(int m=save_bullish_index; m>i; m--)
  881. {
  882. double find_high1 = iHigh(Symbol(),PERIOD_CURRENT,m);
  883. // find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  884. if(find_high < find_high1)
  885. {
  886. find_high = find_high1;
  887. find_high_time = iTime(Symbol(),PERIOD_CURRENT,m);
  888. }
  889. }
  890. for(int j=Store_bos_last_index; j>=i; j--)
  891. {
  892. if(iClose(Symbol(),PERIOD_CURRENT,j) < iClose(Symbol(),PERIOD_CURRENT,i) || iLow(Symbol(),PERIOD_CURRENT,j) < iLow(Symbol(),PERIOD_CURRENT,i))
  893. {
  894. cnd = false;
  895. }
  896. }
  897. }
  898. if(cnd == true && candle_bullish == true)
  899. {
  900. if(object_find("high") > 0)
  901. {
  902. ObjectDelete(0,"high");
  903. }
  904. high = find_high;
  905. high_index_time = find_high_time; // here is the addition
  906. index_of_high = iBarShift(Symbol(), PERIOD_CURRENT, find_high_time, false);
  907. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_high),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  908. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  909. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  910. if(object_find("low") > 0)
  911. {
  912. ObjectDelete(0,"low");
  913. }
  914. low = iLow(Symbol(),PERIOD_CURRENT,i);
  915. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  916. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  917. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  918. ObjectCreate(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),low);
  919. ObjectSetString(0,"line2"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  920. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  921. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  922. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  923. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  924. cnd = false;
  925. candle_bullish = false;
  926. }
  927. }
  928. //-------
  929. if(trend == "uptrend")
  930. {
  931. choch_index = iBarShift(Symbol(), PERIOD_CURRENT, choch_index_time, false);
  932. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  933. if(i+1 == choch_index || i+1 == Store_bos_last_index || i == choch_index || i == Store_bos_last_index)
  934. {
  935. cnd = false;
  936. }
  937. else
  938. {
  939. cnd = true;
  940. }
  941. if(choch_index_time < store_last_bos_index_time)
  942. {
  943. for(int m=Store_bos_last_index; m>i; m--)
  944. {
  945. if(checkCandle(m) == "Bearish")
  946. {
  947. candle_bearish = true;
  948. save_bearish_index = m;
  949. break;
  950. }
  951. }
  952. find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index);
  953. find_low_time = iTime(Symbol(),PERIOD_CURRENT,save_bearish_index); // here is the addition
  954. for(int m=save_bearish_index; m>i; m--)
  955. {
  956. double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m);
  957. //find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  958. if(find_low > find_low1)
  959. {
  960. find_low = find_low1;
  961. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  962. }
  963. }
  964. for(int j=Store_bos_last_index; j>=i; j--)
  965. {
  966. if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i))
  967. {
  968. cnd = false;
  969. }
  970. }
  971. }
  972. if(choch_index_time > store_last_bos_index_time)
  973. {
  974. for(int m=choch_index; m>i; m--)
  975. {
  976. if(checkCandle(m) == "Bearish")
  977. {
  978. candle_bearish = true;
  979. save_bearish_index = m;
  980. break;
  981. }
  982. }
  983. find_low = iLow(Symbol(),PERIOD_CURRENT,save_bearish_index);
  984. find_low_time = iTime(Symbol(),PERIOD_CURRENT,save_bearish_index); // here is the addition
  985. for(int m=save_bearish_index; m>i; m--)
  986. {
  987. double find_low1 = iLow(Symbol(),PERIOD_CURRENT,m);
  988. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  989. // find_low = find_low1; // here is the addition
  990. if(find_low > find_low1)
  991. {
  992. find_low = find_low1;
  993. find_low_time = iTime(Symbol(),PERIOD_CURRENT,m);
  994. }
  995. }
  996. for(int j=choch_index; j>=i; j--)
  997. {
  998. if(iClose(Symbol(),PERIOD_CURRENT,j) > iClose(Symbol(),PERIOD_CURRENT,i) || iHigh(Symbol(),PERIOD_CURRENT,j) > iHigh(Symbol(),PERIOD_CURRENT,i))
  999. {
  1000. cnd = false;
  1001. }
  1002. }
  1003. }
  1004. if(cnd == true && candle_bearish == true)
  1005. {
  1006. if(object_find("low") > 0)
  1007. {
  1008. ObjectDelete(0,"low");
  1009. }
  1010. low = find_low;
  1011. low_index_time = find_low_time; // here is the addition
  1012. index_of_low = iBarShift(Symbol(), PERIOD_CURRENT, find_low_time, false);
  1013. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,index_of_low),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1014. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1015. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1016. if(object_find("high") > 0)
  1017. {
  1018. ObjectDelete(0,"high");
  1019. }
  1020. high = iHigh(Symbol(),PERIOD_CURRENT,i);
  1021. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1022. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1023. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1024. ObjectCreate(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),high+40*Point());
  1025. ObjectSetString(0,"line1"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"bos");
  1026. store_last_bos_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1027. Store_bos_last_index = iBarShift(Symbol(), PERIOD_CURRENT, store_last_bos_index_time, false);
  1028. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1029. high_index = iBarShift(Symbol(), PERIOD_CURRENT, high_index_time, false);
  1030. cnd = false;
  1031. candle_bearish = false;
  1032. }
  1033. }
  1034. }
  1035. //+------------------------------------------------------------------+
  1036. //| |
  1037. //+------------------------------------------------------------------+
  1038. void third_Condition(int i)
  1039. {
  1040. if(trend == "uptrend")
  1041. {
  1042. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  1043. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  1044. if(low2 < low)
  1045. {
  1046. //ObjectCreate(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  1047. // ObjectSetString(0,"line5"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1048. low = low2;
  1049. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1050. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1051. low_index = i; // addtion to be minus
  1052. if(object_find("low") > 0)
  1053. {
  1054. ObjectDelete(0,"low");
  1055. }
  1056. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1057. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1058. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1059. }
  1060. if(high2 > high)
  1061. {
  1062. // ObjectCreate(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  1063. // ObjectSetString(0,"line51"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1064. high = high2;
  1065. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1066. high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1067. high_index = i; // addtion to be minus
  1068. if(object_find("high") > 0)
  1069. {
  1070. ObjectDelete(0,"high");
  1071. }
  1072. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1073. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1074. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1075. }
  1076. }
  1077. if(trend == "downtrend")
  1078. {
  1079. high2 = iHigh(Symbol(),PERIOD_CURRENT,i);
  1080. low2 = iLow(Symbol(),PERIOD_CURRENT,i);
  1081. if(high2 > high)
  1082. {
  1083. // ObjectCreate(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iHigh(Symbol(),PERIOD_CURRENT,i));
  1084. // ObjectSetString(0,"line6"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1085. high = high2;
  1086. high_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1087. high_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1088. high_index = i; // addtion to be minus
  1089. if(object_find("high") > 0)
  1090. {
  1091. ObjectDelete(0,"high");
  1092. }
  1093. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1094. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1095. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1096. }
  1097. if(low2 < low)
  1098. {
  1099. // ObjectCreate(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i),OBJ_TEXT,0,iTime(Symbol(),PERIOD_CURRENT,i),iLow(Symbol(),PERIOD_CURRENT,i));
  1100. // ObjectSetString(0,"line61"+iTime(Symbol(),PERIOD_CURRENT,i), OBJPROP_TEXT,"3_C");
  1101. low = low2;
  1102. low_index_time = iTime(Symbol(),PERIOD_CURRENT,i);
  1103. low_index = iBarShift(Symbol(), PERIOD_CURRENT, low_index_time, false);
  1104. low_index = i; // addtion to be minus
  1105. if(object_find("low") > 0)
  1106. {
  1107. ObjectDelete(0,"low");
  1108. }
  1109. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,i),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1110. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1111. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1112. }
  1113. }
  1114. }
  1115. //+------------------------------------------------------------------+
  1116. //| |
  1117. //+------------------------------------------------------------------+
  1118. void store_value_in_structure(datetime chock_time,datetime ind,string signal,datetime time_of_candle,datetime time_to_place_trade, int entry)
  1119. {
  1120. for(int l=0; l<200; l++)
  1121. {
  1122. if(od_1[l].choch_index_date_time == 0)
  1123. {
  1124. od_1[l].choch_index_date_time = chock_time;
  1125. od_1[l].reversal_index_date_time = ind;
  1126. od_1[l].Signal = signal;
  1127. od_1[l].Time_OF_Candle = time_of_candle;
  1128. od_1[l].Time_of_candle_For_trade = time_to_place_trade;
  1129. od_1[l].EntryCon = entry;
  1130. Print("added value of chock in structure ---------------",od_1[l].choch_index_date_time);
  1131. break;
  1132. }
  1133. }
  1134. }
  1135. //+------------------------------------------------------------------+
  1136. //| |
  1137. //+------------------------------------------------------------------+
  1138. void remove_value_from_structure()
  1139. {
  1140. for(int l=0; l<200; l++)
  1141. {
  1142. if(od_1[l].choch_index_date_time != 0)
  1143. {
  1144. Print("chock value removed from structure and chock time is ---------- ",od_1[l].choch_index_date_time);
  1145. od_1[l].choch_index_date_time = 0;
  1146. od_1[l].reversal_index_date_time = 0;
  1147. od_1[l].Signal = "";
  1148. od_1[l].Time_OF_Candle = 0;
  1149. od_1[l].Time_of_candle_For_trade = 0;
  1150. }
  1151. }
  1152. }
  1153. //+------------------------------------------------------------------+
  1154. //| |
  1155. //+------------------------------------------------------------------+
  1156. void Entry_strategy(int value)
  1157. {
  1158. for(int i=value; i > 0; i--)
  1159. {
  1160. Bos(i);
  1161. bos2(i);
  1162. choch(i);
  1163. third_Condition(i);
  1164. }
  1165. }
  1166. //+------------------------------------------------------------------+
  1167. //| |
  1168. //+------------------------------------------------------------------+
  1169. void placeBuyTrade()
  1170. {
  1171. double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
  1172. openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  1173. double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  1174. int ch = iBarShift(Symbol(), PERIOD_CURRENT,choch_index_time,false); // get high of chock index
  1175. buySL = iLow(Symbol(),PERIOD_CURRENT,ch) - stoploss *10 * Point();
  1176. int tp = iBarShift(Symbol(), PERIOD_CURRENT,tp_date_time_buy,false);
  1177. buyTp = iLow(Symbol(),PERIOD_CURRENT,tp);
  1178. double distance = (Ask - buySL)/Point();
  1179. if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,getlot(distance),Ask,buySL,buyTp,"Buy Trade Placed"))
  1180. {
  1181. Print("Buy Trade Placed: ",trade.ResultOrder());
  1182. }
  1183. else
  1184. {
  1185. Print("Error in placing Buy: "+Symbol()+" ",GetLastError());
  1186. }
  1187. }
  1188. //+------------------------------------------------------------------+
  1189. //| |
  1190. //+------------------------------------------------------------------+
  1191. double getlot(double stop_loss)
  1192. {
  1193. Print("Tick Value: ",SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE));
  1194. Print("Tick Size: ",SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE));
  1195. double modeTickV=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE),modeTickS=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
  1196. double pipvalue = NormalizeDouble(((SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)/Point()))*10),2);
  1197. pipvalue = pipvalue / 10;
  1198. double lotSize = lot_size;
  1199. if(lot_calculator==rsk) //calculating risk
  1200. {
  1201. double riskamount=(risk/100)*AccountInfoDouble(ACCOUNT_BALANCE);
  1202. double pipvalue_required=riskamount/stop_loss;
  1203. lotSize = pipvalue_required/pipvalue;
  1204. int roundDigit=0;
  1205. double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  1206. while(step<1)
  1207. {
  1208. roundDigit++;
  1209. step=step*10;
  1210. }
  1211. Print("Round Digits:",roundDigit);
  1212. lotSize = NormalizeDouble(lotSize,roundDigit);
  1213. //
  1214. }
  1215. Print("Lot Size: ",lotSize);
  1216. if(lotSize > SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX))
  1217. {
  1218. lotSize=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  1219. }
  1220. else
  1221. if(lotSize<SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN))
  1222. {
  1223. lotSize=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  1224. }
  1225. return lotSize;
  1226. }
  1227. //+------------------------------------------------------------------+
  1228. //| |
  1229. //+------------------------------------------------------------------+
  1230. void placeSellTrade()
  1231. {
  1232. double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
  1233. openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
  1234. double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);
  1235. int ch = iBarShift(Symbol(), PERIOD_CURRENT,choch_index_time,false); // get high of chock index
  1236. sell_SL = iHigh(Symbol(),PERIOD_CURRENT,ch) + stoploss *10 * Point();
  1237. int tp = iBarShift(Symbol(), PERIOD_CURRENT,tp_date_time_sell,false);
  1238. sell_Tp = iHigh(Symbol(),PERIOD_CURRENT,tp);
  1239. double distance = (sell_SL - Bid)/Point();
  1240. if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,getlot(distance),Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
  1241. {
  1242. Print("Sell Trade PLaced: ",trade.ResultOrder());
  1243. }
  1244. else
  1245. {
  1246. Print("Error in placing Sell: "+Symbol()+" ",GetLastError());
  1247. }
  1248. }
  1249. //+------------------------------------------------------------------+
  1250. //| |
  1251. //+------------------------------------------------------------------+
  1252. int OnInit()
  1253. {
  1254. trade.SetExpertMagicNumber(magic_no);
  1255. trade.SetDeviationInPoints(10);
  1256. trade.SetTypeFilling(ORDER_FILLING_IOC);
  1257. trade.LogLevel(LOG_LEVEL_ALL);
  1258. trade.SetAsyncMode(false);
  1259. int idx = 0;
  1260. int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
  1261. if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
  1262. {
  1263. Print("vertical line created on chart : ");
  1264. }
  1265. else
  1266. {
  1267. Print("error in creating line : ");
  1268. }
  1269. //int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2021.09.01 15:30:27', false);
  1270. //if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2021.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
  1271. // {
  1272. // Print("object created on chart : ");
  1273. // }
  1274. //else
  1275. // {
  1276. // Print("object not created : ");
  1277. // }
  1278. object_find(object_name);
  1279. if(object_find(object_name) == true)
  1280. {
  1281. Print("object found");
  1282. if(checkCandle(user_input_index) == "Bullish")
  1283. {
  1284. trend = "uptrend";
  1285. high = iHigh(Symbol(),PERIOD_CURRENT,user_input_index);
  1286. high_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index); // ambiguity
  1287. high_index = user_input_index;
  1288. for(int j=user_input_index; j < 1000; j++)
  1289. {
  1290. if(checkCandle(j) == "Bearish")
  1291. {
  1292. low = iLow(Symbol(),PERIOD_CURRENT,j);
  1293. idx = j;
  1294. break;
  1295. }
  1296. }
  1297. idx = iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,idx,user_input_index+1);
  1298. low = iLow(Symbol(),PERIOD_CURRENT,idx);
  1299. low_index_time = iTime(Symbol(),PERIOD_CURRENT,idx);
  1300. low_index = idx;
  1301. }
  1302. if(checkCandle(user_input_index) == "Bearish")
  1303. {
  1304. trend = "downtrend";
  1305. low = iLow(Symbol(),PERIOD_CURRENT,user_input_index);
  1306. low_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index);
  1307. low_index = user_input_index;
  1308. for(int j=user_input_index; j < 1000; j++)
  1309. {
  1310. if(checkCandle(j) == "Bullish")
  1311. {
  1312. high = iHigh(Symbol(),PERIOD_CURRENT,j);
  1313. idx = j;
  1314. break;
  1315. }
  1316. }
  1317. for(int k=idx; k<user_input_index; k++)
  1318. {
  1319. double highh = iHigh(Symbol(),PERIOD_CURRENT,k);
  1320. if(highh > high)
  1321. {
  1322. high = highh;
  1323. high_index_time = iTime(Symbol(),PERIOD_CURRENT,k);
  1324. high_index = k;
  1325. }
  1326. }
  1327. }
  1328. 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));
  1329. ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
  1330. ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
  1331. 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));
  1332. ObjectSetInteger(0,"target line1",OBJPROP_RAY_RIGHT,true);
  1333. ObjectSetInteger(0,"target line1",OBJPROP_COLOR,clrGreen);
  1334. ObjectCreate(0,"high",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,user_input_index),high,iTime(Symbol(),PERIOD_CURRENT,0),high);
  1335. ObjectSetInteger(0,"high",OBJPROP_RAY_RIGHT,true);
  1336. ObjectSetInteger(0,"high",OBJPROP_COLOR,clrBlue);
  1337. ObjectCreate(0,"low",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,user_input_index),low,iTime(Symbol(),PERIOD_CURRENT,0),low);
  1338. ObjectSetInteger(0,"low",OBJPROP_RAY_RIGHT,true);
  1339. ObjectSetInteger(0,"low",OBJPROP_COLOR,clrRed);
  1340. choch_index_time = iTime(Symbol(),PERIOD_CURRENT,user_input_index);
  1341. Entry_strategy(user_input_index);
  1342. }
  1343. else
  1344. {
  1345. Print("Object Not Found");
  1346. }
  1347. return(INIT_SUCCEEDED);
  1348. }
  1349. //+------------------------------------------------------------------+
  1350. //| |
  1351. //+------------------------------------------------------------------+
  1352. bool value_close_low(int chockIndex)
  1353. {
  1354. for(int i=chockIndex; i>1; i--)
  1355. {
  1356. if(iLow(Symbol(),PERIOD_CURRENT,i) < iClose(Symbol(),PERIOD_CURRENT,1))
  1357. {
  1358. return false;
  1359. }
  1360. }
  1361. return true;
  1362. }
  1363. //+------------------------------------------------------------------+
  1364. //| |
  1365. //+------------------------------------------------------------------+
  1366. bool value_close_high(int chockIndex)
  1367. {
  1368. for(int i=chockIndex; i>1; i--)
  1369. {
  1370. if(iHigh(Symbol(),PERIOD_CURRENT,i) > iClose(Symbol(),PERIOD_CURRENT,1))
  1371. {
  1372. return false;
  1373. }
  1374. }
  1375. return true;
  1376. }
  1377. //+------------------------------------------------------------------+
  1378. //| Expert deinitialization function |
  1379. //+------------------------------------------------------------------+
  1380. void OnDeinit(const int reason)
  1381. {
  1382. //---
  1383. }
  1384. //+------------------------------------------------------------------+
  1385. //| Expert tick function |
  1386. //+------------------------------------------------------------------+
  1387. void OnTick()
  1388. {
  1389. if(NewBar() == true)
  1390. {
  1391. Entry_strategy(1);
  1392. // for entry condition candel 1
  1393. for(int m=0; m < orderNum; m++)
  1394. {
  1395. if(od_1[m].choch_index_date_time != 0)
  1396. {
  1397. int indexOfTradePlace = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].Time_OF_Candle,false);
  1398. if(indexOfTradePlace == 2)
  1399. {
  1400. if(od_1[m].EntryCon == 1 && od_1[m].Signal == "buy")
  1401. {
  1402. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1403. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1404. 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);
  1405. // bool snd_con = false;
  1406. //for(int i=close_index-1; i>=1; i--) // second condition of updation
  1407. // {
  1408. // if(iClose(Symbol(),PERIOD_CURRENT,i) < reversalMax)
  1409. // {
  1410. // remove_value_from_structure();
  1411. // }
  1412. // }
  1413. // if(iOpen(Symbol(),PERIOD_CURRENT,1) > iClose(Symbol(),PERIOD_CURRENT,close_index)) // first condition of updation
  1414. {
  1415. if(reversalMax > iLow(Symbol(),PERIOD_CURRENT,1)
  1416. && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1) && tp_date_time_buy != 0.0)
  1417. {
  1418. placeBuyTrade();
  1419. if(object_find("target line") > 0)
  1420. {
  1421. ObjectDelete(0,"target line");
  1422. }
  1423. if(object_find("target line1") > 0)
  1424. {
  1425. ObjectDelete(0,"target line1");
  1426. }
  1427. remove_value_from_structure();
  1428. od_1[m].choch_index_date_time = 0;
  1429. od_1[m].Signal == "";
  1430. od_1[m].reversal_index_date_time = 0;
  1431. od_1[m].choch_index_date_time = 0;
  1432. signal = "";
  1433. Print("buy trade placed in no delay entry condition -------------------------------------------------------------");
  1434. Print("time at which trade is placed : ",TimeCurrent());
  1435. }
  1436. }
  1437. }
  1438. if(od_1[m].EntryCon == 1 && od_1[m].Signal == "sell")
  1439. {
  1440. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1441. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1442. 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);
  1443. // 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);
  1444. // bool snd_con = false;
  1445. //
  1446. //for(int i=close_index-1; i>=1; i--) // second condition of updation
  1447. // {
  1448. // if(iClose(Symbol(),PERIOD_CURRENT,i) > reversalMin)
  1449. // {
  1450. // remove_value_from_structure();
  1451. // //snd_con = true;
  1452. // }
  1453. // }
  1454. //
  1455. // if(iOpen(Symbol(),PERIOD_CURRENT,1) < iClose(Symbol(),PERIOD_CURRENT,close_index)) // first condition of updation
  1456. {
  1457. if(reversalMin < iHigh(Symbol(),PERIOD_CURRENT,1)
  1458. && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1) && tp_date_time_sell != 0.0)
  1459. {
  1460. placeSellTrade();
  1461. // tp_date_time_sell = 0.0;
  1462. if(object_find("target line") > 0)
  1463. {
  1464. ObjectDelete(0,"target line");
  1465. }
  1466. if(object_find("target line1") > 0)
  1467. {
  1468. ObjectDelete(0,"target line1");
  1469. }
  1470. remove_value_from_structure();
  1471. od_1[m].choch_index_date_time = 0;
  1472. od_1[m].Signal == "";
  1473. od_1[m].reversal_index_date_time = 0;
  1474. od_1[m].choch_index_date_time = 0;
  1475. signal = "";
  1476. Print("sell trade placed in no delay entry condition -------------------------------------------------------------");
  1477. Print("time at which trade is placed : ",TimeCurrent());
  1478. }
  1479. }
  1480. }
  1481. }
  1482. if(indexOfTradePlace > 2)
  1483. {
  1484. // second condition match
  1485. if(od_1[m].EntryCon == 2 && od_1[m].Signal == "buy")
  1486. {
  1487. if(trend == "uptrend")
  1488. {
  1489. double ib =iBarShift(Symbol(), PERIOD_CURRENT,tp_date_time_buy,false);
  1490. for(int p=ib-2; p >= 1; p--)
  1491. {
  1492. if(iHigh(Symbol(),PERIOD_CURRENT,p) > iLow(Symbol(),PERIOD_CURRENT,ib))
  1493. {
  1494. tp_date_time_buy = 0.0;
  1495. if(object_find("target line") > 0)
  1496. {
  1497. ObjectDelete(0,"target line");
  1498. }
  1499. if(object_find("target line1") > 0)
  1500. {
  1501. ObjectDelete(0,"target line1");
  1502. }
  1503. break;
  1504. }
  1505. }
  1506. }
  1507. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1508. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1509. Check_Inside_bar(reversal_indexx);
  1510. bool snd_con = false;
  1511. 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);
  1512. for(int i=close_index-1; i>=1; i--) // second condition of updation
  1513. {
  1514. if(iClose(Symbol(),PERIOD_CURRENT,i) < reversalMax)
  1515. {
  1516. snd_con = true;
  1517. //remove_value_from_structure();
  1518. }
  1519. }
  1520. if(iOpen(Symbol(),PERIOD_CURRENT,1) > iClose(Symbol(),PERIOD_CURRENT,close_index) && snd_con == false) // first condition of updation
  1521. {
  1522. if(value_close_high(close_index) == true)
  1523. {
  1524. if(iClose(Symbol(),PERIOD_CURRENT,close_index) > iLow(Symbol(),PERIOD_CURRENT,1)
  1525. && iClose(Symbol(),PERIOD_CURRENT,close_index) < iClose(Symbol(),PERIOD_CURRENT,1) && tp_date_time_buy != 0.0)
  1526. {
  1527. placeBuyTrade();
  1528. if(object_find("target line") > 0)
  1529. {
  1530. ObjectDelete(0,"target line");
  1531. }
  1532. if(object_find("target line1") > 0)
  1533. {
  1534. ObjectDelete(0,"target line1");
  1535. }
  1536. remove_value_from_structure();
  1537. od_1[m].choch_index_date_time = 0;
  1538. od_1[m].Signal == "";
  1539. od_1[m].reversal_index_date_time = 0;
  1540. od_1[m].choch_index_date_time = 0;
  1541. signal = "";
  1542. Print("buy trade placed in Entry condition delay -------------------------------------------------------------");
  1543. Print("time at which trade is placed : ",TimeCurrent());
  1544. }
  1545. }
  1546. }
  1547. }
  1548. if(od_1[m].EntryCon == 2 && od_1[m].Signal == "sell")
  1549. {
  1550. // Print("hi ----- entry condition 2 trend lines in sell case downtrend "," tp_date_time_sell",tp_date_time_sell);
  1551. if(trend == "downtrend")
  1552. {
  1553. // Print("there ----- entry condition 2 trend lines in sell case downtrend "," tp_date_time_sell",tp_date_time_sell);
  1554. double ib =iBarShift(Symbol(), PERIOD_CURRENT,tp_date_time_sell,false);
  1555. for(int p=ib-2; p >= 1; p--)
  1556. {
  1557. if(iLow(Symbol(),PERIOD_CURRENT,p) < iHigh(Symbol(),PERIOD_CURRENT,ib))
  1558. {
  1559. tp_date_time_sell = 0.0;
  1560. if(object_find("target line") > 0)
  1561. {
  1562. ObjectDelete(0,"target line");
  1563. }
  1564. if(object_find("target line1") > 0)
  1565. {
  1566. ObjectDelete(0,"target line1");
  1567. }
  1568. break;
  1569. }
  1570. }
  1571. }
  1572. int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
  1573. int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
  1574. Check_Inside_bar(reversal_indexx);
  1575. 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);
  1576. bool snd_con1 = false;
  1577. for(int i=close_index-1; i>=1; i--) // second condition of updation
  1578. {
  1579. if(iClose(Symbol(),PERIOD_CURRENT,i) > reversalMin)
  1580. {
  1581. snd_con1 = true;
  1582. // remove_value_from_structure();
  1583. }
  1584. }
  1585. if(iOpen(Symbol(),PERIOD_CURRENT,1) < iClose(Symbol(),PERIOD_CURRENT,close_index) && snd_con1 == false) // first condition of updation
  1586. {
  1587. if(value_close_low(close_index) == true)
  1588. {
  1589. if(iClose(Symbol(),PERIOD_CURRENT,close_index) < iHigh(Symbol(),PERIOD_CURRENT,1)
  1590. && iClose(Symbol(),PERIOD_CURRENT,close_index) > iClose(Symbol(),PERIOD_CURRENT,1) && tp_date_time_sell != 0.0)
  1591. {
  1592. placeSellTrade();
  1593. if(object_find("target line") > 0)
  1594. {
  1595. ObjectDelete(0,"target line");
  1596. }
  1597. if(object_find("target line1") > 0)
  1598. {
  1599. ObjectDelete(0,"target line1");
  1600. }
  1601. remove_value_from_structure();
  1602. od_1[m].choch_index_date_time = 0;
  1603. od_1[m].Signal == "";
  1604. od_1[m].reversal_index_date_time = 0;
  1605. od_1[m].choch_index_date_time = 0;
  1606. signal = "";
  1607. Print("sell trade placed in entry condition delay -------------------------------------------------------------");
  1608. Print("time at which trade is placed : ",TimeCurrent());
  1609. }
  1610. }
  1611. }
  1612. }
  1613. }
  1614. }
  1615. }
  1616. }
  1617. }
  1618. //+------------------------------------------------------------------+
  1619. //| |
  1620. //+------------------------------------------------------------------+
  1621. bool NewBar()
  1622. {
  1623. static datetime Last_bar ;
  1624. datetime Current_bar = iTime(Symbol(), PERIOD_CURRENT,0);
  1625. if(Current_bar != Last_bar)
  1626. {
  1627. Last_bar = Current_bar;
  1628. return (true);
  1629. }
  1630. else
  1631. {
  1632. return (false);
  1633. }
  1634. }
  1635. //+------------------------------------------------------------------+
  1636. //| |
  1637. //+------------------------------------------------------------------+
  1638. bool object_find(string obj) // to find object placed by user in the chart
  1639. {
  1640. if(ObjectFind(0,obj) >= 0)
  1641. {
  1642. return true;
  1643. }
  1644. return false;
  1645. }
  1646. //+------------------------------------------------------------------+
  1647. //| |
  1648. //+------------------------------------------------------------------+
  1649. string checkCandle(int v) // to check the candle is bullish or bearish
  1650. {
  1651. double close = iClose(Symbol(),PERIOD_CURRENT,v);
  1652. double open = iOpen(Symbol(),PERIOD_CURRENT,v);
  1653. if(close > open)
  1654. {
  1655. return "Bullish";
  1656. }
  1657. else
  1658. if(close < open)
  1659. {
  1660. return "Bearish";
  1661. }
  1662. return "empty";
  1663. }
  1664. //+------------------------------------------------------------------+
  1665. //+------------------------------------------------------------------+
  1666. //+------------------------------------------------------------------+