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

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Fund Screener
  4. //  Author/Uploader: Dima Rasnitsyn 
  5. //  E-mail:          rasnitsyn@home.com
  6. //  Date/Time Added: 2001-10-13 12:58:30
  7. //  Origin:          
  8. //  Keywords:        funds, stocks, rate of change, rank
  9. //  Level:           medium
  10. //  Flags:           exploration
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=125
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=125
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Rank mutual funds [or securities] based on their rates of change (or
  17. //  smoothed ROCs), and see how much time passed since buy/sell signals
  18. //  generated by various systems.
  19. //
  20. //------------------------------------------------------------------------------
  21. // FundScreaner by Dr. S.N.Berger & D.Rasnitsyn
  22. // The Idea of this screaner is to identify the strongest securities (by their ROC), and also see how much time passed since the latest buy/sell signal generated by different trading systems for each of them.
  23. // The columns contain:
  24. // Weighted smoothed ROC (weight coefficients are configurable)
  25. // average of Monthly, quartely, semi-anual, and anual ROCs (this score is used by FundX)
  26. // 5 day smoothed ROC
  27. // 10 day smoothed ROC
  28. // 22 day (1 month) smoothed ROC
  29. // 9 week (2 month) smoothed ROC
  30. // 13 week -"-
  31. // 26 week -"-
  32. // The next columns show The number of days since the latest buy (positive) or sell (negative) signal generated by particular trading system:
  33. // N/D - system based on Jaco MRI, Williams AC+, MACD, and Relative slope
  34. // Dags [sorry if the name is misspelled] peaker
  35. // Stochastics divergence
  36. // Any other???
  37. //
  38. // Proposed usage:
  39. // 1) Screen all monitored funds / securities
  40. // 2) Sort by Weighted ROC, scroll down for a dosen, and replace minWeightedROC by the smallest acceptable value
  41. // 3) Sort by CPR, and repeat the same.
  42. // 4) If you want to put the down limit on 10 day or monthly ROC, do the same for these columns
  43. // 5) Repeat exploration. Only the funds/stocks with ROCs more then defined values will be in the screen.
  44. // 6) Check how many days passed since the alst buy/sell signal for the security. Probably it's not too late to rotate...
  45. //
  46. //
  47. // The following sections defines filter criteria.
  48. // Display only funds with ...
  49. // Filter date: 10000 * (year - 1900) + 100 * month + day, so 2001-12-31 becomes 1011231 and 1995-12-31 becomes 951231
  50. // < 0 means the latest available date; 2001-04-05 - 1010405
  51. filterdate = -1;
  52. //minRelStrengthSP =-1000; // relative strength over S&P500 >= this value
  53. min10dayROC =-100;      // Minimum 10 day rate of change < [-1000 means better then S&P 500]
  54. min22dayROC =-1000;      // Minimum 22 day rate of change < [-1000 means better then S&P 500]
  55. min13weekROC = -1000;    // Minimum 13 week rate of change < [-1000 means better then S&P 500]
  56. min9weekROC = -1000;     // Minimum 9 week rate of change < [-1000 means better then S&P 500]
  57. minWeightedROC = -1000;  // Minimum weighted ROC !! FUNDS WITH EMPTY WEIGHTED ROC (due to lack of 26 week data) ARE ALWAYS INCLUDED !!
  58. minCPR = -1000;          // Minimum CPR !! FUNDS WITH EMPTY WEIGHTED ROC (due to lack of 26 week data) ARE ALWAYS INCLUDED !!
  59.     
  60. // Smoothing factor (as EMA) for ROC parameters
  61. // SET TO 1 if want to disable smoothing
  62. //
  63. ROC5DayEMA = 9;
  64. ROC10DayEMA =9;
  65. ROC22DayEMA = 9;
  66. ROC9WeekEMA =9;
  67. ROC13WeekEMA =9;
  68. ROC26WeekEMA =9;
  69. //
  70. // WEIGHT coefficients for the weighted ROC calculation
  71. //
  72. weightROC5DayEMA = 10;
  73. weightROC10DayEMA = 15;
  74. weightROC22DayEMA = 15;
  75. weightROC9WeekEMA = 10;
  76. weightROC13WeekEMA = 5;
  77. weightROC26WeekEMA = 1;
  78. r5  = ema ( close, ROC5DayEMA);
  79. r10 = ema ( close, ROC10DayEMA);
  80. r22 = ema (close , ROC22DayEMA);
  81. r9w = ema (close , ROC9WeekEMA);
  82. r13w= ema (close, ROC13WeekEMA);
  83. r13w = IIF (isEmpty (r13w), r9w, r13w);
  84. r26w= ema (close, ROC26WeekEMA);
  85. r26w = IIF (isEmpty (r26w), r13w, r26w);
  86. r52w= ema (close, ROC26WeekEMA);
  87. r52w = IIF (isEmpty (r52w), r26w, r52w);
  88. numcolumns = 12;
  89. column2 = ROC5d =  roc (r5 , 5 )  ;
  90. column2name = "5 d %";      
  91. column3 = ROC10d = roc (r10 , 10 ) ;
  92. column3name = "10 d %";     
  93. column4 = ROC22d = roc (r22, 22)  ;
  94. column4name = "22 d %";     
  95. column5 = ROC9w =  roc (r9w, 5*9) ;
  96. column5name = "9 w %";      
  97. column6 = ROC13w = roc (r13w, 5*13);
  98. column6name = "13 w %";     
  99. column7 = ROC26w = roc (r26w, 5*26);
  100. column7name = "26 w % ";
  101. ROC52w = roc (r52w, 5*52);
  102. // Experimental: relation to S&P 500 10 day ROC
  103. //column10 = RSSP = ROC10d * 100 / (ema (roc(foreign ("^SPC", "close") , 10 ), ROC10DayEMA));
  104. //column10name = "RS S&P %";
  105. column0 = weightedROC = (weightROC5DayEMA *ROC5d + weightROC10DayEMA *ROC10d + weightROC22DayEMA *ROC22d + weightROC9WeekEMA *ROC9w + weightROC13WeekEMA *ROC13w + weightROC26WeekEMA * ROC26w)/(weightROC5DayEMA + weightROC10DayEMA + weightROC22DayEMA + weightROC9WeekEMA + weightROC13WeekEMA + weightROC26WeekEMA);
  106. column0name = "Wght ROC%";
  107. column1 = fundXCPR =   (roc (c, 22) + roc (c, 13*5) +  roc (c, 26*5) + roc (c, 52*5))  / 4;
  108. column1name = "CPR";
  109. //
  110. // Calculate S&P ROCs for filtering
  111. //
  112. r5sp   = roc (foreign ("^SPC", "close"), 5 )  ;
  113. r10sp  = roc (foreign ("^SPC", "close"), 10 ) ;
  114. r22sp  = roc (foreign ("^SPC", "close"), 22)  ;
  115. r9wsp  = roc (foreign ("^SPC", "close"), 5*9) ;
  116. r13wsp = roc (foreign ("^SPC", "close"), 5*13);
  117. r26wsp = roc (foreign ("^SPC", "close"), 5*26);
  118. r52wsp = roc (foreign ("^SPC", "close"), 5*52);
  119. ROC5dSP  = ema (r5sp  , ROC5DayEMA)  ;
  120. ROC10dSP = ema (r10sp , ROC10DayEMA)  ;
  121. ROC22dSP = ema (r22sp , ROC22DayEMA)   ;
  122. ROC9wSP  = ema (r9wsp , ROC9WeekEMA);
  123. ROC13wSP = ema (r13wsp, ROC13WeekEMA);
  124. ROC26wSP = ema (r26wsp, ROC26WeekEMA);
  125. ROC52wSP = ema (r52wsp, ROC26WeekEMA);
  126. min10dayROC  = IIF (min10dayROC  <= -1000, ROC10dSP, min10dayROC );
  127. min22dayROC  = IIF (min22dayROC  <= -1000, ROC22dSP, min22dayROC );
  128. min9weekROC  = IIF (min9weekROC  <= -1000, ROC9wSP , min9weekROC );
  129. min13weekROC = IIF (min13weekROC <= -1000, ROC13wSP, min13weekROC);
  130. minWeightedROC = IIF (minWeightedROC <= -1000, (weightROC5DayEMA *ROC5dSP + weightROC10DayEMA *ROC10dSP + weightROC22DayEMA *ROC22dSP + weightROC9WeekEMA *ROC9wSP + weightROC13WeekEMA *ROC13wSP + weightROC26WeekEMA * ROC26wSP)/(weightROC5DayEMA + weightROC10DayEMA + weightROC22DayEMA + weightROC9WeekEMA + weightROC13WeekEMA + weightROC26WeekEMA), minWeightedROC);
  131. minCPR =  IIF (minCPR <= -1000, (r22sp + r13wsp +  r26wsp + r52wsp)  / 4, minCPR);
  132. filter = IIF (filterdate <= 0, cum(1) == lastvalue (cum(1)), datenum() == filterdate) AND ROC10d >= min10dayROC AND ROC22d >= min22dayROC AND ROC9w >= min9weekROC AND ROC13w >= min13weekROC AND (isEmpty(weightedROC) OR weightedROC >= minWeightedROC) AND (isEmpty (fundXCPR) OR fundXCPR >= minCPR);
  133. "CPR: " + writeval (fundXCPR) + ", S&P CPR: " + writeval (minCPR);
  134. buy = filter;
  135. sell = 0;
  136. short =cover = 0;
  137. // ======== Signals from different systems =====================
  138. // 1. Nate/Dima system
  139. /*
  140.  * combination of Jaco MRI, Williams, and MACD
  141.  */
  142. // Adjustable criteria
  143. moBuyCriteria = 60; // 70?
  144. moSellCriteria = 20; // 30?
  145. rocPeriod = 10;
  146. jacoHold =20; // Hold period
  147. exitOnOverbought  = 0;
  148. // Jaco MRI
  149. /* MRI developed by Jaco Jonker*/
  150. mo=close/ref(close,1)*100 - rsi(14);
  151. HV = hhv(mo,200);
  152. LV = llv(mo,200);
  153. AV = (HV+LV)/2;
  154. jacoBuy = isTrue (mo > moBuyCriteria);
  155. jacoBuy = hold (jacoBuy, jacoHold);
  156. jacoSell = isTrue (mo < moSellCriteria);
  157. jacoSell = hold (jacoSell, jacoHold);
  158. // Williams AC+
  159. outsidebar = outside();
  160. insidebar = H <= Ref(H,-1) and L >= Ref(L,-1);
  161. upbar = H > ref(H,-1) and L >= ref(L, -1);
  162. downbar = L < ref(L,-1) and H <= ref(H,-1);
  163. barcolor=iif(outsidebar, 1, 
  164.                iif(downbar,   4, 
  165.                iif(upbar,        5, 
  166.                iif(insidebar,6, 0 ) ) ) );
  167. var1=ma( A , 34);
  168. var2=ma( A,5);
  169. var3=var2-var1;
  170. var4=var3-ma(var3,5);
  171. wilBuy = var4 > 0;
  172. wilSell = var4 < 0;
  173. //  Graph0=var4;
  174. //  graph0style=2+4;
  175. //  Graph1=wilders(var4,5);
  176. //  Graph1Style=5;
  177. //  Graph0Barcolor=Barcolor;
  178. // MACD
  179. macdBuy = macd() > signal();
  180. macdSell = macd() < signal();
  181. //  MA (instead of Zig-Zag)
  182. mac = ma (c, 10);
  183. maBuy = close > mac AND ref (close > mac, -1); // AND mac >= ref (mac, -1);
  184. maSell = close < mac;
  185. /*Relative Slope*/
  186. /*by Dimitris Tsokakis*/
  187. K=EMA((H+L+C)/3,10);
  188. S1=2*(K-REF(K,-1))/(K+REF(K,-1));
  189. RS=100*EMA(S1,3);
  190. rocDirBuy = RS > 0; // slope is up
  191. rocDirSell = NOT rocDirBuy;
  192. //
  193. // BUY: Jaco MRI was in buy area recently (i.e. the fund was oversold); currently WIlliams AC+ and MACD are above their reference lines (probably should replace it by more sensitive slope of the oscilator as A.Elder recommends); price closes above 10 day MA, and Relative slope is positive
  194. buyLine = isTrue (jacoBuy AND wilBuy AND macdBuy AND maBuy AND rocDirBuy);
  195. SystemBuy = isTrue (cross (buyLine, 0));
  196. // SELL: Jaco MRI was in sell area recently (i.e. the fund was overbought); currently WIlliams AC+ and MACD are below their reference lines (probably should replace it by more sensitive slope of the oscilator as A.Elder recommends); price closes below 10 day MA, and Relative slope is negative
  197. sellLine = isTrue (jacoSell AND wilSell AND macdSell AND maSell AND rocDirSell);
  198. SystemSell = isTrue (cross (sellLine, 0));
  199. sinceBuy = barssince (SystemBuy);
  200. sinceBuy = IIF (IsEmpty (sinceBuy), 1000, sinceBuy);
  201. sinceSell = barssince (SystemSell);
  202. sinceSell = IIF (IsEmpty (sinceSell), 1000, sinceSell);
  203. sinceSignal = IIF (sinceBuy < sinceSell, sinceBuy, -sinceSell);
  204. column8 = sinceSignal;
  205. column8name = "N/D";
  206. column8format = 2.1;
  207. // ------------------  Peak based signals (based on Dags work) ======
  208. pv = peak(close, 2);
  209. buyPeak = isTrue (cross(close, pv + pv/500));
  210. sellPeak = isTrue (cross( pv + pv/1000, close)); 
  211. sinceBuy = barssince (buyPeak);
  212. sinceBuy = IIF (IsEmpty (sinceBuy), 100, sinceBuy);
  213. sinceSell = barssince (sellPeak);
  214. sinceSell = IIF (IsEmpty (sinceSell), 100, sinceSell);
  215. sinceSignal = IIF (sinceBuy < sinceSell, sinceBuy, -sinceSell);
  216. column9 = sinceSignal;
  217. column9name = "Peak";
  218. column9format = 2.0;
  219. // ============= Stochastics divergence =====================
  220. /*Positive Stochastic Divergence for use in
  221. Indicator Builder and Automatic Analysis (scan mode),
  222. by Dimitris Tsokakis*/
  223. ST33=STOCHD(14);
  224. TR1=LLVBARS(ST33,4);
  225. TR2=IIF(ST33<30 AND TR1>0 AND REF(TR1,-1)==0,ref(ST33,-1),0);
  226. TRC=IIF(TR2>0,C,0);
  227. vs=valuewhen(tr2, ref(st33,-1), 1);
  228. dvs=vs-ref(vs,-1);
  229. vc=valuewhen(trc, LLV(c,3), 1);
  230. dvc=vc-ref(vc,-1);
  231. diver=iif(dvs>0 and dvc<0,30,0);
  232. DAS=BARSSINCE(REF(TR2,-1)>0);
  233. DD=IIF(DAS<20 AND C>=REF(C,-1),DIVER,0);
  234. buyStoch=DD>0 ;
  235. sinceBuy = barssince (buyStoch);
  236. sinceBuy = IIF (IsEmpty (sinceBuy), 100, sinceBuy);
  237. /*Negative Stochastic divergence for use in
  238. Indicator Builder and Automatic Analysis (scan mode),
  239. by Dimitris Tsokakis*/
  240. ST33=stochd(14);
  241. TR1=HHVBARS(ST33,4);
  242. TR2=IIF(ST33>70 AND TR1>0 AND REF(TR1,-1)==0,ref(ST33,-1),0);
  243. TRC=IIF(TR2>0,C,0);
  244. vs=valuewhen(tr2, ref(st33,-1), 1);
  245. dvs=vs-ref(vs,-1);
  246. vc=valuewhen(trc, HHV(H,3), 1);
  247. dvc=vc-ref(vc,-1);
  248. diver=iif(dvs<0 and dvc>0,90,0);
  249. DAS=BARSSINCE(REF(TR2,-1)>0);
  250. ddd=IIF(DAS<20 AND C<REF(C,-1),DIVER,0);
  251. sellStoch = ddd > 0;
  252. sinceSell = barssince (sellStoch);
  253. sinceSell = IIF (IsEmpty (sinceSell), 100, sinceSell);
  254. sinceSignal = IIF (sinceBuy < sinceSell, sinceBuy, -sinceSell);
  255. column10 = sinceSignal;
  256. column10name = "Stoch";
  257. column10format = 2.0;
  258. Slw = optimize("slw",3,1,4,1);
  259. Pds1 =optimize("pds",5,1,16,1);
  260. Pds2 = optimize("pds",10,1,16,1);
  261. upM = optimize ("Up margine", 80, 75, 85, 1);
  262. dnM = optimize ("Down margine", 20, 24, 10, 1);
  263. A =ema((Close -LLV(Low,Pds1))/(HHV(H,Pds1)-LLV(L,Pds1)),Slw)*100;
  264. B=ema((A-LLV(A,pds1))/(HHV(A,Pds1)-LLV(A,Pds1)),Slw)*100;
  265. A1 =ema((Close -LLV(Low,Pds2))/(HHV(H,Pds2)-LLV(L,Pds2)),Slw)*100;
  266. B1=ema((A1-LLV(A1,pds2))/(HHV(A1,Pds2)-LLV(A1,Pds2)),Slw)*100;
  267. SHORT = B > upM AND B1 < dnM;
  268. BUY = B1 > upM AND B < dnM;
  269. confShort = Hold (Short, 5) AND B < Ref (B, -1) and (B - B1) > 40;
  270. confBuy = Hold (Buy, 5) AND B > Ref (B, -1) and (B1 - B) > 40;;
  271. SELL = COVER = 0;
  272. // Do not display confirmed buy/sell meanwhile
  273. sinceBuy = barssince (confBuy);
  274. sinceBuy = IIF (IsEmpty (sinceBuy), 100, sinceBuy);
  275. sinceSell = barssince (SHORT);
  276. sinceSell = IIF (IsEmpty (sinceSell), 100, sinceSell);
  277. sinceSignal = IIF (sinceBuy < sinceSell, sinceBuy, -sinceSell);
  278. column11 = sinceSignal;
  279. column11name = "5&10 Stch";
  280. column11format = 2.0;