1: /* Ord Volume by Peter Bjarheim
2: Rev - 11-12-07
3: Adjust "zig percent change" so that each swing last from 5 to 30 days
4: (the the percentage, the more sigificant the swing is).
5: Peak Volume Extreme Detection:
6: ->Sometimes several days around the true swing price extreme, a higher volume
7: extreme has been encountered.
8: Back testing suggests that these swing volumes while rare, do occur and are
9: significant.
10: ----> Rules For Trading from http://www.ord-oracle.com/
11: This software is designed to pick out the swings in a stock and then measure
12: the force between the swings. The
13: force is the amount of volume between the swings that pushes the stock in an
14: up-mode or down-mode. Stocks trend
15: in the direction of the highest volume. Stocks correct or consolidate on
16: lighter volume. By measuring the volume
17: between the swings and comparing to previous swings, one can "See" the force of
18: a particular move developing in the
19: stock. In an uptrend the stock should have higher volume on the rally phase
20: than the correction phase. In a
21: downtrend the stock should have higher volume on the declining phase than the
22: up correction phase. With that in
23: mind, we have developed this software to do just that. Keep in mind that this
24: software measures volume force in a
25: stock and is not implied to be a stand-alone tool to pick every turn in a
26: stock. The Ord-volume software is designed
27: to help identify the probable direction by the volume flow the stock has. Other
28: factors of the stock may push it in a
29: different direction.
30: 1. To pick the strongest stock (in up-trend), average daily volume should
31: shrink near 50% on correction phase
32: compared to the rally phase.
33: 2. To pick the weakest stocks (in down-trend) average daily volume should
34: shrink near 50% on up phase compared to
35: the declining phase.
36: Definition of a "Swing". A "Swing" is a price high or low where the stock
37: changes direction.
38: Definition of "Ord-Volume". "Ord-volume" measures the average volume between
39: "Swings".
40: Definition of "Ord-Volume Low". "Ord-Volume Low" is a down-leg in a stock.
41: Definition of "Ord-Volume High". "Ord-Volume High" is an up-leg in a stock.
42: 3. A buy signal is triggered when a stock closes above a previous important
43: "Ord-Volume low" where the current
44: "Ord-volume low" shrinks near 50% or greater against the "Important "Ord-volume
45: low"". An "Important
46: "Ord-volume Low" is when that low marks a bottom where the equity starts a
47: sideways consolidation.
48: 4. A sell signal is triggered when a stock closes below a previous important
49: "Ord-Volume High" where the current
50: "Ord-Volume High" shrinks near 50% or greater against the "Important
51: "Ord-Volume High"". An "Important
52: "Ord-Volume High"" is when that high marks a top where the equity starts a
53: sideways consolidation.
54: 5. Target price Projections:
55: 5.1 An upside target for a buy signal will be the previous "Swing High". If
56: volume is equal or greater on the test of the
57: previous high then the next higher swing high will be the target and so on.
58: 5.2 A downside target after a sell signal will be the previous "Swing Low". If
59: volume is equal or greater than the
60: previous "Swing Low" then the next lower swing will be the target and so on.
61: */
62: swingDays = 0;
63: swingVol = 0;
64: ordVol = 0;
65: upswingSignal = 0;
66: downswingSignal = 0;
67: accumulatedVolume = 0;
68: accumulatedDays = 0;
69: arrayHasSignal = 0;
70: zigPercentage = Param("ZigZag Percent", 10, 2, 50);
71: trendZig = Zig(C, zigPercentage);
72: action = Status("action");
73: midPointY = 0;
74: midPointValue = 0;
75: peakVolumeExtremeDetectionDays = Param("Peak Vol. Days", 6, 1, 20); //3 days
76: before and 3 days after a peak
77: daysBeforeAndAfterForPeakVolume = round(peakVolumeExtremeDetectionDays/2);
78: peakVolume = 0;
79: colorOrdVolume = ParamColor("Ord Vol. Info.", colorGrey50);
80: colorZig = ParamColor("ZigZag", colorGold);
81: colorPeakUp = ParamColor("Support Info.", colorGreen);
82: colorPeakDown = ParamColor("Resistance Info.", colorRed);
83: scalingFactor = 0.1;
84: function volumeInMillions(inVolume)
85: {
86: volInM = inVolume/1000000;
87: return NumToStr(volInM, 1.2, False) + " m";
88: }
89: function getPeakVolume(daysToCheck, nowDay)
90: {
91: returnPeakVolume = V[nowDay];
92: dayNumberBefore = (nowDay) - daysToCheck;
93: dayNumberAfter = (nowDay) + daysToCheck;
94: //find Max swing Volume
95: if( dayNumberBefore > 0 AND dayNumberAfter < BarCount )
96: {
97: returnPeakVolume = V[dayNumberBefore];
98: //_TRACE("Start returnPeakVolume = " + returnPeakVolume);
99: for( j = dayNumberBefore; j < dayNumberAfter; j++ )
100: {
101: if(returnPeakVolume < V[j])
102: {
103: returnPeakVolume = V[j];
104: }
105: //_TRACE("returnPeakVolume = " + returnPeakVolume);
106: }
107: }
108: else if( dayNumberBefore > 0 AND dayNumberAfter >= BarCount )
109: {
110: returnPeakVolume = V[dayNumberBefore];
111: //_TRACE("Start returnPeakVolume = " + returnPeakVolume);
112: for( j = dayNumberBefore; j < BarCount; j++ )
113: {
114: if(returnPeakVolume < V[j])
115: {
116: returnPeakVolume = V[j];
117: }
118: //_TRACE("returnPeakVolume = " + returnPeakVolume);
119: }
120: }
121: else
122: {
123: peakVolume = V[i-1];
124: }
125: return returnPeakVolume;
126: }
127: for( i = 3; i < BarCount; i++)
128: {
129: //initialize parameters
130: arrayHasSignal[i] = 0;
131: //Then we check which way the price goes
132: swingVol = swingVol + V[i-1];//Don't add today since price may have changed
133: direction
134: swingDays = swingDays + 1;
135: if( (trendZig[i] < trendZig[i-1]) AND (trendZig[i-1] > trendZig[i-2]) AND i >
136: 10 )//Changes from up swing to down swing
137: {
138: /*_TRACE("Changes from up swing to down swing, i = " + i);
139: _TRACE("trendZig[i-2] = " + trendZig[i-2]);
140: _TRACE("trendZig[i-1] = " + trendZig[i-1]);
141: _TRACE("trendZig[i] = " + trendZig[i]);*/
142: downswingSignal[i-1] = 0;
143: upswingSignal[i-1] = 1;
144: ordVol[i-1] = swingVol/swingDays;
145: accumulatedVolume[i-1] = swingVol;
146: accumulatedDays[i-1] = swingDays;
147: arrayHasSignal[i-1] = 1;
148: if(action == actionIndicator)
149: {
150: midPointValue = i - round(swingDays/2) - 1;
151: midPointY = trendZig[midPointValue];
152: peakVolume = getPeakVolume(daysBeforeAndAfterForPeakVolume, i - 1);
153: PlotText("(" + volumeInMillions(ordVol[i-1]) + ")", midPointValue,
154: midPointY, colorOrdVolume);
155: PlotText(NumToStr(H[i-1], 1.1, False) + " (" + volumeInMillions(peakVolume)
156: + ")", i-4, trendZig[i-1] * 1.02, colorPeakUp);
157: }
158: swingVol = 0;
159: swingDays = 0;
160: }
161: if( (trendZig[i] > trendZig[i-1]) AND (trendZig[i-1] < trendZig[i-2]) AND i >
162: 10 )//Changes from down swing to up swing
163: {
164: downswingSignal[i-1] = 1;
165: upswingSignal[i-1] = 0;
166: ordVol[i-1] = swingVol/swingDays;
167: accumulatedVolume[i-1] = swingVol;
168: accumulatedDays[i-1] = swingDays;
169: arrayHasSignal[i-1] = 1;
170: if(action == actionIndicator)
171: {
172: midPointValue = i - round(swingDays/2) - 1;
173: midPointY = trendZig[midPointValue];
174: peakVolume = getPeakVolume(daysBeforeAndAfterForPeakVolume, i - 1);
175: PlotText("(" + volumeInMillions(ordVol[i-1]) + ")", midPointValue,
176: midPointY, colorOrdVolume);
177: PlotText(NumToStr(L[i-1], 1.1, False) + " (" + volumeInMillions(peakVolume)
178: + ")", i-4, trendZig[i-1] * 0.95, colorPeakDown);
179: }
180: swingVol = 0;
181: swingDays = 0;
182: }
183: if( i == BarCount - 1)//add last signal too
184: {
185: swingVol = swingVol + V[i];//Remember to add today also
186: swingDays = swingDays + 1;
187: if(trendZig[i] < trendZig[i-1])//is down swing
188: {
189: downswingSignal[i] = 1;
190: upswingSignal[i] = 0;
191: ordVol[i] = swingVol/swingDays;
192: accumulatedVolume[i] = swingVol;
193: accumulatedDays[i] = swingDays;
194: arrayHasSignal[i] = 1;
195: }
196: if(trendZig[i] > trendZig[i-1])//is up swing
197: {
198: downswingSignal[i] = 0;
199: upswingSignal[i] = 1;
200: ordVol[i] = swingVol/swingDays;
201: accumulatedVolume[i] = swingVol;
202: accumulatedDays[i] = swingDays;
203: arrayHasSignal[i] = 1;
204: }
205: if(action == actionIndicator)
206: {
207: midPointValue = i - round(swingDays/2) - 1;
208: midPointY = trendZig[midPointValue];
209: PlotText("(" + volumeInMillions(ordVol[i]) + ")", midPointValue, midPointY,
210: colorOrdVolume);
211: }
212: }
213: }
214: if(action == actionExplore)
215: {
216: //Filter = 1;
217: Filter = arrayHasSignal;
218: //AddColumn(trendZig , "trendZig ", 1.2);
219: AddColumn(C, "Swing Up", 1.2, colorDefault, IIf(upswingSignal, colorPeakUp,
220: colorDefault));
221: AddColumn(C, "Swing Down", 1.2, colorDefault, IIf(downswingSignal,
222: colorPeakDown, colorDefault));
223: AddColumn(ordVol, "Ord Vol.", 1.0);
224: AddColumn(accumulatedDays, "Swing Days", 1.0);
225: AddColumn(accumulatedVolume, "Tot. Swing Vol.", 1.0);
226: }
227: else if(action == actionIndicator)
228: {
229: Plot(trendZig, "Ord Vol ZigZag", colorZig);
230: //Scale the axis so we can read the numbers
231: Plot(trendZig + (trendZig * scalingFactor), "", colorRed, styleNoDraw);
232: Plot(trendZig - (trendZig * scalingFactor), "", colorBlue, styleNoDraw);
233: }
234: ///////////////selesai////////////////////////////
sumber http://amibrokerindonesia.blogspot.com/2010/02/re-komunitas-amibroker-afl-alligator_02.html
No comments:
Post a Comment