Reaction Trend System.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:35k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Reaction Trend System
  4. //  Author/Uploader: Ed 
  5. //  E-mail:          ed2000nl@home.nl
  6. //  Date/Time Added: 2004-05-20 13:32:18
  7. //  Origin:          translated from J. Welles Wilder Jr. using New Concepts in Technical Trading 1978
  8. //  Keywords:        trading system trend
  9. //  Level:           advanced
  10. //  Flags:           system
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=357
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=357
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  see code for details.
  17. //
  18. //  Think most of the bugs are out but if you find any please let me know. Also
  19. //  suggestions to write it more efficiently are welcome.
  20. //
  21. //  Best to use hourly intraday data. Should work in any timeframe but it
  22. //  should be used with intraday data.
  23. //
  24. //  If you want to do a backtest do not forget to select the timeframe in the
  25. //  settings!!!
  26. //
  27. //------------------------------------------------------------------------------
  28. /*
  29. Reaction Trend System ---- to be used with Intraday Data
  30. Originally develloped by: J. Welles Wilder Jr. 
  31. Translated from: New Concepts in Technical Trading systems (1978)
  32. Translation in Amibroker-AFL by Edward Pottasch (May 2004), Email: ed2000nl@home.nl
  33. Shapes in Chart: 
  34. 1) hollow yellow down arrow: Reaction mode short position
  35. 2) hollow white up arrow: COVER of short positions of BOTH modes (either trend and reaction mode)
  36. 3) solid yellow down arrow: sell of long positions of BOTH modes (either trend and reaction mode)
  37. 4) solid white up arrow: Reaction mode long position
  38. 5) solid yellow down triangle: Trend mode short position
  39. 6) solid white up triangle: Trend mode long position
  40. Digits in Chart:
  41. 1) "1": a "B" day (see rules in code below or in WW's book).
  42. 2) "2": a "O" day
  43. 3) "3": a "S" day
  44. Colors of Digits:
  45. 1) white: normal color
  46. 2) yellow: highest or lows day during trend mode. Represents a discontinuity in phase
  47. 3) lightblue: always drawn below a yellow digit. It means that even though the phase
  48. is as the yellow digit shows the phase of the lightblue digit is used (which was the phase
  49. before the discontinuity). This is an exceptional situation where the outbreak to the 
  50. trend mode coincides with the highest or lowest day.
  51. Short description of the system.
  52. phase == 1: B day (1 digit in chart)
  53. - LONG positions are initiated only on a "B" day
  54. - SHORT positions are reversed on a "B" day
  55. - breakout of HBOP or LBOP initiate a long or short position on a "B" day
  56. - we must exit a short position entered in the reaction mode. If target not hit exit at close
  57. phase == 2: O day (2 digit in chart)
  58. - No positions are initiated on an "O" day except those initiated by the breakout points
  59. - LONG positions may be close on an "O" day.
  60. - breakout of HBOP or LBOP initiate a long or short position on an "O" day
  61. phase == 3: S day (3 digit in chart)
  62. - SHORT positions are initiated only on an "S" day
  63. - LONG positions are reversed on a "S" day
  64. - breakout of HBOP or LBOP initiate a long or short position on a "S" day
  65. - we must exit a long position entered in the reaction mode. If target not hit exit at close
  66. remarks:
  67. A)
  68. Any timeframe may be used but I suggest hourly data because it is still fast and provides 
  69. basicly the same information as any other timeframe.
  70. B)
  71. I am not sure if Wilder's original idea was to open a reaction mode position in the same 
  72. day where the trend mode position was closed but the code is set up to do such a thing.
  73. C) Backtesting using minute, hourly etc. timeframes may give a slightly different result. 
  74. Sorry but it is inherent to the system.
  75. D) Assumed is that the close is at 16:00. Certain exits will take place between 15:55 and 16:00
  76. if there is a trade. Otherwise no exit occurs. So for now this program should only be used with
  77. densely traded stocks where there are a couple of trades in the last minutes.
  78. */
  79. // set to use all bars required for looping
  80. setbarsrequired(100000,100000);
  81. // set timeframe
  82. TimeFrameSet( inDaily );
  83. //calculate the average + the four price action points.
  84. // average
  85. xx = (H + L + C) / 3;
  86. // four price action points
  87. // 1) Buy point
  88. B1 = 2 * Ref(xx,-1) - Ref(H,-1);
  89. // 2) Sell point
  90. S1 = 2 * Ref(xx,-1) - Ref(L,-1);
  91. // 3) High break out point
  92. HBOP = 2 * Ref(xx,-1) - 2 * Ref(L,-1) + Ref(H,-1);
  93. // 4) Low break out point 
  94. LBOP = 2 * Ref(xx,-1) - 2 * Ref(H,-1) + Ref(L,-1);
  95. // short trail stop: highest high made in previous 2 days (used in trend mode only)
  96. trailstop_short = Ref(HHV(H,2),-1);
  97. // long trail stop: lowest low made in previous 2 days (used in trend mode only)
  98. trailstop_long = Ref(LLV(L,2),-1);
  99. // declare some arrays
  100. phase_arr = C; 
  101. phase_arr = 0;
  102. phase_arr_l1 = phase_arr; // additional layer of phase changes
  103. stop_short = phase_arr; stop_long = stop_short;
  104. short_index_position = phase_arr; long_index_position = short_index_position;
  105. b_day = phase_arr; s_day = phase_arr;
  106. // first determine "B" and "S" days
  107. idx = 0;
  108. for (i = 0; i < BarCount; i++) {
  109. // short trend mode
  110. if (L[ i ] <= LBOP[ i ] AND i >= idx) {
  111. // indicate the short trend mode outbreak
  112. short_index_position[ i ] = 1;
  113. // variables tracking lowest day in short trend mode
  114. idx_b = i;
  115. loi = L[ i ];
  116. // exit at trailing stop
  117. for (j = i + 1; j < BarCount; j++) {
  118. if (L[ j ] < loi) {
  119. loi = L[ j ];
  120. // track index of lowest point in trend mode 
  121. idx_b = j;
  122. } else
  123. if (H[ j ] >= trailstop_short[ j ]) {
  124. stop_short[ j ] = 1;
  125. // idx is used to make sure we finish a position before starting a new one
  126. idx = j;
  127. // used to exit the j-for loop
  128. j = BarCount - 1;
  129. }
  130. }
  131. // save index position of lowest point in short trend mode
  132. b_day[ idx_b ] = 1;
  133. } else if (H[ i ] >= HBOP[ i ] AND i >= idx) {
  134. // indicate the long trend mode outbreak
  135. long_index_position[ i ] = 1;
  136. // variables tracking highest day in long trend mode
  137. idx_s = i;
  138. hii = H[ i ];
  139. // exit at trailing stop
  140. for (j = i + 1; j < BarCount; j++) {
  141. if (H[ j ] > hii) {
  142. hii = H[ j ];
  143. // track index of highest point in trend mode 
  144. idx_s = j;
  145. } else
  146. if (L[ j ] <= trailstop_long[ j ]) {
  147. stop_long[ j ] = 1;
  148. // idx is used to make sure we finish a position before starting a new one
  149. idx = j; 
  150. // used to exit the j-for loop
  151. j = BarCount - 1;
  152. }
  153. }
  154. // save index position of highest point in long trend mode
  155. s_day[ idx_s ] = 1;
  156. }
  157. }
  158. // fill in the rest of the phase array. Sequence: 1 - 2 - 3 - 1 - 2 - etc
  159. for (i = 1; i < BarCount; i++) {
  160. if (b_day[ i ] == 1) {
  161. phase_arr[ i ] = 1;
  162. // if b_day equal to the day of outbreak store the original phase
  163. if (b_day[ i ] == 1 AND short_index_position[ i ] == 1) {
  164. if (phase_arr[ i - 1 ] == 1) {
  165. phase_arr_l1[ i ] = 2;
  166. } else
  167. if (phase_arr[ i - 1 ] == 2) {
  168. phase_arr_l1[ i ] = 3;
  169. } else
  170. if (phase_arr[ i - 1 ] == 3) {
  171. phase_arr_l1[ i ] = 1;
  172. } else
  173. if (phase_arr[ i - 1 ] == 0) {
  174. phase_arr_l1[ i ] = 1;
  175. }
  176. }
  177. } else if (s_day[ i ] == 1) {
  178. phase_arr[ i ]  = 3;
  179. // if s_day equal to the day of outbreak store the original phase
  180. if (s_day[ i ] == 1 AND long_index_position[ i ] == 1) {
  181. if (phase_arr[ i - 1 ] == 1) {
  182. phase_arr_l1[ i ] = 2;
  183. } else
  184. if (phase_arr[ i - 1 ] == 2) {
  185. phase_arr_l1[ i ] = 3;
  186. } else
  187. if (phase_arr[ i - 1 ] == 3) {
  188. phase_arr_l1[ i ] = 1;
  189. } else
  190. if (phase_arr[ i - 1 ] == 0) {
  191. phase_arr_l1[ i ] = 1;
  192. }
  193. }
  194. } else if (b_day[ i ] == 0 AND s_day[ i ] == 0 AND phase_arr[ i - 1 ] == 3) {
  195. phase_arr[ i ] = 1;
  196. } else if (b_day[ i ] == 0 AND s_day[ i ] == 0 AND phase_arr[ i - 1 ] == 2) {
  197. phase_arr[ i ] = 3;
  198. } else if (b_day[ i ] == 0 AND s_day[ i ] == 0 AND phase_arr[ i - 1 ] == 1) {
  199. phase_arr[ i ] = 2;
  200. }
  201. }
  202. // restore to current time frame
  203. TimeFrameRestore();
  204. // expand arrays 
  205. xx = TimeFrameExpand( xx, inDaily,mode = expandFirst  );
  206. B1 = TimeFrameExpand( B1, inDaily,mode = expandFirst  );
  207. S1 = TimeFrameExpand( S1, inDaily,mode = expandFirst  );
  208. HBOP = TimeFrameExpand( HBOP, inDaily,mode = expandFirst  );
  209. LBOP = TimeFrameExpand( LBOP, inDaily,mode = expandFirst  );
  210. trailstop_short = TimeFrameExpand( trailstop_short, inDaily,mode = expandFirst  );
  211. trailstop_long = TimeFrameExpand( trailstop_long, inDaily,mode = expandFirst  );
  212. phase_arr = TimeFrameExpand( phase_arr, inDaily,mode = expandFirst  );
  213. phase_arr_l1 = TimeFrameExpand( phase_arr_l1, inDaily,mode = expandFirst  );
  214. b_day = TimeFrameExpand( b_day, inDaily,mode = expandFirst  );
  215. s_day = TimeFrameExpand( s_day, inDaily,mode = expandFirst  );
  216. // time bar is used on B and S days + position to close out on last bar if target not hit
  217. timebar = Cross(TimeNum(),155500);
  218. // adjust phase array for charting purposes
  219. hlp_phase = phase_arr; hlp_phase = 0; hlp_b = hlp_phase; hlp_s = hlp_phase; hlp_phase_l1 = hlp_phase;
  220. for (i = 1; i < BarCount; i++) {
  221. if (HBOP[ i ] != HBOP[ i - 1]) {
  222. hlp_phase[ i ] = phase_arr[ i ];
  223. hlp_phase_l1[ i ] = phase_arr_l1[ i ];
  224. hlp_b[ i ] = b_day[ i ];
  225. hlp_s[ i ] = s_day[ i ];
  226. }
  227. }
  228. // change the phase_arr back to original phase at places where phase change equals outbreak because
  229. // you need the original phase to determine reaction mode behaviour
  230. phase_arr = IIF(phase_arr_l1 != 0,phase_arr_l1,phase_arr);
  231. // calculate the positions
  232. // flag settings
  233. reaction_position_buy = 0;
  234. reaction_position_short = 0;
  235. trend_position_buy = 0;
  236. trend_position_short = 0;
  237. // help arrays
  238. tpsl = C; tpsl = 0; // trend position long index storage array
  239. tpss = C; tpss = 0; // trend position short index storage array
  240. // reset arrays
  241. Buy = C; Buy = 0; Sell = Buy; Short = Buy; Cover = Buy;
  242. for (i = 0; i < BarCount; i++) {
  243. /* "B" day + no position. 4 areas are of importance for the open price as an entry point
  244. 1) Open between HBOP and B1 (Area 1)
  245. 2) Open between B1 and LBOP (Area 2)
  246. 3) Open higher than HBOP (Area 3)
  247. 4) Open lower than LBOP (Area 4)
  248. */
  249. if (phase_arr[ i ] == 1 AND reaction_position_buy == 0 AND trend_position_buy == 0 AND 
  250. reaction_position_short == 0 AND trend_position_short == 0) {
  251. // open in Area 1
  252. if (O[ i ] > B1[ i ] AND O[ i ] < HBOP[ i ]) {
  253. // check for entry of Area 2
  254. if (L[ i ] <= B1[ i ]) {
  255. Buy[ i ] = 1;
  256. BuyPrice[ i ] = B1[ i ];
  257. reaction_position_buy = 1;
  258. // check for entry of Area 3 (breakout)
  259. if (L[ i ] <= LBOP[ i ]) {
  260. // sell the reaction mode long position you just entered
  261. Sell[ i ] = 1;
  262. SellPrice[ i ] = LBOP[ i ];
  263. reaction_position_buy = 0;
  264. // take a short position in the trend mode
  265. Short[ i ] = 1;
  266. ShortPrice[ i ] = LBOP[ i ];
  267. trend_position_short = 1;
  268. tpss[ i ] = 1;
  269. } else 
  270. // check for enrty of Area 4 (breakout)
  271. if (H[ i ] >= HBOP[ i ]) {
  272. // only change the mode since we are already long
  273. reaction_position_buy = 0;
  274. trend_position_buy = 1;
  275. tpsl[ i ] = 1;
  276. }
  277. } else 
  278. // check for entry of Area 4
  279. if (H[ i ] >= HBOP[ i ]) {
  280. Buy[ i ] = 1;
  281. BuyPrice[ i ] = HBOP[ i ];
  282. trend_position_buy = 1;
  283. tpsl[ i ] = 1;
  284. }
  285. } else
  286. // open in Area 2
  287. if (O[ i ] <= B1[ i ] AND O[ i ] > LBOP[ i ]) {
  288. Buy[ i ] = 1;
  289. BuyPrice[ i ] = O[ i ];
  290. reaction_position_buy = 1;
  291. // check for entry of Area 3 (breakout)
  292. if (L[ i ] <= LBOP[ i ]) {
  293. // sell the reaction mode long position you just entered
  294. Sell[ i ] = 1;
  295. SellPrice[ i ] = LBOP[ i ];
  296. reaction_position_buy = 0;
  297. // take a short position in the trend mode
  298. Short[ i ] = 1;
  299. ShortPrice[ i ] = LBOP[ i ];
  300. trend_position_short = 1;
  301. tpss[ i ] = 1;
  302. } else 
  303. // check for enrty of Area 4 (breakout)
  304. if (H[ i ] >= HBOP[ i ]) {
  305. // only change the mode since we are already long
  306. reaction_position_buy = 0;
  307. trend_position_buy = 1;
  308. tpsl[ i ] = 1;
  309. }
  310. } else
  311. // open in Area 3
  312. if (O[ i ] <= LBOP[ i ]) {
  313. // take a short position in the trend mode
  314. Short[ i ] = 1;
  315. ShortPrice[ i ] = O[ i ];
  316. trend_position_short = 1;
  317. tpss[ i ] = 1;
  318. } else
  319. // open in Area 4
  320. if (O[ i ] >= HBOP[ i ]) {
  321. // take a long position in the trend mode
  322. Buy[ i ] = 1;
  323. BuyPrice[ i ] = O[ i ];
  324. trend_position_buy = 1;
  325. tpsl[ i ] = 1;
  326. }
  327. } else
  328. /* "O" day + no position. 3 entry areas of importance
  329. 1) open between LBOP and HBOP (Area 1)
  330. 2) open higher than HBOP (Area 2)
  331. 3) open lower than LBOP (Area 3)
  332. */
  333. if (phase_arr[ i ] == 2 AND reaction_position_buy == 0 AND trend_position_buy == 0 AND 
  334. reaction_position_short == 0 AND trend_position_short == 0) {
  335. // open in Area 1
  336. if (O[ i ] > LBOP[ i ] AND O[ i ] < HBOP[ i ]) {
  337. // entry of Area 3
  338. if (L[ i ] <= LBOP[ i ]) {
  339. // take a short position in trend mode
  340. Short[ i ] = 1;
  341. ShortPrice[ i ] = LBOP[ i ];
  342. trend_position_short = 1;
  343. tpss[ i ] = 1;
  344. } else
  345. // entry of Area 4
  346. if (H[ i ] >= HBOP[ i ]) {
  347. // take a long position in the trend mode
  348. Buy[ i ] = 1;
  349. BuyPrice[ i ] = HBOP[ i ];
  350. trend_position_buy = 1;
  351. tpsl[ i ] = 1;
  352. }
  353. } else
  354. // open in Area 3
  355. if (O[ i ] <= LBOP[ i ]) {
  356. // take a short position in the trend mode
  357. Short[ i ] = 1;
  358. ShortPrice[ i ] = O[ i ];
  359. trend_position_short = 1;
  360. tpss[ i ] = 1;
  361. } else
  362. // open in Area 2
  363. if (O[ i ] >= HBOP[ i ]) {
  364. // take a long position in the trend mode
  365. Buy[ i ] = 1;
  366. BuyPrice[ i ] = O[ i ];
  367. trend_position_buy = 1;
  368. tpsl[ i ] = 1;
  369. }
  370. } else
  371. /* "S" day + no position. 4 areas of entry may be defined
  372. 1) open between LBOP and S1 (area 1)
  373. 2) open between S1 and HBOP (area 2)
  374. 3) open higher than HBOP (area 3)
  375. 4) open lower than LBOP (area 4)
  376. */
  377. if (phase_arr[ i ] == 3 AND reaction_position_buy == 0 AND trend_position_buy == 0 AND 
  378. reaction_position_short == 0 AND trend_position_short == 0) {
  379. // open in area 1
  380. if (O[ i ] > LBOP[ i ] AND O[ i ] < S1[ i ]) {
  381. // check for entry of Area 2
  382. if (H[ i ] >= S1[ i ]) {
  383. Short[ i ] = 1;
  384. ShortPrice[ i ] = S1[ i ];
  385. reaction_position_short = 1;
  386. // check for entry of Area 3 (breakout)
  387. if (H[ i ] >= HBOP[ i ]) {
  388. // cover position first
  389. Cover[ i ] = 1;
  390. CoverPrice[ i ] = HBOP[ i ];
  391. reaction_position_short = 0;
  392. // take a long position in the trend mode
  393. Buy[ i ] = 1;
  394. BuyPrice[ i ] = HBOP[ i ];
  395. trend_position_buy = 1;
  396. tpsl[ i ] = 1;
  397. } else 
  398. // check for enrty of Area 4 (breakout)
  399. if (L[ i ] <= LBOP[ i ]) {
  400. // only change the mode since we are already short
  401. reaction_position_short = 0;
  402. trend_position_short = 1;
  403. tpss[ i ] = 1;
  404. }
  405. } else 
  406. // check for entry of Area 4
  407. if (L[ i ] <= LBOP[ i ]) {
  408. Short[ i ] = 1;
  409. ShortPrice[ i ] = LBOP[ i ];
  410. trend_position_short = 1;
  411. tpss[ i ] = 1;
  412. }
  413. } else
  414. // open in area 2
  415. if (O[ i ] >= S1[ i ] AND O[ i ] < HBOP[ i ]) {
  416. Short[ i ] = 1;
  417. ShortPrice[ i ] = O[ i ];
  418. reaction_position_short = 1;
  419. // check for entry of Area 3 (breakout)
  420. if (H[ i ] >= HBOP[ i ]) {
  421. // cover the reaction mode short position you just entered
  422. Cover[ i ] = 1;
  423. CoverPrice[ i ] = HBOP[ i ];
  424. reaction_position_short = 0;
  425. // take a long position in the trend mode
  426. Buy[ i ] = 1;
  427. BuyPrice[ i ] = HBOP[ i ];
  428. trend_position_buy = 1;
  429. tpsl[ i ] = 1;
  430. } else 
  431. // check for enrty of Area 4 (breakout)
  432. if (L[ i ] <= LBOP[ i ]) {
  433. // only change the mode since we are already short
  434. reaction_position_short = 0;
  435. trend_position_short = 1;
  436. tpss[ i ] = 1;
  437. }
  438. } else
  439. // open in Area 4
  440. if (O[ i ] <= LBOP[ i ]) {
  441. // take a short position in the trend mode
  442. Short[ i ] = 1;
  443. ShortPrice[ i ] = O[ i ];
  444. trend_position_short = 1;
  445. tpss[ i ] = 1;
  446. } else
  447. // open in Area 3
  448. if (O[ i ] >= HBOP[ i ]) {
  449. // take a long position in the trend mode
  450. Buy[ i ] = 1;
  451. BuyPrice[ i ] = O[ i ];
  452. trend_position_buy = 1;
  453. tpsl[ i ] = 1;
  454. }
  455. } else
  456. /* "B" day PLUS short reaction mode position. 4 Entry areas of interest
  457. 1) open between B1 and HBOP (area 1)
  458. 2) open between LBOP and B1 (area 2)
  459. 3) open below LBOP (area 3)
  460. 4) open above HBOP (area 4)
  461. */
  462. if (phase_arr[ i ] == 1 AND reaction_position_buy == 0 AND trend_position_buy == 0 AND 
  463. reaction_position_short == 1 AND trend_position_short == 0) {
  464. // open in area 1
  465. if (O[ i ] > B1[ i ] AND O[ i ] < HBOP[ i ]) {
  466. // enter area 2
  467. if (L[ i ] <= B1[ i ]) {
  468. // cover short position
  469. Cover[ i ] = 1;
  470. CoverPrice[ i ] = B1[ i ];
  471. reaction_position_short = 0;
  472. // reverse short into a long
  473. Buy[ i ] = 1;
  474. BuyPrice[ i ] = B1[ i ];
  475. reaction_position_buy = 1;
  476. // price enters area 3
  477. if (L[ i ] <= LBOP[ i ]) {
  478. // close long position
  479. Sell[ i ] = 1;
  480. SellPrice[ i ] = LBOP[ i ];
  481. reaction_position_buy = 0;
  482. // open short trend mode position
  483. Short[ i ] = 1;
  484. ShortPrice[ i ] = LBOP[ i ];
  485. trend_position_short = 1;
  486. tpss[ i ] = 1;
  487. } else
  488. // price enters area 4
  489. if (H[ i ] >= HBOP[ i ]) {
  490. // just change the mode
  491. reaction_position_buy = 0;
  492. trend_position_buy = 1;
  493. tpsl[ i ] = 1;
  494. }
  495. } else
  496. // stay in area 1 and cover position at the close
  497. if (L[ i ] > B1[ i ] AND H[ i ] < HBOP[ i ] AND timebar[ i ] == 1) {
  498. // cover at close
  499. Cover[ i ] = 1;
  500. CoverPrice[ i ] = C[ i ];
  501. reaction_position_short = 0;
  502. } else
  503. // price enters area 4
  504. if (H[ i ] >= HBOP[ i ]) {
  505. // cover short position
  506. Cover[ i ] = 1;
  507. CoverPrice[ i ] = HBOP[ i ];
  508. reaction_position_short = 0;
  509. // go long in trend mode
  510. Buy[ i ] = 1;
  511. BuyPrice[ i ] = HBOP[ i ];
  512. trend_position_buy = 1;
  513. tpsl[ i ] = 1;
  514. }
  515. } else
  516. // open in area 2
  517. if (O[ i ] > LBOP[ i ] AND O[ i ] <= B1[ i ]) {
  518. // cover the short position
  519. Cover[ i ] = 1;
  520. CoverPrice[ i ] = O[ i ];
  521. reaction_position_short = 0;
  522. // reverse position
  523. Buy[ i ] = 1;
  524. BuyPrice[ i ] = O[ i ];
  525. reaction_position_buy = 1;
  526. // price enters area 3
  527. if (L[ i ] <= LBOP[ i ]) {
  528. // close long position
  529. Sell[ i ] = 1;
  530. SellPrice[ i ] = LBOP[ i ];
  531. reaction_position_buy = 0;
  532. // open short trend mode position
  533. Short[ i ] = 1;
  534. ShortPrice[ i ] = LBOP[ i ];
  535. trend_position_short = 1;
  536. tpss[ i ] = 1;
  537. } else
  538. // price enters area 4
  539. if (H[ i ] > HBOP[ i ]) {
  540. // just change the mode
  541. reaction_position_buy = 0;
  542. trend_position_buy = 1;
  543. tpsl[ i ] = 1;
  544. }
  545. } else
  546. // open in area 3
  547. if (O[ i ] <= LBOP[ i ]) {
  548. // position is already short, just change the mode
  549. reaction_position_short = 0;
  550. trend_position_short = 1;
  551. tpss[ i ] = 1;
  552. } else
  553. // open in area 4
  554. if (O[ i ] >= HBOP[ i ]) {
  555. // close the short position
  556. Cover[ i ] = 1;
  557. CoverPrice[ i ] = O[ i ];
  558. reaction_position_short = 0;
  559. // and go long in trend mode
  560. Buy[ i ] = 1;
  561. BuyPrice[ i ] = O[ i ];
  562. trend_position_buy = 1;
  563. tpsl[ i ] = 1;
  564. }
  565. } else
  566. /* "O" day PLUS long reaction mode position,  4 areas of interest
  567. 1) open between LBOP and S1 (area 1)
  568. 2) open between S1 and HBOP (area 2)
  569. 3) open above HBOP (area 3)
  570. 4) open below LBOP ( area 4)
  571. */
  572. if (phase_arr[ i ] == 2 AND reaction_position_buy == 1 AND trend_position_buy == 0 AND 
  573. reaction_position_short == 0 AND trend_position_short == 0) {
  574. // open in area 1
  575. if (O[ i ] > LBOP[ i ] AND O[ i ] < S1[ i ]) {
  576. // entry of area 2
  577. if (H[ i ] >= S1[ i ]) {
  578. Sell[ i ] = 1;
  579. SellPrice[ i ] = S1[ i ];
  580. reaction_position_buy = 0;
  581. // enter area 3
  582. if (H[ i ] >= HBOP[ i ]) {
  583. // go long in trend mode
  584. Buy[ i ] = 1;
  585. BuyPrice[ i ] = HBOP[ i ];
  586. trend_position_buy = 1;
  587. tpsl[ i ] = 1;
  588. } else
  589. // enter area 4
  590. if (L[i ] <= LBOP[ i ]) {
  591. // go short in trend mode
  592. Short[ i ] = 1;
  593. ShortPrice[ i ] = LBOP[ i ];
  594. trend_position_short = 1;
  595. tpss[ i ] = 1;
  596. }
  597. } else
  598. // entry of area 4
  599. if (L[ i ] <= LBOP[ i ]) {
  600. // sell currect position
  601. Sell[ i ] = 1;
  602. SellPrice[ i ] = LBOP[ i ];
  603. reaction_position_buy = 0;
  604. // enter the short trend mode
  605. Short[ i ] = 1;
  606. ShortPrice[ i ] = LBOP[ i ];
  607. trend_position_short = 1;
  608. tpss[ i ] = 1;
  609. }
  610. } else
  611. // open in area 2
  612. if (O[ i ] >= S1[ i ] AND O[ i ] < HBOP[ i ]) {
  613. // sell position straight away
  614. Sell[ i ] = 1;
  615. SellPrice[ i ] = O[ i ];
  616. reaction_position_buy = 0;
  617. // enter area 3
  618. if (H[ i ] >= HBOP[ i ]) {
  619. // go long in trend mode
  620. Buy[ i ] = 1;
  621. BuyPrice[ i ] = HBOP[ i ];
  622. trend_position_buy = 1;
  623. tpsl[ i ] = 1;
  624. } else
  625. // enter area 4
  626. if (L[i ] <= LBOP[ i ]) {
  627. // go short in trend mode
  628. Short[ i ] = 1;
  629. ShortPrice[ i ] = LBOP[ i ];
  630. trend_position_short = 1;
  631. tpss[ i ] = 1;
  632. }
  633. } else
  634. // open in area 3
  635. if (O[ i ] >= HBOP[ i ]) {
  636. // position is already long, just change the mode
  637. reaction_position_buy = 0;
  638. trend_position_buy = 1;
  639. tpsl[ i ] = 1;
  640. } else
  641. // open in area 4
  642. if (O[ i ] <= LBOP[ i ]) {
  643. // close the long position
  644. Sell[ i ] = 1;
  645. SellPrice[ i ] = O[ i ];
  646. reaction_position_buy = 0;
  647. // and go short in trend mode
  648. Short[ i ] = 1;
  649. ShortPrice[ i ] = O[ i ];
  650. trend_position_short = 1;
  651. tpss[ i ] = 1;
  652. }
  653. } else
  654. /* "S" day + long reaction mode position, 4 areas of interest
  655. 1) open between LBOP and S1 (area 1)
  656. 2) open between S1 and HBOP
  657. 3) open above HBOP (area 3)
  658. 4) open below LBOP (area 4)
  659. */
  660. if (phase_arr[ i ] == 3 AND reaction_position_buy == 1 AND trend_position_buy == 0 AND 
  661. reaction_position_short == 0 AND trend_position_short == 0) {
  662. // open in area 1
  663. if (O[ i ] > LBOP[ i ] AND O[ i ] < S1[ i ]) {
  664. // entry of area 2
  665. if (H[ i ] >= S1[ i ]) {
  666. // sell position
  667. Sell[ i ] = 1;
  668. SellPrice[ i ] = S1[ i ];
  669. reaction_position_buy = 0;
  670. // reverse position
  671. Short[ i ] = 1;
  672. ShortPrice[ i ] = S1[ i ];
  673. reaction_position_short = 1;
  674. // enter area 3
  675. if (H[ i ] >= HBOP[ i ]) {
  676. // close out short position
  677. Cover[ i ] = 1;
  678. CoverPrice[ i ] = HBOP[ i ];
  679. reaction_position_short = 0;
  680. // go long in trend mode
  681. Buy[ i ] = 1;
  682. BuyPrice[ i ] = HBOP[ i ];
  683. trend_position_buy = 1;
  684. tpsl[ i ] = 1;
  685. } else
  686. // enter area 4
  687. if (L[i ] <= LBOP[ i ]) {
  688. // just change mode, we are short already
  689. reaction_position_short = 0;
  690. trend_position_short = 1;
  691. tpss[ i ] = 1;
  692. }
  693. }
  694. // price never enters the sell area
  695. if (H[ i ] < S1[ i ] AND L[ i ] > LBOP[ i ] AND timebar[ i ] == 1) {
  696. // cover at close
  697. Sell[ i ] = 1;
  698. SellPrice[ i ] = C[ i ];
  699. reaction_position_buy = 0;
  700. } else
  701. // price enters area 4
  702. if (L[ i ] <= LBOP[ i ]) {
  703. // sell long position
  704. Sell[ i ] = 1;
  705. SellPrice[ i ] = LBOP[ i ];
  706. reaction_position_buy = 0;
  707. // go short in trend mode
  708. Short[ i ] = 1;
  709. ShortPrice[ i ] = LBOP[ i ];
  710. trend_position_short = 1;
  711. tpss[ i ] = 1;
  712. }
  713. } else
  714. // open in area 2
  715. if (O[ i ] >= S1[ i ] AND O[ i ] < HBOP[ i ]) {
  716. // sell position straight away
  717. Sell[ i ] = 1;
  718. SellPrice[ i ] = O[ i ];
  719. reaction_position_buy = 0;
  720. // and reverse
  721. Short[ i ] = 1;
  722. ShortPrice[ i ] = O[ i ];
  723. reaction_position_short = 1;
  724. // enter area 3
  725. if (H[ i ] >= HBOP[ i ]) {
  726. // close out short position
  727. Cover[ i ] = 1;
  728. CoverPrice[ i ] = HBOP[ i ];
  729. reaction_position_short = 0;
  730. // go long in trend mode
  731. Buy[ i ] = 1;
  732. BuyPrice[ i ] = HBOP[ i ];
  733. trend_position_buy = 1;
  734. tpsl[ i ] = 1;
  735. } else
  736. // enter area 4
  737. if (L[i ] <= LBOP[ i ]) {
  738. // just change mode, we are short already
  739. reaction_position_short = 0;
  740. trend_position_short = 1;
  741. tpss[ i ] = 1;
  742. }
  743. } else
  744. // open in area 3
  745. if (O[ i ] >= HBOP[ i ]) {
  746. // position is already long, just change the mode
  747. reaction_position_buy = 0;
  748. trend_position_buy = 1;
  749. tpsl[ i ] = 1;
  750. } else
  751. // open in area 4
  752. if (O[ i ] <= LBOP[ i ]) {
  753. // close the long position
  754. Sell[ i ] = 1;
  755. SellPrice[ i ] = O[ i ];
  756. reaction_position_buy = 0;
  757. // and go short in trend mode
  758. Short[ i ] = 1;
  759. ShortPrice[ i ] = O[ i ];
  760. trend_position_short = 1;
  761. tpss[ i ] = 1;
  762. }
  763. } else
  764. /* long trend mode position, exit at the trailing stop, 4 entry areas of interest
  765. 1) open between trailstop_long and HBOP (area 1)
  766. 2) open between trailstop_long and LBOP (area 2)
  767. 3) open above HBOP (area 3)
  768. 4) open below LBOP (area 4)
  769. */
  770. if ( (phase_arr[ i ] == 1 OR phase_arr[ i ] == 2 OR phase_arr[ i ] == 3) AND 
  771. reaction_position_buy == 0 AND trend_position_buy == 1 AND 
  772. reaction_position_short == 0 AND trend_position_short == 0) {
  773. // open in area 1
  774. if (O[ i ] > trailstop_long[ i ] AND O[ i ] < HBOP[ i ]) {
  775. // enter area 2
  776. if (L[ i ] <= trailstop_long[ i ]) {
  777. // long position in trend mode is stopped out
  778. Sell[ i ] = 1;
  779. SellPrice[ i ] = trailstop_long[ i ];
  780. trend_position_buy = 0;
  781. // enter area 4
  782. if (L[ i ] <= LBOP[ i ]) {
  783. Short[ i ] = 1;
  784. ShortPrice[ i ] = LBOP[ i ];
  785. trend_position_short = 1;
  786. tpss[ i ] = 1;
  787. // enter area 3 **** nothing done here
  788. } else
  789. // open in area 2
  790. if (O[ i ] <= trailstop_long[ i ] AND O[ i ] > LBOP[ i ]) {
  791. // long position in trend mode is stopped out at the open
  792. Sell[ i ] = 1;
  793. SellPrice[ i ] = O[ i ];
  794. trend_position_buy = 0;
  795. // enter area 4
  796. if (L[ i ] <= LBOP[ i ]) {
  797. // take a short position
  798. Short[ i ] = 1;
  799. ShortPrice[ i ] = LBOP[ i ];
  800. trend_position_short = 1;
  801. tpss[ i ] = 1;
  802. } else
  803. // enter area 3
  804. if (H[ i ] >= HBOP[ i ]) {
  805. Buy[ i ] = 1;
  806. BuyPrice[ i ] = HBOP[ i ];
  807. trend_position_buy = 1;
  808. tpsl[ i ] = 1;
  809. }
  810. } else
  811. // open in area 3 *** nothing done here
  812. // open in area 4
  813. if (O[ i ] <= LBOP[ i ]) {
  814. // sell the long position
  815. Sell[ i ] = 1;
  816. SellPrice[ i ] = O[ i ];
  817. trend_position_buy = 0;
  818. // now go short in trend mode
  819. Short[ i ] = 1;
  820. ShortPrice[ i ] = LBOP[ i ];
  821. trend_position_short = 1;
  822. tpss[ i ] = 1;
  823. }
  824. } else
  825. /* short trend mode position, exit at the trailing stop, 4 entry areas of interest
  826. 1) open between LBOP and trailstop_short (area 1)
  827. 2) open between trailstop_short and HBOP (area 2)
  828. 3) open below LBOP (area 3)
  829. 4) open above HBOP (area 4)
  830. */
  831. if ( (phase_arr[ i ] == 1 OR phase_arr[ i ] == 2 OR phase_arr[ i ] == 3) AND 
  832. reaction_position_buy == 0 AND trend_position_buy == 0 AND 
  833. reaction_position_short == 0 AND trend_position_short == 1) {
  834. // open in area 1
  835. if (O[ i ] < trailstop_short[ i ] AND O[ i ] > LBOP[ i ]) {
  836. // entry of area 2
  837. if (H[ i ] >= trailstop_short[ i ]) {
  838. // cover short position, short trend mode is stopped out
  839. Cover[ i ] = 1;
  840. CoverPrice[ i ] = trailstop_short[ i ];
  841. trend_position_short = 0;
  842. // enter are 4
  843. if (H[ i ] >= HBOP[ i ]) {
  844. // enter long position
  845. Buy[ i ] = 1;
  846. BuyPrice[ i ] = HBOP[ i ];
  847. trend_position_buy = 1;
  848. tpsl[ i ] = 1;
  849. }
  850. // entry of area 3 *** nothing done here
  851. } else
  852. // open in area 2
  853. if (O[ i ] >= trailstop_short[ i ] AND O[ i ] < HBOP[ i ]) {
  854. // cover short position, stopped
  855. Cover[ i ] = 1;
  856. CoverPrice[ i ] = O[ i ];
  857. trend_position_short = 0;
  858. // enter area 4
  859. if (H[ i ] >= HBOP[ i ]) {
  860. // go long
  861. Buy[ i ] = 1;
  862. BuyPrice[ i ] = HBOP[ i ];
  863. trend_position_buy = 1;
  864. tpsl[ i ] = 1;
  865. } else
  866. // enter area 3
  867. if (L[ i ] <= LBOP[ i ]) {
  868. // go short
  869. Short[ i ] = 1;
  870. ShortPrice[ i ] = LBOP[ i ];
  871. trend_position_short = 1;
  872. tpss[ i ] = 1;
  873. }
  874. } else
  875. // open in area 3 *** nothing done here
  876. // open in area 4
  877. if (O[ i ] >= HBOP[ i ]) {
  878. // cover short position
  879. Cover[ i ] = 1;
  880. CoverPrice[ i ] = O[ i ];
  881. trend_position_short = 0;
  882. // go long
  883. Buy[ i ] = 1;
  884. BuyPrice[ i ] = O[ i ];
  885. trend_position_buy = 1;
  886. tpsl[ i ] = 1;
  887. }
  888. }
  889. // *** extra code that is needed for intraday data ***
  890. // "B" day PLUS LONG reaction mode position. 3 Entry areas of interest
  891. //1) open between LBOP and HBOP (area 1)
  892. //2) open below LBOP (area 2)
  893. //3) open above HBOP (area 3)
  894. //check for outbreak on "B" day having a long position
  895. if (phase_arr[ i ] == 1 AND reaction_position_buy == 1 AND trend_position_buy == 0 AND 
  896. reaction_position_short == 0 AND trend_position_short == 0) {
  897. // open in area 1
  898. if (O[ i ] > LBOP[ i ] AND O[ i ] < HBOP[ i ]) {
  899. // enter area 2
  900. if (L[ i ] <= LBOP[ i ]) {
  901. // sell long position
  902. Sell[ i ] = 1;
  903. SellPrice[ i ] = LBOP[ i ];
  904. reaction_position_buy = 0;
  905. // go short in trend mode
  906. Short[ i ] = 1;
  907. ShortPrice[ i ] = LBOP[ i ];
  908. trend_position_short = 1;
  909. tpss[ i ] =1;
  910. } else
  911. // enter area 3
  912. if (H[ i ] >= HBOP[ i ]) {
  913. reaction_position_buy = 0;
  914. trend_position_buy = 1;
  915. tpsl[ i ] = 1;
  916. }
  917. } else
  918. // open in area 2
  919. if (O[ i ] <= LBOP[ i ]) {
  920. // sell long position
  921. Sell[ i ] = 1;
  922. SellPrice[ i ] = O[ i ];
  923. reaction_position_buy = 0;
  924. // go short in trend mode
  925. Short[ i ] = 1;
  926. ShortPrice[ i ] = O[ i ];
  927. trend_position_short = 1;
  928. tpss[ i ] = 1;
  929. } else
  930. // open in area 3
  931. if (O[ i ] >= HBOP[ i ]) {
  932. // only change the mode
  933. reaction_position_buy = 0;
  934. trend_position_buy = 1;
  935. tpsl[ i ] = 1;
  936. }
  937. } else
  938. // *** extra code that is needed for intraday data ***
  939. // "S" day PLUS SHORT reaction mode position. 3 Entry areas of interest
  940. //1) open between LBOP and HBOP (area 1)
  941. //2) open below LBOP (area 2)
  942. //3) open above HBOP (area 3)
  943. //check for outbreak on "S" day having a short position
  944. if (phase_arr[ i ] == 3 AND reaction_position_buy == 0 AND trend_position_buy == 0 AND 
  945. reaction_position_short == 1 AND trend_position_short == 0) {
  946. // open in area 1
  947. if (O[ i ] > LBOP[ i ] AND O[ i ] < HBOP[ i ]) {
  948. // enter area 2
  949. if (L[ i ] <= LBOP[ i ]) {
  950. // change mode only
  951. reaction_position_short = 0;
  952. trend_position_short = 1;
  953. tpss[ i ] = 1;
  954. } else
  955. // enter area 3
  956. if (H[ i ] >= HBOP[ i ]) {
  957. // cover short position
  958. Cover[ i ] = 1;
  959. CoverPrice[ i ] = HBOP[ i ];
  960. reaction_position_short = 0;
  961. // go long in trend mode
  962. Buy[ i ] = 1;
  963. BuyPrice[ i ] = HBOP[ i ];
  964. trend_position_buy = 1;
  965. tpsl[ i ] = 1;
  966. }
  967. } else
  968. // open in area 2
  969. if (O[ i ] <= LBOP[ i ]) {
  970. // only change the mode
  971. reaction_position_short = 0;
  972. trend_position_short = 1;
  973. tpss[ i ] = 1;
  974. } else
  975. // open in area 3
  976. if (O[ i ] >= HBOP[ i ]) {
  977. // cover short position
  978. Cover[ i ] = 1;
  979. CoverPrice[ i ] = O[ i ];
  980. reaction_position_short = 0;
  981. // go long in trend mode
  982. Buy[ i ] = 1;
  983. BuyPrice[ i ] = O[ i ];
  984. trend_position_buy = 1;
  985. tpsl[ i ] = 1;
  986. }
  987. }
  988. }
  989. // --------------------------------------
  990. // For Chart 
  991. Plot(C,"",1,64);
  992. // define title
  993. Title=Name()+ ",  O: "+WriteVal(O)+ ",  H: "+WriteVal(H)+ ",  L: "+WriteVal(L)+ ",  C: "+WriteVal(C) +
  994. EncodeColor( colorOrange ) + ",  HBOP: " + EncodeColor( colorWhite ) + WriteVal(HBOP) +
  995. EncodeColor( colorRed ) + ",  S1: " + EncodeColor( colorWhite ) + WriteVal(HBOP) +
  996. EncodeColor( colorBrightGreen ) + ",  B1: " + EncodeColor( colorWhite ) + WriteVal(HBOP) +
  997. EncodeColor( colorGreen ) + ",  LBOP: " + EncodeColor( colorWhite ) + WriteVal(HBOP);
  998. // buy, sell, short and cover symbols
  999. PlotShapes(shapeUpArrow*Buy,colorWhite,0,BuyPrice,0);
  1000. PlotShapes(shapeDownArrow*Sell,colorYellow,0,SellPrice,0);
  1001. PlotShapes(shapeHollowDownArrow*Short,colorYellow,0,ShortPrice,-15);
  1002. PlotShapes(shapeHollowUpArrow*Cover,colorWhite,0,CoverPrice,-15);
  1003. // triagle show breakouts 
  1004. PlotShapes(shapeUpTriangle*tpsl,colorWhite,0,BuyPrice,0);
  1005. PlotShapes(shapeDownTriangle*tpss,colorYellow,0,ShortPrice,-15);
  1006. // 1 = "B" day, 2 = "O" day, 3 = "S" day
  1007. PlotShapes(shapeDigit1 * (hlp_phase == 1),IIF(hlp_b == 1,colorYellow,colorWhite),0, HBOP,0);
  1008. PlotShapes(shapeDigit2 * (hlp_phase == 2),colorWhite,0, HBOP,0);
  1009. PlotShapes(shapeDigit3 * (hlp_phase == 3),IIF(hlp_s == 1,colorYellow,colorWhite),0, HBOP,0);
  1010. // lightblue digits at days where original phase is used for the calculation.
  1011. PlotShapes(shapeDigit1 * (hlp_phase_l1 == 1),colorLightBlue,0, HBOP,-15);
  1012. PlotShapes(shapeDigit3 * (hlp_phase_l1 == 3),colorLightBlue,0, HBOP,-15);
  1013. // draw levels
  1014. Plot(B1,"",colorBrightGreen,1);
  1015. Plot(S1,"",colorRed,1);
  1016. Plot(HBOP,"",colorOrange,1);
  1017. Plot(LBOP,"",colorGreen,1);
  1018. // for analysis purposes
  1019. Filter = 1;
  1020. AddColumn(phase_arr,"Phase");
  1021. Addcolumn(LBOP,"LBOP");
  1022. AddColumn(O,"O");
  1023. AddColumn(buy,"buy");
  1024. AddColumn(sell,"sell");
  1025. AddColumn(short,"short");
  1026. AddColumn(cover,"cover");
  1027. AddColumn(tpsl,"tpsl");
  1028. AddColumn(tpss,"tpss");