Advertisement
Guest User

Fuzzy Logic Example Build 23 - TOS

a guest
Mar 21st, 2019
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 58.70 KB | None | 0 0
  1. # Fuzzy Logic Example
  2. # Build 23
  3.  
  4. # The vast majority of this code has already been posted on reddit r/TheWallStreet by u/zoyosjd. This example shows how to take # well known reversal, momentum, and deviation based indicators, apply the concept of fuzzy logic to all of them to create a # single far more accurate but sligtly lagging indicator. As such it does give false signals which can be reduced with # optimizations.
  5.  
  6. # This particular build is best viewed on the 5 day / 1 minute charts. All indicators have been reduced to quick view format. # Scroll to total skews section for more comments.
  7.  
  8. def price = close;
  9.  
  10. # StopsLoss and TakeProfit
  11.  
  12. def WideStop = 4;
  13. def NarrowStop = 1;
  14. def WideProfit = 8;
  15. def NarrowProfit = 2;
  16.  
  17.  
  18. # StandardDevChannel Series
  19.  
  20. def regression = InertiaAll(close);
  21. def stdDeviation = StDevAll(close);
  22.  
  23. def STDCpos1 = regression + stdDeviation ;
  24. def STDCneg1 = regression - stdDeviation ;
  25.  
  26. def STDCgradientMax = 30;
  27. def STDCgradientMin = -1 * STDCgradientMax;
  28.  
  29. def STDCgradientCheck = IsNaN(((price - STDCneg1) * (STDCgradientMax - STDCgradientMin) / (STDCpos1 - STDCneg1) + STDCgradientMin));
  30.  
  31. def STDCgradient = If(STDCgradientCheck == 1, 0, ((price - STDCneg1) * (STDCgradientMax - STDCgradientMin) / (STDCpos1 - STDCneg1) + STDCgradientMin));
  32.  
  33. # Multi Time Frame Reversal Momentum
  34.  
  35. input signalOffsetFactor_min_MTFA_RM = 0.50;
  36.  
  37. def LongSignal_min_MTFA_RM;
  38. def ShortSignal_min_MTFA_RM;
  39. def NeutralSignal_min_MTFA_RM;
  40.  
  41. def Period_min_close_min_MTFA_RM = close(period = AggregationPeriod.MIN);
  42. def Period_min_open_min_MTFA_RM = open(period = AggregationPeriod.MIN);
  43. def Period_min_high_min_MTFA_RM = high(period = AggregationPeriod.MIN);
  44. def Period_min_low_min_MTFA_RM = low(period = AggregationPeriod.MIN);
  45.  
  46. def signalOffset_min_MTFA_RM = Average(TrueRange(Period_min_high_min_MTFA_RM , Period_min_close_min_MTFA_RM , Period_min_low_min_MTFA_RM ), 9) * signalOffsetFactor_min_MTFA_RM;
  47.  
  48. def triggerSell_min_MTFA_RM = If((Period_min_high_min_MTFA_RM - Period_min_close_min_MTFA_RM > Period_min_close_min_MTFA_RM - Period_min_low_min_MTFA_RM ) and (Period_min_high_min_MTFA_RM - Period_min_close_min_MTFA_RM > AbsValue(Period_min_close_min_MTFA_RM [1] - Period_min_open_min_MTFA_RM [1])), 1, 0);
  49.  
  50.  
  51. def triggerBuy_min_MTFA_RM = If((Period_min_high_min_MTFA_RM - Period_min_close_min_MTFA_RM < Period_min_close_min_MTFA_RM - Period_min_low_min_MTFA_RM ) and (Period_min_close_min_MTFA_RM - Period_min_low_min_MTFA_RM > AbsValue(Period_min_close_min_MTFA_RM [1] - Period_min_open_min_MTFA_RM [1])), 1, 0);
  52.  
  53. LongSignal_min_MTFA_RM = if triggerBuy_min_MTFA_RM == 1 && triggerSell_min_MTFA_RM == 0 then 1 else Double.NaN;
  54.  
  55. ShortSignal_min_MTFA_RM = if triggerSell_min_MTFA_RM == 1 && triggerBuy_min_MTFA_RM == 0 then 1 else Double.NaN;
  56.  
  57. NeutralSignal_min_MTFA_RM = if ( triggerBuy_min_MTFA_RM == 0 && triggerSell_min_MTFA_RM == 0 or triggerBuy_min_MTFA_RM == 1 && triggerSell_min_MTFA_RM == 1) then 1 else Double.NaN;
  58.  
  59.  
  60. AddLabel(1, "Reversal Momentum Series", Color.ORANGE);
  61. AddLabel(LongSignal_min_MTFA_RM, "min", Color.DARK_GREEN);
  62. AddLabel(ShortSignal_min_MTFA_RM, "min", Color.DARK_RED);
  63. AddLabel(NeutralSignal_min_MTFA_RM, "min", Color.WHITE);
  64.  
  65. input signalOffsetFactor_fifteen_min_MTFA_RM = 0.50;
  66.  
  67.  
  68. def LongSignal_fifteen_min_MTFA_RM;
  69. def ShortSignal_fifteen_min_MTFA_RM;
  70. def NeutralSignal_fifteen_min_MTFA_RM;
  71.  
  72. def Period_fifteen_min_close_fifteen_min_MTFA_RM = close(period = AggregationPeriod.FIFTEEN_MIN);
  73. def Period_fifteen_min_open_fifteen_min_MTFA_RM = open(period = AggregationPeriod.FIFTEEN_MIN);
  74. def Period_fifteen_min_high_fifteen_min_MTFA_RM = high(period = AggregationPeriod.FIFTEEN_MIN);
  75. def Period_fifteen_min_low_fifteen_min_MTFA_RM = low(period = AggregationPeriod.FIFTEEN_MIN);
  76.  
  77. def signalOffset_fifteen_min_MTFA_RM = Average(TrueRange(Period_fifteen_min_high_fifteen_min_MTFA_RM , Period_fifteen_min_close_fifteen_min_MTFA_RM , Period_fifteen_min_low_fifteen_min_MTFA_RM ), 9) * signalOffsetFactor_fifteen_min_MTFA_RM;
  78.  
  79. def triggerSell_fifteen_min_MTFA_RM = If((Period_fifteen_min_high_fifteen_min_MTFA_RM - Period_fifteen_min_close_fifteen_min_MTFA_RM > Period_fifteen_min_close_fifteen_min_MTFA_RM - Period_fifteen_min_low_fifteen_min_MTFA_RM ) and (Period_fifteen_min_high_fifteen_min_MTFA_RM - Period_fifteen_min_close_fifteen_min_MTFA_RM > AbsValue(Period_fifteen_min_close_fifteen_min_MTFA_RM [1] - Period_fifteen_min_open_fifteen_min_MTFA_RM [1])), 1, 0);
  80.  
  81.  
  82. def triggerBuy_fifteen_min_MTFA_RM = If((Period_fifteen_min_high_fifteen_min_MTFA_RM - Period_fifteen_min_close_fifteen_min_MTFA_RM < Period_fifteen_min_close_fifteen_min_MTFA_RM - Period_fifteen_min_low_fifteen_min_MTFA_RM ) and (Period_fifteen_min_close_fifteen_min_MTFA_RM - Period_fifteen_min_low_fifteen_min_MTFA_RM > AbsValue(Period_fifteen_min_close_fifteen_min_MTFA_RM [1] - Period_fifteen_min_open_fifteen_min_MTFA_RM [1])), 1, 0);
  83.  
  84. LongSignal_fifteen_min_MTFA_RM = if triggerBuy_fifteen_min_MTFA_RM == 1 && triggerSell_fifteen_min_MTFA_RM == 0 then 1 else Double.NaN;
  85.  
  86. ShortSignal_fifteen_min_MTFA_RM = if triggerSell_fifteen_min_MTFA_RM == 1 && triggerBuy_fifteen_min_MTFA_RM == 0 then 1 else Double.NaN;
  87.  
  88. NeutralSignal_fifteen_min_MTFA_RM = if ( triggerBuy_fifteen_min_MTFA_RM == 0 && triggerSell_fifteen_min_MTFA_RM == 0 or triggerBuy_fifteen_min_MTFA_RM == 1 && triggerSell_fifteen_min_MTFA_RM == 1) then 1 else Double.NaN;
  89.  
  90.  
  91. AddLabel(LongSignal_fifteen_min_MTFA_RM, "fifteen_min", Color.DARK_GREEN);
  92. AddLabel(ShortSignal_fifteen_min_MTFA_RM, "fifteen_min", Color.DARK_RED);
  93. AddLabel(NeutralSignal_fifteen_min_MTFA_RM, "fifteen_min", Color.WHITE);
  94.  
  95. input signalOffsetFactor_hour_MTFA_RM = 0.50;
  96.  
  97.  
  98. def LongSignal_hour_MTFA_RM;
  99. def ShortSignal_hour_MTFA_RM;
  100. def NeutralSignal_hour_MTFA_RM;
  101.  
  102. def Period_hour_close_hour_MTFA_RM = close(period = AggregationPeriod.HOUR);
  103. def Period_hour_open_hour_MTFA_RM = open(period = AggregationPeriod.HOUR);
  104. def Period_hour_high_hour_MTFA_RM = high(period = AggregationPeriod.HOUR);
  105. def Period_hour_low_hour_MTFA_RM = low(period = AggregationPeriod.HOUR);
  106.  
  107. def signalOffset_hour_MTFA_RM = Average(TrueRange(Period_hour_high_hour_MTFA_RM , Period_hour_close_hour_MTFA_RM , Period_hour_low_hour_MTFA_RM ), 9) * signalOffsetFactor_hour_MTFA_RM;
  108.  
  109. def triggerSell_hour_MTFA_RM = If((Period_hour_high_hour_MTFA_RM - Period_hour_close_hour_MTFA_RM > Period_hour_close_hour_MTFA_RM - Period_hour_low_hour_MTFA_RM ) and (Period_hour_high_hour_MTFA_RM - Period_hour_close_hour_MTFA_RM > AbsValue(Period_hour_close_hour_MTFA_RM [1] - Period_hour_open_hour_MTFA_RM [1])), 1, 0);
  110.  
  111.  
  112. def triggerBuy_hour_MTFA_RM = If((Period_hour_high_hour_MTFA_RM - Period_hour_close_hour_MTFA_RM < Period_hour_close_hour_MTFA_RM - Period_hour_low_hour_MTFA_RM ) and (Period_hour_close_hour_MTFA_RM - Period_hour_low_hour_MTFA_RM > AbsValue(Period_hour_close_hour_MTFA_RM [1] - Period_hour_open_hour_MTFA_RM [1])), 1, 0);
  113.  
  114. LongSignal_hour_MTFA_RM = if triggerBuy_hour_MTFA_RM == 1 && triggerSell_hour_MTFA_RM == 0 then 1 else Double.NaN;
  115.  
  116. ShortSignal_hour_MTFA_RM = if triggerSell_hour_MTFA_RM == 1 && triggerBuy_hour_MTFA_RM == 0 then 1 else Double.NaN;
  117.  
  118. NeutralSignal_hour_MTFA_RM = if ( triggerBuy_hour_MTFA_RM == 0 && triggerSell_hour_MTFA_RM == 0 or triggerBuy_hour_MTFA_RM == 1 && triggerSell_hour_MTFA_RM == 1) then 1 else Double.NaN;
  119.  
  120.  
  121. AddLabel(LongSignal_hour_MTFA_RM, "hour", Color.DARK_GREEN);
  122. AddLabel(ShortSignal_hour_MTFA_RM, "hour", Color.DARK_RED);
  123. AddLabel(NeutralSignal_hour_MTFA_RM, "hour", Color.WHITE);
  124.  
  125. input signalOffsetFactor_four_hours_MTFA_RM = 0.50;
  126.  
  127.  
  128. def LongSignal_four_hours_MTFA_RM;
  129. def ShortSignal_four_hours_MTFA_RM;
  130. def NeutralSignal_four_hours_MTFA_RM;
  131.  
  132. def Period_four_hours_close_four_hours_MTFA_RM = close(period = AggregationPeriod.FOUR_HOURS);
  133. def Period_four_hours_open_four_hours_MTFA_RM = open(period = AggregationPeriod.FOUR_HOURS);
  134. def Period_four_hours_high_four_hours_MTFA_RM = high(period = AggregationPeriod.FOUR_HOURS);
  135. def Period_four_hours_low_four_hours_MTFA_RM = low(period = AggregationPeriod.FOUR_HOURS);
  136.  
  137. def signalOffset_four_hours_MTFA_RM = Average(TrueRange(Period_four_hours_high_four_hours_MTFA_RM , Period_four_hours_close_four_hours_MTFA_RM , Period_four_hours_low_four_hours_MTFA_RM ), 9) * signalOffsetFactor_four_hours_MTFA_RM;
  138.  
  139. def triggerSell_four_hours_MTFA_RM = If((Period_four_hours_high_four_hours_MTFA_RM - Period_four_hours_close_four_hours_MTFA_RM > Period_four_hours_close_four_hours_MTFA_RM - Period_four_hours_low_four_hours_MTFA_RM ) and (Period_four_hours_high_four_hours_MTFA_RM - Period_four_hours_close_four_hours_MTFA_RM > AbsValue(Period_four_hours_close_four_hours_MTFA_RM [1] - Period_four_hours_open_four_hours_MTFA_RM [1])), 1, 0);
  140.  
  141.  
  142. def triggerBuy_four_hours_MTFA_RM = If((Period_four_hours_high_four_hours_MTFA_RM - Period_four_hours_close_four_hours_MTFA_RM < Period_four_hours_close_four_hours_MTFA_RM - Period_four_hours_low_four_hours_MTFA_RM ) and (Period_four_hours_close_four_hours_MTFA_RM - Period_four_hours_low_four_hours_MTFA_RM > AbsValue(Period_four_hours_close_four_hours_MTFA_RM [1] - Period_four_hours_open_four_hours_MTFA_RM [1])), 1, 0);
  143.  
  144. LongSignal_four_hours_MTFA_RM = if triggerBuy_four_hours_MTFA_RM == 1 && triggerSell_four_hours_MTFA_RM == 0 then 1 else Double.NaN;
  145.  
  146. ShortSignal_four_hours_MTFA_RM = if triggerSell_four_hours_MTFA_RM == 1 && triggerBuy_four_hours_MTFA_RM == 0 then 1 else Double.NaN;
  147.  
  148. NeutralSignal_four_hours_MTFA_RM = if ( triggerBuy_four_hours_MTFA_RM == 0 && triggerSell_four_hours_MTFA_RM == 0 or triggerBuy_four_hours_MTFA_RM == 1 && triggerSell_four_hours_MTFA_RM == 1) then 1 else Double.NaN;
  149.  
  150.  
  151. AddLabel(LongSignal_four_hours_MTFA_RM, "four_hours", Color.DARK_GREEN);
  152. AddLabel(ShortSignal_four_hours_MTFA_RM, "four_hours", Color.DARK_RED);
  153. AddLabel(NeutralSignal_four_hours_MTFA_RM, "four_hours", Color.WHITE);
  154.  
  155. input signalOffsetFactor_week_MTFA_RM = 0.50;
  156.  
  157. def LongSignal_week_MTFA_RM;
  158. def ShortSignal_week_MTFA_RM;
  159. def NeutralSignal_week_MTFA_RM;
  160.  
  161. def Period_week_close_week_MTFA_RM = close(period = AggregationPeriod.WEEK);
  162. def Period_week_open_week_MTFA_RM = open(period = AggregationPeriod.WEEK);
  163. def Period_week_high_week_MTFA_RM = high(period = AggregationPeriod.WEEK);
  164. def Period_week_low_week_MTFA_RM = low(period = AggregationPeriod.WEEK);
  165.  
  166. def signalOffset_week_MTFA_RM = Average(TrueRange(Period_week_high_week_MTFA_RM , Period_week_close_week_MTFA_RM , Period_week_low_week_MTFA_RM ), 9) * signalOffsetFactor_week_MTFA_RM;
  167.  
  168. def triggerSell_week_MTFA_RM = If((Period_week_high_week_MTFA_RM - Period_week_close_week_MTFA_RM > Period_week_close_week_MTFA_RM - Period_week_low_week_MTFA_RM ) and (Period_week_high_week_MTFA_RM - Period_week_close_week_MTFA_RM > AbsValue(Period_week_close_week_MTFA_RM [1] - Period_week_open_week_MTFA_RM [1])), 1, 0);
  169.  
  170.  
  171. def triggerBuy_week_MTFA_RM = If((Period_week_high_week_MTFA_RM - Period_week_close_week_MTFA_RM < Period_week_close_week_MTFA_RM - Period_week_low_week_MTFA_RM ) and (Period_week_close_week_MTFA_RM - Period_week_low_week_MTFA_RM > AbsValue(Period_week_close_week_MTFA_RM [1] - Period_week_open_week_MTFA_RM [1])), 1, 0);
  172.  
  173. LongSignal_week_MTFA_RM = if triggerBuy_week_MTFA_RM == 1 && triggerSell_week_MTFA_RM == 0 then 1 else Double.NaN;
  174.  
  175. ShortSignal_week_MTFA_RM = if triggerSell_week_MTFA_RM == 1 && triggerBuy_week_MTFA_RM == 0 then 1 else Double.NaN;
  176.  
  177. NeutralSignal_week_MTFA_RM = if ( triggerBuy_week_MTFA_RM == 0 && triggerSell_week_MTFA_RM == 0 or triggerBuy_week_MTFA_RM == 1 && triggerSell_week_MTFA_RM == 1) then 1 else Double.NaN;
  178.  
  179.  
  180. AddLabel(LongSignal_week_MTFA_RM, "week", Color.DARK_GREEN);
  181. AddLabel(ShortSignal_week_MTFA_RM, "week", Color.DARK_RED);
  182. AddLabel(NeutralSignal_week_MTFA_RM, "week", Color.WHITE);
  183.  
  184. # Outside Reversal Series
  185.  
  186. declare once_per_bar;
  187.  
  188. input BarMultiplier_min_OR = 1.25;
  189. input BarsBack_min_OR = 50;
  190.  
  191. def Period_min_OR_close;
  192. def Period_min_OR_open;
  193. def Period_min_OR_high;
  194. def Period_min_OR_low;
  195. def Long_min_OR;
  196. def Short_min_OR;
  197. def LongSignal_min_OR;
  198. def ShortSignal_min_OR;
  199. def NeutralSignal_min_OR;
  200.  
  201. Period_min_OR_close = close(period = AggregationPeriod.MIN);
  202. Period_min_OR_open = open(period = AggregationPeriod.MIN);
  203. Period_min_OR_high = high(period = AggregationPeriod.MIN);
  204. Period_min_OR_low = low(period = AggregationPeriod.MIN);
  205.  
  206. def MyCandleSize_min_OR = (Period_min_OR_high - Period_min_OR_low);
  207. def AverageCandle_min_OR = Average(MyCandleSize_min_OR, BarsBack_min_OR);
  208. def Bar_min_OR = BarNumber();
  209.  
  210. Long_min_OR = if Period_min_OR_low < Period_min_OR_low[1]
  211. and Period_min_OR_close > Period_min_OR_high[1]
  212. and ((Period_min_OR_high - Period_min_OR_low) >= (AverageCandle_min_OR * BarMultiplier_min_OR))
  213. then 1 else 0;
  214.  
  215. Short_min_OR = if Period_min_OR_high > Period_min_OR_high[1]
  216. and Period_min_OR_close < Period_min_OR_low[1]
  217. and ((Period_min_OR_high - Period_min_OR_low) >= (AverageCandle_min_OR * BarMultiplier_min_OR))
  218. then 1 else 0;
  219.  
  220. LongSignal_min_OR = if Long_min_OR == 1 && Short_min_OR == 0 then 1 else Double.NaN;
  221.  
  222. ShortSignal_min_OR = if Short_min_OR == 1 && Long_min_OR == 0 then 1 else Double.NaN;
  223.  
  224. NeutralSignal_min_OR = if ( Long_min_OR == 0 && Short_min_OR == 0 or Long_min_OR == 1 && Short_min_OR == 1) then 1 else Double.NaN;
  225.  
  226. AddLabel(1, "Outside Reversal Series", Color.ORANGE);
  227. AddLabel(LongSignal_min_OR, "min", Color.DARK_GREEN);
  228. AddLabel(ShortSignal_min_OR, "min", Color.DARK_RED);
  229. AddLabel(NeutralSignal_min_OR, "min", Color.WHITE);
  230.  
  231. input BarMultiplier_fifteen_min_OR = 1.25;
  232. input BarsBack_fifteen_min_OR = 50;
  233.  
  234. def Period_fifteen_min_OR_close;
  235. def Period_fifteen_min_OR_open;
  236. def Period_fifteen_min_OR_high;
  237. def Period_fifteen_min_OR_low;
  238. def Long_fifteen_min_OR;
  239. def Short_fifteen_min_OR;
  240. def LongSignal_fifteen_min_OR;
  241. def ShortSignal_fifteen_min_OR;
  242. def NeutralSignal_fifteen_min_OR;
  243.  
  244. Period_fifteen_min_OR_close = close(period = AggregationPeriod.FIFTEEN_MIN);
  245. Period_fifteen_min_OR_open = open(period = AggregationPeriod.FIFTEEN_MIN);
  246. Period_fifteen_min_OR_high = high(period = AggregationPeriod.FIFTEEN_MIN);
  247. Period_fifteen_min_OR_low = low(period = AggregationPeriod.FIFTEEN_MIN);
  248.  
  249. def MyCandleSize_fifteen_min_OR = (Period_fifteen_min_OR_high - Period_fifteen_min_OR_low);
  250. def AverageCandle_fifteen_min_OR = Average(MyCandleSize_fifteen_min_OR, BarsBack_fifteen_min_OR);
  251. def Bar_fifteen_min_OR = BarNumber();
  252.  
  253. Long_fifteen_min_OR = if Period_fifteen_min_OR_low < Period_fifteen_min_OR_low[1]
  254. and Period_fifteen_min_OR_close > Period_fifteen_min_OR_high[1]
  255. and ((Period_fifteen_min_OR_high - Period_fifteen_min_OR_low) >= (AverageCandle_fifteen_min_OR * BarMultiplier_fifteen_min_OR))
  256. then 1 else 0;
  257.  
  258. Short_fifteen_min_OR = if Period_fifteen_min_OR_high > Period_fifteen_min_OR_high[1]
  259. and Period_fifteen_min_OR_close < Period_fifteen_min_OR_low[1]
  260. and ((Period_fifteen_min_OR_high - Period_fifteen_min_OR_low) >= (AverageCandle_fifteen_min_OR * BarMultiplier_fifteen_min_OR))
  261. then 1 else 0;
  262.  
  263. LongSignal_fifteen_min_OR = if Long_fifteen_min_OR == 1 && Short_fifteen_min_OR == 0 then 1 else Double.NaN;
  264.  
  265. ShortSignal_fifteen_min_OR = if Short_fifteen_min_OR == 1 && Long_fifteen_min_OR == 0 then 1 else Double.NaN;
  266.  
  267. NeutralSignal_fifteen_min_OR = if ( Long_fifteen_min_OR == 0 && Short_fifteen_min_OR == 0 or Long_fifteen_min_OR == 1 && Short_fifteen_min_OR == 1) then 1 else Double.NaN;
  268.  
  269. AddLabel(LongSignal_fifteen_min_OR, "fifteen_min", Color.DARK_GREEN);
  270. AddLabel(ShortSignal_fifteen_min_OR, "fifteen_min", Color.DARK_RED);
  271. AddLabel(NeutralSignal_fifteen_min_OR, "fifteen_min", Color.WHITE);
  272.  
  273. input BarMultiplier_hour_OR = 1.25;
  274. input BarsBack_hour_OR = 50;
  275.  
  276. def Period_hour_OR_close;
  277. def Period_hour_OR_open;
  278. def Period_hour_OR_high;
  279. def Period_hour_OR_low;
  280. def Long_hour_OR;
  281. def Short_hour_OR;
  282. def LongSignal_hour_OR;
  283. def ShortSignal_hour_OR;
  284. def NeutralSignal_hour_OR;
  285.  
  286. Period_hour_OR_close = close(period = AggregationPeriod.HOUR);
  287. Period_hour_OR_open = open(period = AggregationPeriod.HOUR);
  288. Period_hour_OR_high = high(period = AggregationPeriod.HOUR);
  289. Period_hour_OR_low = low(period = AggregationPeriod.HOUR);
  290.  
  291. def MyCandleSize_hour_OR = (Period_hour_OR_high - Period_hour_OR_low);
  292. def AverageCandle_hour_OR = Average(MyCandleSize_hour_OR, BarsBack_hour_OR);
  293. def Bar_hour_OR = BarNumber();
  294.  
  295. Long_hour_OR = if Period_hour_OR_low < Period_hour_OR_low[1]
  296. and Period_hour_OR_close > Period_hour_OR_high[1]
  297. and ((Period_hour_OR_high - Period_hour_OR_low) >= (AverageCandle_hour_OR * BarMultiplier_hour_OR))
  298. then 1 else 0;
  299.  
  300. Short_hour_OR = if Period_hour_OR_high > Period_hour_OR_high[1]
  301. and Period_hour_OR_close < Period_hour_OR_low[1]
  302. and ((Period_hour_OR_high - Period_hour_OR_low) >= (AverageCandle_hour_OR * BarMultiplier_hour_OR))
  303. then 1 else 0;
  304.  
  305. LongSignal_hour_OR = if Long_hour_OR == 1 && Short_hour_OR == 0 then 1 else Double.NaN;
  306.  
  307. ShortSignal_hour_OR = if Short_hour_OR == 1 && Long_hour_OR == 0 then 1 else Double.NaN;
  308.  
  309. NeutralSignal_hour_OR = if ( Long_hour_OR == 0 && Short_hour_OR == 0 or Long_hour_OR == 1 && Short_hour_OR == 1) then 1 else Double.NaN;
  310.  
  311. AddLabel(LongSignal_hour_OR, "hour", Color.DARK_GREEN);
  312. AddLabel(ShortSignal_hour_OR, "hour", Color.DARK_RED);
  313. AddLabel(NeutralSignal_hour_OR, "hour", Color.WHITE);
  314.  
  315.  
  316. input BarMultiplier_four_hours_ORs = 1.25;
  317. input BarsBack_four_hours_ORs = 50;
  318.  
  319. def Period_four_hours_ORs_close;
  320. def Period_four_hours_ORs_open;
  321. def Period_four_hours_ORs_high;
  322. def Period_four_hours_ORs_low;
  323. def Long_four_hours_ORs;
  324. def Short_four_hours_ORs;
  325. def LongSignal_four_hours_ORs;
  326. def ShortSignal_four_hours_ORs;
  327. def NeutralSignal_four_hours_ORs;
  328.  
  329. Period_four_hours_ORs_close = close(period = AggregationPeriod.FOUR_HOURS);
  330. Period_four_hours_ORs_open = open(period = AggregationPeriod.FOUR_HOURS);
  331. Period_four_hours_ORs_high = high(period = AggregationPeriod.FOUR_HOURS);
  332. Period_four_hours_ORs_low = low(period = AggregationPeriod.FOUR_HOURS);
  333.  
  334. def MyCandleSize_four_hours_ORs = (Period_four_hours_ORs_high - Period_four_hours_ORs_low);
  335. def AverageCandle_four_hours_ORs = Average(MyCandleSize_four_hours_ORs, BarsBack_four_hours_ORs);
  336. def Bar_four_hours_ORs = BarNumber();
  337.  
  338. Long_four_hours_ORs = if Period_four_hours_ORs_low < Period_four_hours_ORs_low[1]
  339. and Period_four_hours_ORs_close > Period_four_hours_ORs_high[1]
  340. and ((Period_four_hours_ORs_high - Period_four_hours_ORs_low) >= (AverageCandle_four_hours_ORs * BarMultiplier_four_hours_ORs))
  341. then 1 else 0;
  342.  
  343. Short_four_hours_ORs = if Period_four_hours_ORs_high > Period_four_hours_ORs_high[1]
  344. and Period_four_hours_ORs_close < Period_four_hours_ORs_low[1]
  345. and ((Period_four_hours_ORs_high - Period_four_hours_ORs_low) >= (AverageCandle_four_hours_ORs * BarMultiplier_four_hours_ORs))
  346. then 1 else 0;
  347.  
  348. LongSignal_four_hours_ORs = if Long_four_hours_ORs == 1 && Short_four_hours_ORs == 0 then 1 else Double.NaN;
  349.  
  350. ShortSignal_four_hours_ORs = if Short_four_hours_ORs == 1 && Long_four_hours_ORs == 0 then 1 else Double.NaN;
  351.  
  352. NeutralSignal_four_hours_ORs = if ( Long_four_hours_ORs == 0 && Short_four_hours_ORs == 0 or Long_four_hours_ORs == 1 && Short_four_hours_ORs == 1) then 1 else Double.NaN;
  353.  
  354. AddLabel(LongSignal_four_hours_ORs, "four_hours", Color.DARK_GREEN);
  355. AddLabel(ShortSignal_four_hours_ORs, "four_hours", Color.DARK_RED);
  356. AddLabel(NeutralSignal_four_hours_ORs, "four_hours", Color.WHITE);
  357.  
  358. input BarMultiplier_week_ORs = 1.25;
  359. input BarsBack_week_ORs = 50;
  360.  
  361. def Period_week_ORs_close;
  362. def Period_week_ORs_open;
  363. def Period_week_ORs_high;
  364. def Period_week_ORs_low;
  365. def Long_week_ORs;
  366. def Short_week_ORs;
  367. def LongSignal_week_ORs;
  368. def ShortSignal_week_ORs;
  369. def NeutralSignal_week_ORs;
  370.  
  371. Period_week_ORs_close = close(period = AggregationPeriod.WEEK);
  372. Period_week_ORs_open = open(period = AggregationPeriod.WEEK);
  373. Period_week_ORs_high = high(period = AggregationPeriod.WEEK);
  374. Period_week_ORs_low = low(period = AggregationPeriod.WEEK);
  375.  
  376. def MyCandleSize_week_ORs = (Period_week_ORs_high - Period_week_ORs_low);
  377. def AverageCandle_week_ORs = Average(MyCandleSize_week_ORs, BarsBack_week_ORs);
  378. def Bar_week_ORs = BarNumber();
  379.  
  380. Long_week_ORs = if Period_week_ORs_low < Period_week_ORs_low[1]
  381. and Period_week_ORs_close > Period_week_ORs_high[1]
  382. and ((Period_week_ORs_high - Period_week_ORs_low) >= (AverageCandle_week_ORs * BarMultiplier_week_ORs))
  383. then 1 else 0;
  384.  
  385. Short_week_ORs = if Period_week_ORs_high > Period_week_ORs_high[1]
  386. and Period_week_ORs_close < Period_week_ORs_low[1]
  387. and ((Period_week_ORs_high - Period_week_ORs_low) >= (AverageCandle_week_ORs * BarMultiplier_week_ORs))
  388. then 1 else 0;
  389.  
  390. LongSignal_week_ORs = if Long_week_ORs == 1 && Short_week_ORs == 0 then 1 else Double.NaN;
  391.  
  392. ShortSignal_week_ORs = if Short_week_ORs == 1 && Long_week_ORs == 0 then 1 else Double.NaN;
  393.  
  394. NeutralSignal_week_ORs = if ( Long_week_ORs == 0 && Short_week_ORs == 0 or Long_week_ORs == 1 && Short_week_ORs == 1) then 1 else Double.NaN;
  395.  
  396. AddLabel(LongSignal_week_ORs, "week", Color.DARK_GREEN);
  397. AddLabel(ShortSignal_week_ORs, "week", Color.DARK_RED);
  398. AddLabel(NeutralSignal_week_ORs, "week", Color.WHITE);
  399.  
  400.  
  401.  
  402.  
  403. # Extreme Reversal Series
  404.  
  405. input BodySize_min_ER = 0.525;
  406. input BarsBack_min_ER = 50;
  407. input BodyMultiplier_min_ER = 0.25;
  408.  
  409. def Period_min_ER_close;
  410. def Period_min_ER_open;
  411. def Period_min_ER_high;
  412. def Period_min_ER_low;
  413. def Long_min_ER;
  414. def Short_min_ER;
  415. def LongSignal_min_ER;
  416. def ShortSignal_min_ER;
  417. def NeutralSignal_min_ER;
  418.  
  419. Period_min_ER_close = close(period = AggregationPeriod.MIN);
  420. Period_min_ER_open = open(period = AggregationPeriod.MIN);
  421. Period_min_ER_high = high(period = AggregationPeriod.MIN);
  422. Period_min_ER_low = low(period = AggregationPeriod.MIN);
  423.  
  424.  
  425. def Bar_min_ER = BarNumber();
  426. def AverageBody_min_ER = Average(BodySize_min_ER, BarsBack_min_ER);
  427. def MyBodySize_min_ER = AbsValue(Period_min_ER_close - Period_min_ER_open);
  428. def MyCandleSize_min_ER = Period_min_ER_high - Period_min_ER_low;
  429. def AverageCandle_min_ER = Average(MyCandleSize_min_ER, BarsBack_min_ER);
  430.  
  431. Long_min_ER = if ((Period_min_ER_open[1] - Period_min_ER_close[1]) >= (BodySize_min_ER * (Period_min_ER_high[1] - Period_min_ER_low[1])))
  432. and ((Period_min_ER_high[1] - Period_min_ER_low[1]) > (AverageCandle_min_ER * BodyMultiplier_min_ER))
  433. and ((Period_min_ER_open[1] - Period_min_ER_close[1]) > AverageBody_min_ER)
  434. and (Period_min_ER_close > Period_min_ER_open) then 1 else 0;
  435.  
  436. Short_min_ER = if ((Period_min_ER_close[1] - Period_min_ER_open[1]) >= BodySize_min_ER * (Period_min_ER_high[1] - Period_min_ER_low[1]))
  437. and ((Period_min_ER_high[1] - Period_min_ER_low[1]) > (AverageCandle_min_ER * BodyMultiplier_min_ER))
  438. and ((Period_min_ER_close[1] - Period_min_ER_open[1]) > AverageBody_min_ER)
  439. and (Period_min_ER_open > Period_min_ER_close) then 1 else 0;
  440.  
  441. LongSignal_min_ER = if Long_min_ER == 1 && Short_min_ER == 0 then 1 else Double.NaN;
  442.  
  443. ShortSignal_min_ER = if Short_min_ER == 1 && Long_min_ER == 0 then 1 else Double.NaN;
  444.  
  445. NeutralSignal_min_ER = if ( Long_min_ER == 0 && Short_min_ER == 0 or Long_min_ER == 1 && Short_min_ER == 1) then 1 else Double.NaN;
  446.  
  447. AddLabel(1, "Extreme Reversal Series", Color.ORANGE);
  448. AddLabel(LongSignal_min_ER, "min", Color.DARK_GREEN);
  449. AddLabel(ShortSignal_min_ER, "min", Color.DARK_RED);
  450. AddLabel(NeutralSignal_min_ER, "min", Color.WHITE);
  451.  
  452. input BodySize_fifteen_min_ER = 0.525;
  453. input BarsBack_fifteen_min_ER = 50;
  454. input BodyMultiplier_fifteen_min_ER = 0.25;
  455.  
  456. def Period_fifteen_min_ER_close;
  457. def Period_fifteen_min_ER_open;
  458. def Period_fifteen_min_ER_high;
  459. def Period_fifteen_min_ER_low;
  460. def Long_fifteen_min_ER;
  461. def Short_fifteen_min_ER;
  462. def LongSignal_fifteen_min_ER;
  463. def ShortSignal_fifteen_min_ER;
  464. def NeutralSignal_fifteen_min_ER;
  465.  
  466. Period_fifteen_min_ER_close = close(period = AggregationPeriod.FIFTEEN_MIN);
  467. Period_fifteen_min_ER_open = open(period = AggregationPeriod.FIFTEEN_MIN);
  468. Period_fifteen_min_ER_high = high(period = AggregationPeriod.FIFTEEN_MIN);
  469. Period_fifteen_min_ER_low = low(period = AggregationPeriod.FIFTEEN_MIN);
  470.  
  471.  
  472. def Bar_fifteen_min_ER = BarNumber();
  473. def AverageBody_fifteen_min_ER = Average(BodySize_fifteen_min_ER, BarsBack_fifteen_min_ER);
  474. def MyBodySize_fifteen_min_ER = AbsValue(Period_fifteen_min_ER_close - Period_fifteen_min_ER_open);
  475. def MyCandleSize_fifteen_min_ER = Period_fifteen_min_ER_high - Period_fifteen_min_ER_low;
  476. def AverageCandle_fifteen_min_ER = Average(MyCandleSize_fifteen_min_ER, BarsBack_fifteen_min_ER);
  477.  
  478. Long_fifteen_min_ER = if ((Period_fifteen_min_ER_open[1] - Period_fifteen_min_ER_close[1]) >= (BodySize_fifteen_min_ER * (Period_fifteen_min_ER_high[1] - Period_fifteen_min_ER_low[1])))
  479. and ((Period_fifteen_min_ER_high[1] - Period_fifteen_min_ER_low[1]) > (AverageCandle_fifteen_min_ER * BodyMultiplier_fifteen_min_ER))
  480. and ((Period_fifteen_min_ER_open[1] - Period_fifteen_min_ER_close[1]) > AverageBody_fifteen_min_ER)
  481. and (Period_fifteen_min_ER_close > Period_fifteen_min_ER_open) then 1 else 0;
  482.  
  483. Short_fifteen_min_ER = if ((Period_fifteen_min_ER_close[1] - Period_fifteen_min_ER_open[1]) >= BodySize_fifteen_min_ER * (Period_fifteen_min_ER_high[1] - Period_fifteen_min_ER_low[1]))
  484. and ((Period_fifteen_min_ER_high[1] - Period_fifteen_min_ER_low[1]) > (AverageCandle_fifteen_min_ER * BodyMultiplier_fifteen_min_ER))
  485. and ((Period_fifteen_min_ER_close[1] - Period_fifteen_min_ER_open[1]) > AverageBody_fifteen_min_ER)
  486. and (Period_fifteen_min_ER_open > Period_fifteen_min_ER_close) then 1 else 0;
  487.  
  488. LongSignal_fifteen_min_ER = if Long_fifteen_min_ER == 1 && Short_fifteen_min_ER == 0 then 1 else Double.NaN;
  489.  
  490. ShortSignal_fifteen_min_ER = if Short_fifteen_min_ER == 1 && Long_fifteen_min_ER == 0 then 1 else Double.NaN;
  491.  
  492. NeutralSignal_fifteen_min_ER = if ( Long_fifteen_min_ER == 0 && Short_fifteen_min_ER == 0 or Long_fifteen_min_ER == 1 && Short_fifteen_min_ER == 1) then 1 else Double.NaN;
  493.  
  494. AddLabel(LongSignal_fifteen_min_ER, "fifteen_min", Color.DARK_GREEN);
  495. AddLabel(ShortSignal_fifteen_min_ER, "fifteen_min", Color.DARK_RED);
  496. AddLabel(NeutralSignal_fifteen_min_ER, "fifteen_min", Color.WHITE);
  497.  
  498. input BodySize_hour_ER = 0.525;
  499. input BarsBack_hour_ER = 50;
  500. input BodyMultiplier_hour_ER = 0.25;
  501.  
  502. def Period_hour_ER_close;
  503. def Period_hour_ER_open;
  504. def Period_hour_ER_high;
  505. def Period_hour_ER_low;
  506. def Long_hour_ER;
  507. def Short_hour_ER;
  508. def LongSignal_hour_ER;
  509. def ShortSignal_hour_ER;
  510. def NeutralSignal_hour_ER;
  511.  
  512. Period_hour_ER_close = close(period = AggregationPeriod.HOUR);
  513. Period_hour_ER_open = open(period = AggregationPeriod.HOUR);
  514. Period_hour_ER_high = high(period = AggregationPeriod.HOUR);
  515. Period_hour_ER_low = low(period = AggregationPeriod.HOUR);
  516.  
  517.  
  518. def Bar_hour_ER = BarNumber();
  519. def AverageBody_hour_ER = Average(BodySize_hour_ER, BarsBack_hour_ER);
  520. def MyBodySize_hour_ER = AbsValue(Period_hour_ER_close - Period_hour_ER_open);
  521. def MyCandleSize_hour_ER = Period_hour_ER_high - Period_hour_ER_low;
  522. def AverageCandle_hour_ER = Average(MyCandleSize_hour_ER, BarsBack_hour_ER);
  523.  
  524. Long_hour_ER = if ((Period_hour_ER_open[1] - Period_hour_ER_close[1]) >= (BodySize_hour_ER * (Period_hour_ER_high[1] - Period_hour_ER_low[1])))
  525. and ((Period_hour_ER_high[1] - Period_hour_ER_low[1]) > (AverageCandle_hour_ER * BodyMultiplier_hour_ER))
  526. and ((Period_hour_ER_open[1] - Period_hour_ER_close[1]) > AverageBody_hour_ER)
  527. and (Period_hour_ER_close > Period_hour_ER_open) then 1 else 0;
  528.  
  529. Short_hour_ER = if ((Period_hour_ER_close[1] - Period_hour_ER_open[1]) >= BodySize_hour_ER * (Period_hour_ER_high[1] - Period_hour_ER_low[1]))
  530. and ((Period_hour_ER_high[1] - Period_hour_ER_low[1]) > (AverageCandle_hour_ER * BodyMultiplier_hour_ER))
  531. and ((Period_hour_ER_close[1] - Period_hour_ER_open[1]) > AverageBody_hour_ER)
  532. and (Period_hour_ER_open > Period_hour_ER_close) then 1 else 0;
  533.  
  534. LongSignal_hour_ER = if Long_hour_ER == 1 && Short_hour_ER == 0 then 1 else Double.NaN;
  535.  
  536. ShortSignal_hour_ER = if Short_hour_ER == 1 && Long_hour_ER == 0 then 1 else Double.NaN;
  537.  
  538. NeutralSignal_hour_ER = if ( Long_hour_ER == 0 && Short_hour_ER == 0 or Long_hour_ER == 1 && Short_hour_ER == 1) then 1 else Double.NaN;
  539.  
  540. AddLabel(LongSignal_hour_ER, "hour", Color.DARK_GREEN);
  541. AddLabel(ShortSignal_hour_ER, "hour", Color.DARK_RED);
  542. AddLabel(NeutralSignal_hour_ER, "hour", Color.WHITE);
  543.  
  544. input BodySize_four_hour_ER = 0.525;
  545. input BarsBack_four_hour_ER = 50;
  546. input BodyMultiplier_four_hour_ER = 0.25;
  547.  
  548. def Period_four_hour_ER_close;
  549. def Period_four_hour_ER_open;
  550. def Period_four_hour_ER_high;
  551. def Period_four_hour_ER_low;
  552. def Long_four_hour_ER;
  553. def Short_four_hour_ER;
  554. def LongSignal_four_hour_ER;
  555. def ShortSignal_four_hour_ER;
  556. def NeutralSignal_four_hour_ER;
  557.  
  558. Period_four_hour_ER_close = close(period = AggregationPeriod.FOUR_HOURS);
  559. Period_four_hour_ER_open = open(period = AggregationPeriod.FOUR_HOURS);
  560. Period_four_hour_ER_high = high(period = AggregationPeriod.FOUR_HOURS);
  561. Period_four_hour_ER_low = low(period = AggregationPeriod.FOUR_HOURS);
  562.  
  563.  
  564. def Bar_four_hour_ER = BarNumber();
  565. def AverageBody_four_hour_ER = Average(BodySize_four_hour_ER, BarsBack_four_hour_ER);
  566. def MyBodySize_four_hour_ER = AbsValue(Period_four_hour_ER_close - Period_four_hour_ER_open);
  567. def MyCandleSize_four_hour_ER = Period_four_hour_ER_high - Period_four_hour_ER_low;
  568. def AverageCandle_four_hour_ER = Average(MyCandleSize_four_hour_ER, BarsBack_four_hour_ER);
  569.  
  570. Long_four_hour_ER = if ((Period_four_hour_ER_open[1] - Period_four_hour_ER_close[1]) >= (BodySize_four_hour_ER * (Period_four_hour_ER_high[1] - Period_four_hour_ER_low[1])))
  571. and ((Period_four_hour_ER_high[1] - Period_four_hour_ER_low[1]) > (AverageCandle_four_hour_ER * BodyMultiplier_four_hour_ER))
  572. and ((Period_four_hour_ER_open[1] - Period_four_hour_ER_close[1]) > AverageBody_four_hour_ER)
  573. and (Period_four_hour_ER_close > Period_four_hour_ER_open) then 1 else 0;
  574.  
  575. Short_four_hour_ER = if ((Period_four_hour_ER_close[1] - Period_four_hour_ER_open[1]) >= BodySize_four_hour_ER * (Period_four_hour_ER_high[1] - Period_four_hour_ER_low[1]))
  576. and ((Period_four_hour_ER_high[1] - Period_four_hour_ER_low[1]) > (AverageCandle_four_hour_ER * BodyMultiplier_four_hour_ER))
  577. and ((Period_four_hour_ER_close[1] - Period_four_hour_ER_open[1]) > AverageBody_four_hour_ER)
  578. and (Period_four_hour_ER_open > Period_four_hour_ER_close) then 1 else 0;
  579.  
  580. LongSignal_four_hour_ER = if Long_four_hour_ER == 1 && Short_four_hour_ER == 0 then 1 else Double.NaN;
  581.  
  582. ShortSignal_four_hour_ER = if Short_four_hour_ER == 1 && Long_four_hour_ER == 0 then 1 else Double.NaN;
  583.  
  584. NeutralSignal_four_hour_ER = if ( Long_four_hour_ER == 0 && Short_four_hour_ER == 0 or Long_four_hour_ER == 1 && Short_four_hour_ER == 1) then 1 else Double.NaN;
  585.  
  586. AddLabel(LongSignal_four_hour_ER, "four_hour", Color.DARK_GREEN);
  587. AddLabel(ShortSignal_four_hour_ER, "four_hour", Color.DARK_RED);
  588. AddLabel(NeutralSignal_four_hour_ER, "four_hour", Color.WHITE);
  589.  
  590. input BodySize_week_ER = 0.525;
  591. input BarsBack_week_ER = 50;
  592. input BodyMultiplier_week_ER = 0.25;
  593.  
  594. def Period_week_ER_close;
  595. def Period_week_ER_open;
  596. def Period_week_ER_high;
  597. def Period_week_ER_low;
  598. def Long_week_ER;
  599. def Short_week_ER;
  600. def LongSignal_week_ER;
  601. def ShortSignal_week_ER;
  602. def NeutralSignal_week_ER;
  603.  
  604. Period_week_ER_close = close(period = AggregationPeriod.WEEK);
  605. Period_week_ER_open = open(period = AggregationPeriod.WEEK);
  606. Period_week_ER_high = high(period = AggregationPeriod.WEEK);
  607. Period_week_ER_low = low(period = AggregationPeriod.WEEK);
  608.  
  609.  
  610. def Bar_week_ER = BarNumber();
  611. def AverageBody_week_ER = Average(BodySize_week_ER, BarsBack_week_ER);
  612. def MyBodySize_week_ER = AbsValue(Period_week_ER_close - Period_week_ER_open);
  613. def MyCandleSize_week_ER = Period_week_ER_high - Period_week_ER_low;
  614. def AverageCandle_week_ER = Average(MyCandleSize_week_ER, BarsBack_week_ER);
  615.  
  616. Long_week_ER = if ((Period_week_ER_open[1] - Period_week_ER_close[1]) >= (BodySize_week_ER * (Period_week_ER_high[1] - Period_week_ER_low[1])))
  617. and ((Period_week_ER_high[1] - Period_week_ER_low[1]) > (AverageCandle_week_ER * BodyMultiplier_week_ER))
  618. and ((Period_week_ER_open[1] - Period_week_ER_close[1]) > AverageBody_week_ER)
  619. and (Period_week_ER_close > Period_week_ER_open) then 1 else 0;
  620.  
  621. Short_week_ER = if ((Period_week_ER_close[1] - Period_week_ER_open[1]) >= BodySize_week_ER * (Period_week_ER_high[1] - Period_week_ER_low[1]))
  622. and ((Period_week_ER_high[1] - Period_week_ER_low[1]) > (AverageCandle_week_ER * BodyMultiplier_week_ER))
  623. and ((Period_week_ER_close[1] - Period_week_ER_open[1]) > AverageBody_week_ER)
  624. and (Period_week_ER_open > Period_week_ER_close) then 1 else 0;
  625.  
  626. LongSignal_week_ER = if Long_week_ER == 1 && Short_week_ER == 0 then 1 else Double.NaN;
  627.  
  628. ShortSignal_week_ER = if Short_week_ER == 1 && Long_week_ER == 0 then 1 else Double.NaN;
  629.  
  630. NeutralSignal_week_ER = if ( Long_week_ER == 0 && Short_week_ER == 0 or Long_week_ER == 1 && Short_week_ER == 1) then 1 else Double.NaN;
  631.  
  632. AddLabel(LongSignal_week_ER, "week", Color.DARK_GREEN);
  633. AddLabel(ShortSignal_week_ER, "week", Color.DARK_RED);
  634. AddLabel(NeutralSignal_week_ER, "week", Color.WHITE);
  635.  
  636.  
  637.  
  638. # Wick Reversal Series
  639.  
  640. input WickMultiplier_min_WR = 2.5;
  641. input BodyPercentage_min_WR = .25;
  642.  
  643. def Period_min_WR_close;
  644. def Period_min_WR_open;
  645. def Period_min_WR_high;
  646. def Period_min_WR_low;
  647. def Long_min_WR;
  648. def Short_min_WR;
  649. def LongSignal_min_WR;
  650. def ShortSignal_min_WR;
  651. def NeutralSignal_min_WR;
  652.  
  653. Period_min_WR_close = close(period = AggregationPeriod.MIN);
  654. Period_min_WR_open = open(period = AggregationPeriod.MIN);
  655. Period_min_WR_high = high(period = AggregationPeriod.MIN);
  656. Period_min_WR_low = low(period = AggregationPeriod.MIN);
  657.  
  658. Long_min_WR = if Period_min_WR_close > Period_min_WR_open
  659. and (Period_min_WR_open - Period_min_WR_low) >= ((Period_min_WR_close - Period_min_WR_open) * WickMultiplier_min_WR)
  660. and (Period_min_WR_high - Period_min_WR_close) <= ((Period_min_WR_high - Period_min_WR_low) * BodyPercentage_min_WR)
  661. or Period_min_WR_close < Period_min_WR_open
  662. and (Period_min_WR_close - Period_min_WR_low) >= ((Period_min_WR_open - Period_min_WR_close) * WickMultiplier_min_WR)
  663. and (Period_min_WR_high - Period_min_WR_close) <= ((Period_min_WR_high - Period_min_WR_low) * BodyPercentage_min_WR)
  664. or Period_min_WR_close == Period_min_WR_open and Period_min_WR_close != Period_min_WR_high
  665. and Period_min_WR_high - Period_min_WR_low >= Average(Period_min_WR_high - Period_min_WR_low, 50) then 1 else 0;
  666.  
  667. Short_min_WR = if Period_min_WR_close < Period_min_WR_open
  668. and (Period_min_WR_high - Period_min_WR_open) >= ((Period_min_WR_open - Period_min_WR_close) * WickMultiplier_min_WR)
  669. and (Period_min_WR_close - Period_min_WR_low) <= ((Period_min_WR_high - Period_min_WR_low) * BodyPercentage_min_WR)
  670. or Period_min_WR_close > Period_min_WR_open
  671. and (Period_min_WR_high - Period_min_WR_close) >= ((Period_min_WR_close - Period_min_WR_open) * WickMultiplier_min_WR)
  672. and (Period_min_WR_close - Period_min_WR_low) <= ((Period_min_WR_high - Period_min_WR_low) * BodyPercentage_min_WR)
  673. or Period_min_WR_close == Period_min_WR_open and Period_min_WR_close != Period_min_WR_low
  674. and (Period_min_WR_high - Period_min_WR_low) >= ((Period_min_WR_close - Period_min_WR_low) * WickMultiplier_min_WR)
  675. and (Period_min_WR_close - Period_min_WR_low) <= ((Period_min_WR_high - Period_min_WR_low) * BodyPercentage_min_WR)
  676. or Period_min_WR_open == Period_min_WR_low and Period_min_WR_close == Period_min_WR_low
  677. and Period_min_WR_high - Period_min_WR_low >= Average(Period_min_WR_high - Period_min_WR_low, 50) then 1 else 0;
  678.  
  679.  
  680. LongSignal_min_WR = if Long_min_WR == 1 && Short_min_WR == 0 then 1 else Double.NaN;
  681.  
  682. ShortSignal_min_WR = if Short_min_WR == 1 && Long_min_WR == 0 then 1 else Double.NaN;
  683.  
  684. NeutralSignal_min_WR = if ( Long_min_WR == 0 && Short_min_WR == 0 or Long_min_WR == 1 && Short_min_WR == 1) then 1 else Double.NaN;
  685.  
  686.  
  687. AddLabel(1, "Wick Reversal Series", Color.ORANGE);
  688. AddLabel(LongSignal_min_WR, "min", Color.DARK_GREEN);
  689. AddLabel(ShortSignal_min_WR, "min", Color.DARK_RED);
  690. AddLabel(NeutralSignal_min_WR, "min", Color.WHITE);
  691.  
  692. input WickMultiplier_fifteen_min_WR = 2.5;
  693. input BodyPercentage_fifteen_min_WR = .25;
  694.  
  695. def Period_fifteen_min_WR_close;
  696. def Period_fifteen_min_WR_open;
  697. def Period_fifteen_min_WR_high;
  698. def Period_fifteen_min_WR_low;
  699. def Long_fifteen_min_WR;
  700. def Short_fifteen_min_WR;
  701. def LongSignal_fifteen_min_WR;
  702. def ShortSignal_fifteen_min_WR;
  703. def NeutralSignal_fifteen_min_WR;
  704.  
  705. Period_fifteen_min_WR_close = close(period = AggregationPeriod.FIFTEEN_MIN);
  706. Period_fifteen_min_WR_open = open(period = AggregationPeriod.FIFTEEN_MIN);
  707. Period_fifteen_min_WR_high = high(period = AggregationPeriod.FIFTEEN_MIN);
  708. Period_fifteen_min_WR_low = low(period = AggregationPeriod.FIFTEEN_MIN);
  709.  
  710. Long_fifteen_min_WR = if Period_fifteen_min_WR_close > Period_fifteen_min_WR_open
  711. and (Period_fifteen_min_WR_open - Period_fifteen_min_WR_low) >= ((Period_fifteen_min_WR_close - Period_fifteen_min_WR_open) * WickMultiplier_fifteen_min_WR)
  712. and (Period_fifteen_min_WR_high - Period_fifteen_min_WR_close) <= ((Period_fifteen_min_WR_high - Period_fifteen_min_WR_low) * BodyPercentage_fifteen_min_WR)
  713. or Period_fifteen_min_WR_close < Period_fifteen_min_WR_open
  714. and (Period_fifteen_min_WR_close - Period_fifteen_min_WR_low) >= ((Period_fifteen_min_WR_open - Period_fifteen_min_WR_close) * WickMultiplier_fifteen_min_WR)
  715. and (Period_fifteen_min_WR_high - Period_fifteen_min_WR_close) <= ((Period_fifteen_min_WR_high - Period_fifteen_min_WR_low) * BodyPercentage_fifteen_min_WR)
  716. or Period_fifteen_min_WR_close == Period_fifteen_min_WR_open and Period_fifteen_min_WR_close != Period_fifteen_min_WR_high
  717. and Period_fifteen_min_WR_high - Period_fifteen_min_WR_low >= Average(Period_fifteen_min_WR_high - Period_fifteen_min_WR_low, 50) then 1 else 0;
  718.  
  719. Short_fifteen_min_WR = if Period_fifteen_min_WR_close < Period_fifteen_min_WR_open
  720. and (Period_fifteen_min_WR_high - Period_fifteen_min_WR_open) >= ((Period_fifteen_min_WR_open - Period_fifteen_min_WR_close) * WickMultiplier_fifteen_min_WR)
  721. and (Period_fifteen_min_WR_close - Period_fifteen_min_WR_low) <= ((Period_fifteen_min_WR_high - Period_fifteen_min_WR_low) * BodyPercentage_fifteen_min_WR)
  722. or Period_fifteen_min_WR_close > Period_fifteen_min_WR_open
  723. and (Period_fifteen_min_WR_high - Period_fifteen_min_WR_close) >= ((Period_fifteen_min_WR_close - Period_fifteen_min_WR_open) * WickMultiplier_fifteen_min_WR)
  724. and (Period_fifteen_min_WR_close - Period_fifteen_min_WR_low) <= ((Period_fifteen_min_WR_high - Period_fifteen_min_WR_low) * BodyPercentage_fifteen_min_WR)
  725. or Period_fifteen_min_WR_close == Period_fifteen_min_WR_open and Period_fifteen_min_WR_close != Period_fifteen_min_WR_low
  726. and (Period_fifteen_min_WR_high - Period_fifteen_min_WR_low) >= ((Period_fifteen_min_WR_close - Period_fifteen_min_WR_low) * WickMultiplier_fifteen_min_WR)
  727. and (Period_fifteen_min_WR_close - Period_fifteen_min_WR_low) <= ((Period_fifteen_min_WR_high - Period_fifteen_min_WR_low) * BodyPercentage_fifteen_min_WR)
  728. or Period_fifteen_min_WR_open == Period_fifteen_min_WR_low and Period_fifteen_min_WR_close == Period_fifteen_min_WR_low
  729. and Period_fifteen_min_WR_high - Period_fifteen_min_WR_low >= Average(Period_fifteen_min_WR_high - Period_fifteen_min_WR_low, 50) then 1 else 0;
  730.  
  731.  
  732. LongSignal_fifteen_min_WR = if Long_fifteen_min_WR == 1 && Short_fifteen_min_WR == 0 then 1 else Double.NaN;
  733.  
  734. ShortSignal_fifteen_min_WR = if Short_fifteen_min_WR == 1 && Long_fifteen_min_WR == 0 then 1 else Double.NaN;
  735.  
  736. NeutralSignal_fifteen_min_WR = if ( Long_fifteen_min_WR == 0 && Short_fifteen_min_WR == 0 or Long_fifteen_min_WR == 1 && Short_fifteen_min_WR == 1) then 1 else Double.NaN;
  737.  
  738. AddLabel(LongSignal_fifteen_min_WR, "fifteen_min", Color.DARK_GREEN);
  739. AddLabel(ShortSignal_fifteen_min_WR, "fifteen_min", Color.DARK_RED);
  740. AddLabel(NeutralSignal_fifteen_min_WR, "fifteen_min", Color.WHITE);
  741.  
  742.  
  743. input WickMultiplier_hour_WR = 2.5;
  744. input BodyPercentage_hour_WR = .25;
  745.  
  746. def Period_hour_WR_close;
  747. def Period_hour_WR_open;
  748. def Period_hour_WR_high;
  749. def Period_hour_WR_low;
  750. def Long_hour_WR;
  751. def Short_hour_WR;
  752. def LongSignal_hour_WR;
  753. def ShortSignal_hour_WR;
  754. def NeutralSignal_hour_WR;
  755.  
  756. Period_hour_WR_close = close(period = AggregationPeriod.HOUR);
  757. Period_hour_WR_open = open(period = AggregationPeriod.HOUR);
  758. Period_hour_WR_high = high(period = AggregationPeriod.HOUR);
  759. Period_hour_WR_low = low(period = AggregationPeriod.HOUR);
  760.  
  761. Long_hour_WR = if Period_hour_WR_close > Period_hour_WR_open
  762. and (Period_hour_WR_open - Period_hour_WR_low) >= ((Period_hour_WR_close - Period_hour_WR_open) * WickMultiplier_hour_WR)
  763. and (Period_hour_WR_high - Period_hour_WR_close) <= ((Period_hour_WR_high - Period_hour_WR_low) * BodyPercentage_hour_WR)
  764. or Period_hour_WR_close < Period_hour_WR_open
  765. and (Period_hour_WR_close - Period_hour_WR_low) >= ((Period_hour_WR_open - Period_hour_WR_close) * WickMultiplier_hour_WR)
  766. and (Period_hour_WR_high - Period_hour_WR_close) <= ((Period_hour_WR_high - Period_hour_WR_low) * BodyPercentage_hour_WR)
  767. or Period_hour_WR_close == Period_hour_WR_open and Period_hour_WR_close != Period_hour_WR_high
  768. and Period_hour_WR_high - Period_hour_WR_low >= Average(Period_hour_WR_high - Period_hour_WR_low, 50) then 1 else 0;
  769.  
  770. Short_hour_WR = if Period_hour_WR_close < Period_hour_WR_open
  771. and (Period_hour_WR_high - Period_hour_WR_open) >= ((Period_hour_WR_open - Period_hour_WR_close) * WickMultiplier_hour_WR)
  772. and (Period_hour_WR_close - Period_hour_WR_low) <= ((Period_hour_WR_high - Period_hour_WR_low) * BodyPercentage_hour_WR)
  773. or Period_hour_WR_close > Period_hour_WR_open
  774. and (Period_hour_WR_high - Period_hour_WR_close) >= ((Period_hour_WR_close - Period_hour_WR_open) * WickMultiplier_hour_WR)
  775. and (Period_hour_WR_close - Period_hour_WR_low) <= ((Period_hour_WR_high - Period_hour_WR_low) * BodyPercentage_hour_WR)
  776. or Period_hour_WR_close == Period_hour_WR_open and Period_hour_WR_close != Period_hour_WR_low
  777. and (Period_hour_WR_high - Period_hour_WR_low) >= ((Period_hour_WR_close - Period_hour_WR_low) * WickMultiplier_hour_WR)
  778. and (Period_hour_WR_close - Period_hour_WR_low) <= ((Period_hour_WR_high - Period_hour_WR_low) * BodyPercentage_hour_WR)
  779. or Period_hour_WR_open == Period_hour_WR_low and Period_hour_WR_close == Period_hour_WR_low
  780. and Period_hour_WR_high - Period_hour_WR_low >= Average(Period_hour_WR_high - Period_hour_WR_low, 50) then 1 else 0;
  781.  
  782.  
  783. LongSignal_hour_WR = if Long_hour_WR == 1 && Short_hour_WR == 0 then 1 else Double.NaN;
  784.  
  785. ShortSignal_hour_WR = if Short_hour_WR == 1 && Long_hour_WR == 0 then 1 else Double.NaN;
  786.  
  787. NeutralSignal_hour_WR = if ( Long_hour_WR == 0 && Short_hour_WR == 0 or Long_hour_WR == 1 && Short_hour_WR == 1) then 1 else Double.NaN;
  788.  
  789. AddLabel(LongSignal_hour_WR, "hour", Color.DARK_GREEN);
  790. AddLabel(ShortSignal_hour_WR, "hour", Color.DARK_RED);
  791. AddLabel(NeutralSignal_hour_WR, "hour", Color.WHITE);
  792.  
  793. input WickMultiplier_four_hour_WR = 2.5;
  794. input BodyPercentage_four_hour_WR = .25;
  795.  
  796. def Period_four_hour_WR_close;
  797. def Period_four_hour_WR_open;
  798. def Period_four_hour_WR_high;
  799. def Period_four_hour_WR_low;
  800. def Long_four_hour_WR;
  801. def Short_four_hour_WR;
  802. def LongSignal_four_hour_WR;
  803. def ShortSignal_four_hour_WR;
  804. def NeutralSignal_four_hour_WR;
  805.  
  806. Period_four_hour_WR_close = close(period = AggregationPeriod.FOUR_HOURS);
  807. Period_four_hour_WR_open = open(period = AggregationPeriod.FOUR_HOURS);
  808. Period_four_hour_WR_high = high(period = AggregationPeriod.FOUR_HOURS);
  809. Period_four_hour_WR_low = low(period = AggregationPeriod.FOUR_HOURS);
  810.  
  811. Long_four_hour_WR = if Period_four_hour_WR_close > Period_four_hour_WR_open
  812. and (Period_four_hour_WR_open - Period_four_hour_WR_low) >= ((Period_four_hour_WR_close - Period_four_hour_WR_open) * WickMultiplier_four_hour_WR)
  813. and (Period_four_hour_WR_high - Period_four_hour_WR_close) <= ((Period_four_hour_WR_high - Period_four_hour_WR_low) * BodyPercentage_four_hour_WR)
  814. or Period_four_hour_WR_close < Period_four_hour_WR_open
  815. and (Period_four_hour_WR_close - Period_four_hour_WR_low) >= ((Period_four_hour_WR_open - Period_four_hour_WR_close) * WickMultiplier_four_hour_WR)
  816. and (Period_four_hour_WR_high - Period_four_hour_WR_close) <= ((Period_four_hour_WR_high - Period_four_hour_WR_low) * BodyPercentage_four_hour_WR)
  817. or Period_four_hour_WR_close == Period_four_hour_WR_open and Period_four_hour_WR_close != Period_four_hour_WR_high
  818. and Period_four_hour_WR_high - Period_four_hour_WR_low >= Average(Period_four_hour_WR_high - Period_four_hour_WR_low, 50) then 1 else 0;
  819.  
  820. Short_four_hour_WR = if Period_four_hour_WR_close < Period_four_hour_WR_open
  821. and (Period_four_hour_WR_high - Period_four_hour_WR_open) >= ((Period_four_hour_WR_open - Period_four_hour_WR_close) * WickMultiplier_four_hour_WR)
  822. and (Period_four_hour_WR_close - Period_four_hour_WR_low) <= ((Period_four_hour_WR_high - Period_four_hour_WR_low) * BodyPercentage_four_hour_WR)
  823. or Period_four_hour_WR_close > Period_four_hour_WR_open
  824. and (Period_four_hour_WR_high - Period_four_hour_WR_close) >= ((Period_four_hour_WR_close - Period_four_hour_WR_open) * WickMultiplier_four_hour_WR)
  825. and (Period_four_hour_WR_close - Period_four_hour_WR_low) <= ((Period_four_hour_WR_high - Period_four_hour_WR_low) * BodyPercentage_four_hour_WR)
  826. or Period_four_hour_WR_close == Period_four_hour_WR_open and Period_four_hour_WR_close != Period_four_hour_WR_low
  827. and (Period_four_hour_WR_high - Period_four_hour_WR_low) >= ((Period_four_hour_WR_close - Period_four_hour_WR_low) * WickMultiplier_four_hour_WR)
  828. and (Period_four_hour_WR_close - Period_four_hour_WR_low) <= ((Period_four_hour_WR_high - Period_four_hour_WR_low) * BodyPercentage_four_hour_WR)
  829. or Period_four_hour_WR_open == Period_four_hour_WR_low and Period_four_hour_WR_close == Period_four_hour_WR_low
  830. and Period_four_hour_WR_high - Period_four_hour_WR_low >= Average(Period_four_hour_WR_high - Period_four_hour_WR_low, 50) then 1 else 0;
  831.  
  832.  
  833. LongSignal_four_hour_WR = if Long_four_hour_WR == 1 && Short_four_hour_WR == 0 then 1 else Double.NaN;
  834.  
  835. ShortSignal_four_hour_WR = if Short_four_hour_WR == 1 && Long_four_hour_WR == 0 then 1 else Double.NaN;
  836.  
  837. NeutralSignal_four_hour_WR = if ( Long_four_hour_WR == 0 && Short_four_hour_WR == 0 or Long_four_hour_WR == 1 && Short_four_hour_WR == 1) then 1 else Double.NaN;
  838.  
  839. AddLabel(LongSignal_four_hour_WR, "four_hour", Color.DARK_GREEN);
  840. AddLabel(ShortSignal_four_hour_WR, "four_hour", Color.DARK_RED);
  841. AddLabel(NeutralSignal_four_hour_WR, "four_hour", Color.WHITE);
  842.  
  843.  
  844. input WickMultiplier_week_WR = 2.5;
  845. input BodyPercentage_week_WR = .25;
  846.  
  847. def Period_week_WR_close;
  848. def Period_week_WR_open;
  849. def Period_week_WR_high;
  850. def Period_week_WR_low;
  851. def Long_week_WR;
  852. def Short_week_WR;
  853. def LongSignal_week_WR;
  854. def ShortSignal_week_WR;
  855. def NeutralSignal_week_WR;
  856.  
  857. Period_week_WR_close = close(period = AggregationPeriod.WEEK);
  858. Period_week_WR_open = open(period = AggregationPeriod.WEEK);
  859. Period_week_WR_high = high(period = AggregationPeriod.WEEK);
  860. Period_week_WR_low = low(period = AggregationPeriod.WEEK);
  861.  
  862. Long_week_WR = if Period_week_WR_close > Period_week_WR_open
  863. and (Period_week_WR_open - Period_week_WR_low) >= ((Period_week_WR_close - Period_week_WR_open) * WickMultiplier_week_WR)
  864. and (Period_week_WR_high - Period_week_WR_close) <= ((Period_week_WR_high - Period_week_WR_low) * BodyPercentage_week_WR)
  865. or Period_week_WR_close < Period_week_WR_open
  866. and (Period_week_WR_close - Period_week_WR_low) >= ((Period_week_WR_open - Period_week_WR_close) * WickMultiplier_week_WR)
  867. and (Period_week_WR_high - Period_week_WR_close) <= ((Period_week_WR_high - Period_week_WR_low) * BodyPercentage_week_WR)
  868. or Period_week_WR_close == Period_week_WR_open and Period_week_WR_close != Period_week_WR_high
  869. and Period_week_WR_high - Period_week_WR_low >= Average(Period_week_WR_high - Period_week_WR_low, 50) then 1 else 0;
  870.  
  871. Short_week_WR = if Period_week_WR_close < Period_week_WR_open
  872. and (Period_week_WR_high - Period_week_WR_open) >= ((Period_week_WR_open - Period_week_WR_close) * WickMultiplier_week_WR)
  873. and (Period_week_WR_close - Period_week_WR_low) <= ((Period_week_WR_high - Period_week_WR_low) * BodyPercentage_week_WR)
  874. or Period_week_WR_close > Period_week_WR_open
  875. and (Period_week_WR_high - Period_week_WR_close) >= ((Period_week_WR_close - Period_week_WR_open) * WickMultiplier_week_WR)
  876. and (Period_week_WR_close - Period_week_WR_low) <= ((Period_week_WR_high - Period_week_WR_low) * BodyPercentage_week_WR)
  877. or Period_week_WR_close == Period_week_WR_open and Period_week_WR_close != Period_week_WR_low
  878. and (Period_week_WR_high - Period_week_WR_low) >= ((Period_week_WR_close - Period_week_WR_low) * WickMultiplier_week_WR)
  879. and (Period_week_WR_close - Period_week_WR_low) <= ((Period_week_WR_high - Period_week_WR_low) * BodyPercentage_week_WR)
  880. or Period_week_WR_open == Period_week_WR_low and Period_week_WR_close == Period_week_WR_low
  881. and Period_week_WR_high - Period_week_WR_low >= Average(Period_week_WR_high - Period_week_WR_low, 50) then 1 else 0;
  882.  
  883.  
  884. LongSignal_week_WR = if Long_week_WR == 1 && Short_week_WR == 0 then 1 else Double.NaN;
  885.  
  886. ShortSignal_week_WR = if Short_week_WR == 1 && Long_week_WR == 0 then 1 else Double.NaN;
  887.  
  888. NeutralSignal_week_WR = if ( Long_week_WR == 0 && Short_week_WR == 0 or Long_week_WR == 1 && Short_week_WR == 1) then 1 else Double.NaN;
  889.  
  890. AddLabel(LongSignal_week_WR, "week", Color.DARK_GREEN);
  891. AddLabel(ShortSignal_week_WR, "week", Color.DARK_RED);
  892. AddLabel(NeutralSignal_week_WR, "week", Color.WHITE);
  893.  
  894. # VWAP series
  895.  
  896. def yyyyMmDd = GetYYYYMMDD();
  897.  
  898. def periodIndxDay = yyyyMmDd;
  899.  
  900. def isPeriodRolledDay = CompoundValue(1, periodIndxDay != periodIndxDay[1], yes);
  901.  
  902. def volumeSumDay;
  903. def volumeVwapSumDay;
  904. def volumeVwap2SumDay;
  905.  
  906. if (isPeriodRolledDay) {
  907. volumeSumDay = volume;
  908. volumeVwapSumDay = volume * vwap;
  909. volumeVwap2SumDay = volume * Sqr(vwap);
  910. } else {
  911. volumeSumDay = CompoundValue(1, volumeSumDay[1] + volume, volume);
  912. volumeVwapSumDay = CompoundValue(1, volumeVwapSumDay[1] + volume * vwap, volume * vwap);
  913. volumeVwap2SumDay = CompoundValue(1, volumeVwap2SumDay[1] + volume * Sqr(vwap), volume * Sqr(vwap));
  914. }
  915.  
  916. def priceDay = volumeVwapSumDay / volumeSumDay;
  917. def deviationDay = Sqrt(Max(volumeVwap2SumDay / volumeSumDay - Sqr(priceDay), 0));
  918. def VWAPdevNeg1 = priceDay - deviationDay;
  919. def VWAPdevPos1 = priceDay + deviationDay;
  920.  
  921. def VWAPgradientMax = 30;
  922. def VWAPgradientMin = -1 * VWAPgradientMax;
  923.  
  924. # The following is the main equation for mapping ranges, which is increadibly useful in producing fine gradients from a single set of deviations. Be aware of the posibility of divde by zero errors (or near zero abnormalities like with VWWAP) for some signals. In this instance I partially manage by placing an upper limit on skew.
  925.  
  926. def VWAPgradient = If ((((close - VWAPdevNeg1) * (VWAPgradientMax - VWAPgradientMin) / (VWAPdevPos1 - VWAPdevNeg1) + VWAPgradientMin) < VWAPgradientMax * 4 and ((close - VWAPdevNeg1) * (VWAPgradientMax - VWAPgradientMin) / (VWAPdevPos1 - VWAPdevNeg1) + VWAPgradientMin) > VWAPgradientMax * -4 ), ((close - VWAPdevNeg1) * (VWAPgradientMax - VWAPgradientMin) / (VWAPdevPos1 - VWAPdevNeg1) + VWAPgradientMin), 0);
  927.  
  928.  
  929. # Totals for directional signals
  930.  
  931. def LongTotal;
  932. def ShortTotal;
  933.  
  934.  
  935. # Total Skews - Multiply signals by timeframe or probability approximation
  936.  
  937. # This section and the entry / exit requirements sections just below are the main locations for optimizing timing. eevery short and long signal has has a multiple that can be adjusted based on probability that it has of being sucessful. The current values are non-optimal and need to be tested over longer timeframes but still see impressive results.
  938.  
  939. LongTotal = If (IsNaN(LongSignal_min_MTFA_RM), 0, LongSignal_min_MTFA_RM) + (If (IsNaN(LongSignal_fifteen_min_MTFA_RM), 0, LongSignal_fifteen_min_MTFA_RM) * 15) + (If (IsNaN(LongSignal_hour_MTFA_RM), 0, LongSignal_hour_MTFA_RM) * 60) + (If (IsNaN(LongSignal_four_hours_MTFA_RM), 0, LongSignal_four_hours_MTFA_RM) * 240) + (If (IsNaN(LongSignal_week_MTFA_RM), 0, LongSignal_week_MTFA_RM) * 20) + If (IsNaN(LongSignal_min_OR), 0, LongSignal_min_OR) + (If (IsNaN(LongSignal_fifteen_min_OR), 0, LongSignal_fifteen_min_OR) * 15) + (If (IsNaN(LongSignal_hour_OR), 0, LongSignal_hour_OR) * 60) + (If (IsNaN(LongSignal_four_hours_ORs), 0, LongSignal_four_hours_ORs) * 240) + (If (IsNaN(LongSignal_week_ORs), 0, LongSignal_week_ORs) * 200) + If (IsNaN(LongSignal_min_ER), 0, LongSignal_min_ER) + (If (IsNaN(LongSignal_fifteen_min_ER), 0, LongSignal_fifteen_min_ER) * 15) + (If (IsNaN(LongSignal_hour_ER), 0, LongSignal_hour_ER) * 60) + (If (IsNaN(LongSignal_four_hour_ER), 0, LongSignal_four_hour_ER) * 240) + (If (IsNaN(LongSignal_week_ER), 0, LongSignal_week_ER) * 200) + If (IsNaN(LongSignal_min_WR), 0, LongSignal_min_WR) + (If (IsNaN(LongSignal_fifteen_min_WR), 0, LongSignal_fifteen_min_WR) * 15) + (If (IsNaN(LongSignal_hour_WR), 0, LongSignal_hour_WR) * 60) + (If (IsNaN(LongSignal_four_hour_WR), 0, LongSignal_four_hour_WR) * 240) + (If (IsNaN(LongSignal_week_WR), 0, LongSignal_week_WR) * 200);
  940.  
  941. ShortTotal = If (IsNaN(ShortSignal_min_MTFA_RM), 0, ShortSignal_min_MTFA_RM) + (If (IsNaN(ShortSignal_fifteen_min_MTFA_RM), 0, ShortSignal_fifteen_min_MTFA_RM) * 15) + (If (IsNaN(ShortSignal_hour_MTFA_RM), 0, ShortSignal_hour_MTFA_RM) * 60) + (If (IsNaN(ShortSignal_four_hours_MTFA_RM), 0, ShortSignal_four_hours_MTFA_RM) * 240) + (If (IsNaN(ShortSignal_week_MTFA_RM), 0, ShortSignal_week_MTFA_RM) * 20) + If (IsNaN(ShortSignal_min_OR), 0, ShortSignal_min_OR) + (If (IsNaN(ShortSignal_fifteen_min_OR), 0, ShortSignal_fifteen_min_OR) * 15) + (If (IsNaN(ShortSignal_hour_OR), 0, ShortSignal_hour_OR) * 60) + (If (IsNaN(ShortSignal_four_hours_ORs), 0, ShortSignal_four_hours_ORs) * 240) + (If (IsNaN(ShortSignal_week_ORs), 0, ShortSignal_week_ORs) * 20) + If (IsNaN(ShortSignal_min_ER), 0, ShortSignal_min_ER) + (If (IsNaN(ShortSignal_fifteen_min_ER), 0, ShortSignal_fifteen_min_ER) * 15) + (If (IsNaN(ShortSignal_hour_ER), 0, ShortSignal_hour_ER) * 60) + (If (IsNaN(ShortSignal_four_hour_ER), 0, ShortSignal_four_hour_ER) * 240) + (If (IsNaN(ShortSignal_week_ER), 0, ShortSignal_week_ER) * 20) + If (IsNaN(ShortSignal_min_WR), 0, ShortSignal_min_WR) + (If (IsNaN(ShortSignal_fifteen_min_WR), 0, ShortSignal_fifteen_min_WR) * 15) + (If (IsNaN(ShortSignal_hour_WR), 0, ShortSignal_hour_WR) * 60) + (If (IsNaN(ShortSignal_four_hour_WR), 0, ShortSignal_four_hour_WR) * 240) + (If (IsNaN(ShortSignal_week_WR), 0, ShortSignal_week_WR) * 20) ;
  942.  
  943. # RSI Series
  944.  
  945. def OverBought = 70;
  946. def OverSold = 30;
  947.  
  948. def rsi = reference RSI(price = close, length = 14, averageType = AverageType.WILDERS);
  949.  
  950. def RSIgradient = if rsi > OverBought then rsi - OverBought else if rsi < OverSold then rsi - OverSold else 0;
  951.  
  952.  
  953. # Personal Bias
  954.  
  955. # Feel free to enter your own bias.
  956.  
  957. input Bias = 0;
  958.  
  959. # Total w/ Bias Skew
  960.  
  961. def NetTotal = LongTotal - ShortTotal + Bias + VWAPgradient + STDCgradient + RSIgradient;
  962.  
  963. # Entry and Exit Conditions
  964.  
  965. # This is another place that will have to be altered with optimizations. It is surprising how small of values you can use and # get great results. Once again default values are non-optimal.
  966.  
  967. input ShortEntryRequirement = -200;
  968. input ShortExitRequirement = 200;
  969.  
  970. input LongEntryRequirement = 200;
  971. input LongExitRequirement = -200;
  972.  
  973.  
  974. # Variable StopLoss and TakeProfits
  975.  
  976. def VarStopLong = ((WideStop - NarrowStop) / (LongEntryRequirement - LongExitRequirement)) * NetTotal + NarrowStop;
  977. def VarStopShort = ((WideStop - NarrowStop) / (ShortEntryRequirement - ShortExitRequirement)) * NetTotal + NarrowStop;
  978.  
  979. def VarProfitLong = ((WideProfit - NarrowProfit) / (LongEntryRequirement - LongExitRequirement)) * NetTotal + NarrowProfit;
  980. def VarProfitShort = ((WideProfit - NarrowProfit) / (ShortEntryRequirement - ShortExitRequirement)) * NetTotal + NarrowProfit;
  981.  
  982. def SmoothLow = (low + low[1] + low[2] + low[3] + low[4]) / 5;
  983. def SmoothHigh = (high + high[1] + high[2] + high[3] + high[4]) / 5;
  984.  
  985. plot PriceVarStopLong = If ((SmoothLow - VarStopLong) < price, (SmoothLow - VarStopLong), Double.NaN);
  986. plot PriceVarStopShort = If ((SmoothHigh + VarStopShort) > price, (SmoothHigh + VarStopShort), Double.NaN);
  987.  
  988. PriceVarStopLong.SetDefaultColor(Color.DARK_GREEN);
  989. PriceVarStopShort.SetDefaultColor(Color.DARK_RED);
  990.  
  991. plot PriceVarProfitLong = If ((SmoothHigh + VarProfitLong) > price, (SmoothHigh + VarProfitLong), Double.NaN);
  992. plot PriceVarProfitShort = If ((SmoothLow - VarProfitShort) < price, (SmoothLow - VarProfitShort), Double.NaN);
  993.  
  994. PriceVarProfitLong.SetDefaultColor(Color.BLUE);
  995. PriceVarProfitShort.SetDefaultColor(Color.DARK_ORANGE);
  996.  
  997. def IsShort;
  998. def IsLong;
  999.  
  1000.  
  1001. if (NetTotal < ShortEntryRequirement) {
  1002. IsShort = 2; # Hold Short
  1003. } else if (NetTotal > ShortExitRequirement) {
  1004. IsShort = 1; # Trail Short
  1005. } else {
  1006. IsShort = 0; # Close Short
  1007. }
  1008. ;
  1009.  
  1010. if (NetTotal > LongEntryRequirement) {
  1011. IsLong = 2; # Hold Long
  1012. } else if (NetTotal < LongExitRequirement) {
  1013. IsLong = 1; # Trail Long
  1014. } else {
  1015. IsLong = 0; # Close Long
  1016. }
  1017. ;
  1018.  
  1019. AddLabel(1, "STDC Gradient", Color.DARK_ORANGE);
  1020. AddLabel(1, STDCgradient, Color.WHITE);
  1021.  
  1022. AddLabel(1, "VWAP Gradient", Color.DARK_ORANGE);
  1023. AddLabel(1, VWAPgradient, Color.WHITE);
  1024.  
  1025. AddLabel(1, "RSI Gradient", Color.DARK_ORANGE);
  1026. AddLabel(1, RSIgradient, Color.WHITE);
  1027.  
  1028. AddLabel(1, "Skew:", Color.ORANGE);
  1029. AddLabel(1, NetTotal, Color.WHITE);
  1030. AddLabel(IsLong == 2, "Long Hold", Color.DARK_GREEN);
  1031. AddLabel(IsLong == 1, "Long Trail", Color.GREEN);
  1032. AddLabel(IsLong == 0, "Long Close", Color.GREEN);
  1033. AddLabel(IsShort == 2, "Short Hold", Color.DARK_RED);
  1034. AddLabel(IsShort == 1, "Short Trail", Color.RED);
  1035. AddLabel(IsShort == 0, "Short Close", Color.RED);
  1036.  
  1037. AddOrder(OrderType.BUY_TO_OPEN, IsLong == 2 and price <= SmoothLow, Min(SmoothLow , low), tickcolor = Color.DARK_GREEN, arrowcolor = Color.GREEN);
  1038.  
  1039. AddOrder(OrderType.SELL_TO_CLOSE, IsLong == 2 and price > PriceVarProfitLong, Max(SmoothHigh , high), tickcolor = Color.DARK_RED, arrowcolor = Color.BLUE);
  1040.  
  1041. AddOrder(OrderType.SELL_TO_CLOSE, IsLong < 2, Max(SmoothHigh , high), tickcolor = Color.DARK_RED, arrowcolor = Color.RED);
  1042.  
  1043. AddOrder(OrderType.SELL_TO_CLOSE, IsShort == 2 and price < PriceVarStopLong, Max(SmoothHigh , high), tickcolor = Color.DARK_RED, arrowcolor = Color.DARK_GREEN);
  1044.  
  1045. AddOrder(OrderType.SELL_TO_OPEN, IsShort == 2 and price >= SmoothHigh, Max(SmoothHigh , high), tickcolor = Color.DARK_RED, arrowcolor = Color.RED);
  1046.  
  1047. AddOrder(OrderType.BUY_TO_CLOSE, IsShort == 2 and price < PriceVarProfitShort, Min(SmoothLow , low), tickcolor = Color.DARK_GREEN, arrowcolor = Color.DARK_ORANGE);
  1048.  
  1049. AddOrder(OrderType.BUY_TO_CLOSE, IsShort < 2, Min(SmoothLow , low), tickcolor = Color.DARK_GREEN, arrowcolor = Color.GREEN);
  1050.  
  1051. AddOrder(OrderType.BUY_TO_CLOSE, IsLong == 2 and price > PriceVarStopShort, Min(SmoothLow, low), tickcolor = Color.DARK_GREEN, arrowcolor = Color.DARK_GREEN);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement