Автор:
Разместил:   Дата: 2005-12-27 16:39
Комментарии: (0)   Рейтинг:

Confluence

NOTE: I posted the following to the Omega List back in 1998. This is the SUM TOTAL of my knowledge about Dale Legan's "Confluence" indicator.  I do not have ANY further background or understanding about what Dale was trying to accomplish, and Dale has apparently disappeared.  If you're interested in this and want more information, you're o­n your own.


Hi O-listers,

  I'm glad to see that the list seems to be getting back to a few trading  discussions. In the hopes of sparking a bit more trading discussion and less  bashing, I'm appending some code I've been playing with using Dale Legan's recently-posted Confluence indicator.

Thanks for sharing this with us, Dale, and I hope you come through your surgery OK.

I've done several things:

* I moved the core Confluence computations into a Confluence function. Since the Confluence indicator returned several "states" (bull, bear, yellow, and zero), I modified the return value a bit: -9 to -1 = Bearish, -0.9 to 0.9 = "yellow"  (and zero), 1 to 9   = Bullish. The "yellow" range corresponds to the "yellow" values plotted by Dale's indicator, but they're divided by 10.  So -0.4 is equivalent to "yellow -4" in Dale's indicator.

* I got rid of a bit of extra computation in the function.  I didn't try to do a hard-core Pierre-style optimization :-), but I noticed several significant chunks of calculation were being done several times each bar, and I commented them out and replaced them with an intermediate variable.  It still calls sine/cosine a dozen times o­n each bar, which accounts for the bulk of the processing time, but I think it's a bit easier to understand what the code is doing this way.  (It also seems to work better -- see below.)  For the most part I didn't try to use mnemonic names for these intermediate variables, because I don't understand exactly what the values represent!!

* I'm appending a simplified Confluence indicator using the function.

* I've also appended a simple Confluence system.  This system sets an entry stop above/below the current bar if Confluence goes into bull/bear mode, and similarly sets an exit stop below/above the bar where it exits bull/bear mode.  There's also an optional "aggressive" stop mode that tightens the stops if the market moves in your direction; for example, if the high is 1000 and your "Trigger" offset is 2, the initial stop is set at 1002.  If the next bar has a high of 997, the stop is tightened to 997+2=999.

The system has its MaxBarsBack property set to 150, which works for values of Harmonic up to about 15.  If you experiment with large values of Harmonic, you will have to change MaxBarsBack to roughly 10*Harmonic.

Interestingly, when I first wrote this system, I ran into a strange MaxBarsBack problem.  The Confluence indicator worked just fine with a MaxBarsBack setting of "Auto-Detect."  But systems don't have a setting like that -- you have to specify a fixed value.  But NO fixed value (up to the maximum of 999) worked for either the system OR the indicator! And I couldn't see anywhere that it was looking back that many bars. Then, when I did the optimization o­n the Confluence code, the MaxBarsBack problem mysteriously disappeared.  Sometimes TradeStation is just spooky...  Any ideas what happened?

I've appended a sample system report for the system o­n SPX, using the default parameters.  The system actually does pretty well.  It probably won't make anyone rich, but I thought some folks might enjoy playing with it.  There are some other things you could do with it -- e.g. it might be interesting to change it to look for long opportunities when Confluence hits -9, and short when it hits 9.  If I get a chance to throw that together, I'll post it to the list.

The ELA code is appended (assuming it makes it through the list's size filters).  The source and the ELA are also available in my FTP directory, ftp://ftp.frii.com/pub/fritz .

Have fun,
Gary

Type : Function, Name : DerivativeMA

{ Function: DerivativeMA -- used by Confluence function }

Inputs:  Price(numeric), Length(Numeric);
VARS: DERIV(0),SUMD(0),LENG2(0),N1(0),DR(0);
DERIV= (AVERAGE(Price,Length)*2) - AVERAGE(Price,Length)[1];
SUMD=Length*DERIV;
LENG2=length - 1 ;
N1= (AVERAGE(Price,LENG2))*LENG2;
DR=SUMD-N1;
DerivativeMA = DR;


Type : Function, Name : Confluence

{Function: Confluence
Returns a value from -9 to +9.
-9 to -1:  bearish
-0.9 to +0.9:  "yellow"
1 to 9:  bullish

Written by Dale Legan }

Input: price(Numeric),Harmonic(Numeric);

vars: STL(0),ITL(0),LTL(0),HOFF(0),SOFF(0),IOFF(0),LTOFF(0),Phase(1);
vars: mtl(0),momsig(0),mom(0),HT(0),HTA(0);
vars: ST(0),STA(0),IT(0),ITA(0),SUM(0),ERR(0),ERRSUM(0),ERRSIG(0),TC(0),TCSIG(0);
vars: ERRNUM(0),MOMNUM(0),TCNUM(0);
Vars: Havg(0), Savg(0), Iavg(0), Lavg(0);

{Calculate Lengths}
if (BarNumber = 1) then begin
  MTL=harmonic/2;
  STL= IntPortion((harmonic*2)-1);  {11}
  ITL= IntPortion((STL*2)-1);             {21}
  LTL= IntPortion((ITL*2)-1);              {41}

  HOFF=intportion(harmonic/2);     {3}
  SOFF=intportion(STL/2);               {5}
  IOFF=intportion(ITL/2);                 {10}
  LTOFF=intportion(LTL/2);             {20}
  end;

{ Averages }

Havg = average(price, Harmonic);
Savg = average(price, STL);
Iavg = average(price, ITL);
Lavg = average(price, LTL);

{Cycle Momentum}

value2 = Savg - Havg[HOFF];
value3 = Iavg - Savg[SOFF];
value12 = Lavg - Iavg[IOFF];

momsig = value2 + value3 + value12;  {Momentum Signal Line}

value5= ((summation(price,harmonic-1) + derivativema(price,harmonic))/harmonic);
value6= ((summation(price,STL-1) + derivativema(price,STL))/STL);
value7= ((summation(price,ITL-1) + derivativema(price,ITL))/ITL);
value13=((summation(avgprice,LTL-1) + derivativema(price,LTL))/LTL);

value9 = value6 - value5[HOFF];
value10=value7 - value6[SOFF];
value14=value13 - value7[IOFF];
mom = value9 + value10 + value14;

{ harmonic =6 was 5 may use harmonic -1 }
{
HT= sine((summation(price,(harmonic-1))+derivativema(price,harmonic))/harmonic) +
cosine((summation(price,(harmonic-1))+derivativema(price,harmonic))/harmonic);
}
HT = sine(value5) + cosine(value5);
HTA= sine(Havg) + cosine(Havg);

{
ST=  sine((summation(price,(STL-1))+derivativema(price,STL))/ STL) +
cosine((summation(Price,(STL-1))+derivativema(Price,STL))/STL);
}
ST = sine(value6) + cosine(value6);
STA = sine(Savg) + cosine(Savg);

{
IT= sine((summation(price,(ITL-1))+derivativema(c,ITL))/ITL) +
cosine((summation(price,(ITL-1))+derivativema(Price,ITL))/ITL);
}
IT = sine(value7) + cosine(value7);
ITA=sine(Iavg)+ cosine(Iavg);

Sum= HT+ST+IT; {Est in Cyc Estimator/ Cycle Est Err = Sum - Err }
Err =HTA + STA +ITA;

{phase detect}

Condition2=  (Sum > Sum[SOFF]
             and Havg < Havg[SOFF])
         OR (Sum < Sum[SOFF]
             and Havg > Havg[SOFF]) ;
Phase=1;
if Condition2 then Phase=-1;

ErrSum = (Sum - Err)*phase;  { ERROR OF THE CYCLE}
ErrSig=average(ErrSum,SOFF);   { ERROR SIGNAL LINE}

{Trend Catcher}

value68=value5;
  {( (summation(price,(harmonic-1)) + derivativema(price,harmonic)) / harmonic );}
value69=value13;
  {( (summation(avgprice,(LTL-1)) + derivativema(price,LTL)) / LTL );}

value70 = value68-value69; { EST W Der}
value71 = average(value70,Harmonic);

TC =value70;
TCSig=value71;

{Begin Counting Bars}

If ErrSum > 0 then begin
if Errsum < ErrSum[1] and ErrSum < ErrSig then ErrNum=1;
If ErrSum ErrSig then ErrNum=2;
If ErrSum>ErrSum[1] and ErrSumIf ErrSum > ErrSum[1] and ErrSum> ErrSig then ErrNum=3;
End;
If ErrSum < 0 then begin
if Errsum > ErrSum[1] and ErrSum > ErrSig then ErrNum=-1;
If ErrSum ErrSig then ErrNum=-2;
If ErrSum>ErrSum[1] and ErrSumIf ErrSum < ErrSum[1] and ErrSum< ErrSig then ErrNum=-3;
End;

If Mom > 0 THEN begin
if mom < mom[1] and mom < momsig then momNum=1;
If mom momsig then momNum=2;
If mom>mom[1] and momIf mom > mom[1] and mom> momSig then momNum=3;
End;
If mom < 0 then begin
if mom > mom[1] and mom > momSig then momNum=-1;
If mom momSig then momNum=-2;
If mom>mom[1] and momIf mom < mom[1] and mom< momSig then momNum=-3;
End;

If TC > 0 THEN begin
if TC < TC[1] and TC < TCsig then TCNum=1;
If TC TCsig then TCNum=2;
If TC>TC[1] and TCIf TC > TC[1] and TC> TCSig then TCNum=3;
End;
If  TC < 0 then begin
if TC > TC[1] and TC > TCSig then TCNum=-1;
If TC TCSig then TCNum=-2;
If TC>TC[1] and TCIf TC < TC[1] and TC< TCSig then TCNum=-3;
End;

value42= ErrNum + MomNum+TCNum;


Confluence = 0;
IF value42 >0 and TC >0 THEN Confluence = Value42;  { Bullish }
IF value42<0 and TC < 0 THEN Confluence = Value42;  { Bearish }
If (value42 > 0 and tc <0) or (value42 <0 and tc>0) then Confluence = Value42 / 10;


Type : Indicator, Name : Confluence

{ Indicator: Confluence }
Input: price(close),Harmonic(10);
Vars: Conf(0);
Conf = Confluence(price, Harmonic);
IF Conf >= 1 THEN Plot1(Conf, "Bull");
IF Conf <= -1 THEN Plot2(Conf,"Bear");
If (Conf = 0) then Plot4(0,"ZERO")
else If (Conf > -1) and (Conf < 1) then Plot3(10*Conf, "Yellow");




RE: Confluence Indicator (simplified)
To: "'metastock@xxxxxxxxxxxxx'" < metastock@xxxxxxxxxxxxx>
Subject: RE: Confluence Indicator (simplified)
From: Mark Jurik
Date: Fri, 7 Apr 2000 19:01:44 -0600
Reply-To: metastock@xxxxxxxxxxxxx
Sender: owner-metastock@xxxxxxxxxxxxx

The function DerivativeMA, as posted with the following EL code...

---------------------------------------------
Inputs:  Price(numeric), Length(Numeric);
VARS: DERIV(0),SUMD(0),LENG2(0),N1(0),DR(0);
DERIV= (AVERAGE(Price,Length)*2) - AVERAGE(Price,Length)[1];
SUMD=Length*DERIV;
LENG2=length - 1 ;
N1= (AVERAGE(Price,LENG2))*LENG2;
DR=SUMD-N1;
DerivativeMA = DR;
--------------------------------------------

can be simplified to the following equivalent code...

--------------------------------------------
Inputs:  Price(numeric), Length(Numeric);
DerivativeMA = Price - Price[Length] + Price[Length-1] ;
--------------------------------------------


 
Реклама:

Rambler's Top100

Страница создана за 0.03 секунды