COG indicator

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » wo dec 29, 2010 12:45 pm

Eric,

Het script geeft een foutmelding. De bedoeling is om een gestreepte lijn te trekken door de COG op -0,5. Zou je aub eens kunnen kijken wat er fout zit?

Gr Paulkr

Code: Selecteer alles

{- Filename: GOS mid line -}
{ "Center of Gravity" van J.F. Ehlers }
{ www.JSTAS.com }

Var
Level1,i,j,Ln                : integer;
Num, Denom, CG, Price : TSeries;

Begin
CG    := CreateSeries(Barcount)               ;
Num   := FillSeries(CreateSeries(BarCount),0) ;
Denom := FillSeries(CreateSeries(Barcount),0) ;
Price := DivideSeriesBy(AddSeries(High,Low),2);
Level1:= CreateParameterInteger('mid line', 1, 999, -0.50, true);
Ln    := CreateparameterInteger('Geef venster-waarde',2,20,8,False);

For i := Ln to BarCount-1 Do
  Begin
    For j := 0 to Ln-1 Do
      Begin
        Num[i]   := Num[i] + (1+j)*Price[i-j];
        Denom[i] := Denom[i] + Price[i-j]    ;
      End;
        CG[i] := -Num[i]/Denom[i] + (Ln + 1)/2;
  End;
  with CreateLine(FillSeries(CreateSeries(BarCount), Level1)) do
  begin
    Color := clSilver;
    LineType := ltDot;
    Width := 1;
  end;

With CreateLine(CG) Do
  Begin
    Name  := 'COG'         ;
    Color := RGB(0,128,255);
  End;

With CreateLine(ShiftSeries(CG,-1)) Do
  Begin
    Color := RGB(128,255,255);
    Width := 1 ;
  end;
End. 

PaulM
Berichten: 431
Lid geworden op: do apr 06, 2006 11:56 pm
Locatie: Enschede

Bericht door PaulM » wo dec 29, 2010 1:15 pm

Code: Selecteer alles

{- Filename: GOS mid line -} 
{ "Center of Gravity" van J.F. Ehlers } 
{ www.JSTAS.com } 

Var 
i,j,Ln                : integer;
Num, Denom, CG, Price : TSeries; 
iLevel                : Real;
Begin 
CG    := CreateSeries(Barcount)               ; 
Num   := FillSeries(CreateSeries(BarCount),0) ; 
Denom := FillSeries(CreateSeries(Barcount),0) ; 
Price := DivideSeriesBy(AddSeries(High,Low),2); 
iLevel:= CreateParameterReal('mid line', -100, 100, -0.50, true);
Ln    := CreateparameterInteger('Geef venster-waarde',2,20,8,False); 

For i := Ln to BarCount-1 Do 
  Begin 
    For j := 0 to Ln-1 Do 
      Begin 
        Num[i]   := Num[i] + (1+j)*Price[i-j]; 
        Denom[i] := Denom[i] + Price[i-j]    ; 
      End; 
        CG[i] := -Num[i]/Denom[i] + (Ln + 1)/2; 
  End; 
  with CreateLine(FillSeries(CreateSeries(BarCount), iLevel)) do
  begin
    Name  := 'Level'; 
    Color := clSilver; 
    LineType := ltDot; 
    Width := 1; 
  end; 

With CreateLine(CG) Do 
  Begin 
    Name  := 'COG'         ; 
    Color := RGB(0,128,255); 
  End; 

With CreateLine(ShiftSeries(CG,-1)) Do 
  Begin 
    Color := RGB(128,255,255); 
    Width := 1 ; 
  end; 
End. 
Mvg,
Paul

paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » wo dec 29, 2010 2:19 pm

Bedankt voor de service PaulM

paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » do dec 30, 2010 11:34 am

PaulM,

Na wat testen en googlen moet ik concluderen dat de COG versie met de 3 referentie lijnen http://www.linnsoft.com/tour/techind/cog.htm in combinatie met gebruik van RSI Brown goede instap momenten geeft. Is het mogelijk om in de COG indicator van Janus de 3 referentie lijnen toe te voegen zoals beschreven in de linnsoft url? Het zou helemaal fantastisch zijn indien dan de koop en verkoop signalen tevens kunnen worden toegevoegd en deze ook via TAR scanner zijn te filteren.

Koop: kruising van de lijnen vindt plaats onder de onderste rode lijn
Verkoop: kruising van de lijnen vindt plaats boven de bovenste rode lijn

PaulM
Berichten: 431
Lid geworden op: do apr 06, 2006 11:56 pm
Locatie: Enschede

Bericht door PaulM » do dec 30, 2010 9:40 pm

PaulKr,

Ik heb de indicator hier geplaatst: http://ta-script.com/forum/viewtopic.php?p=5396#5396

Mvg,
Paul

paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » za jan 15, 2011 12:43 pm

Janus & Eric
Is het mogelijk om de indicatoren COG (bovenstaande versie van Janus) en de Dom Cyclus dms filterbank inelkaar te schijven, dusdanig dat de COG wordt weergegeven met de instelling dom. cyclus waarde/2 ? (Een grijs gestreepte middenlijn door de cog zou helemaal te gek zijn met de optie deze aan en uit te zetten en koop en verkoop signalen bij het kruisen van de 2 COG lijnen)

>Een oscillator als deze heeft ook de beste instelling op de helft van dominante cyclus waarde, en kan dus het beste niet met een vaste venster-waarde worden >uitgevoerd, maar met de dominante cylcus waarde welke rolt uit de door mij gegeven TA-scripts voor de dom. cyclus waarde/2.

COG indicator http://ta-script.com/forum/viewtopic.php?t=521&start=0
Post van; geplaatst: Ma Jun 09, 2008 12:42 am

Dom_Cyclus dmv filterbank scipt:

Code: Selecteer alles

{- Filename: Dom_Cyclus dmv filterbank -}

//Dominante cyclus d.m.v. filters
// Auteur J.F. Ehlers
// Vertaling JSTAS.com

Var
i,n,Brs,Opg                               :Integer;
MaxAmpl,Num,Denom                         : Real;
sPrice,sHP,sSmthHP,DC,DomCyc              : TSeries;
Ln10,Alpha,Alpha1,Beta,Delta,Gamma,T      : extended;
LA,Q,Real,Lmag,OldLa,OldQ,OldReal,OldLmag : TSeries;
OlderLa,OlderQ,OlderReal,OlderLmag,Ampl,DB: TSeries;

Begin

With Indicator Do
  Begin
    RequiredBars := 250;
    Shortname    := 'Dom_Cyclus';
  End;
 
DB        := FillSeries(CreateSeries(51),0);
La        := FillSeries(CreateSeries(51),0);
Q         := FillSeries(CreateSeries(51),0);
Real      := FillSeries(createSeries(51),0);
Lmag      := FillSeries(createSeries(51),0);
Ampl      := FillSeries(CreateSeries(51),0);
OldLa     := FillSeries(createSeries(51),0);
OldQ      := FillSeries(CreateSeries(51),0);
OldReal   := FillSeries(CreateSeries(51),0);
OldLmag   := FillSeries(createSeries(51),0);
OlderLa   := FillSeries(CreateSeries(51),0);
OlderQ    := FillSeries(CreateSeries(51),0);
OlderReal := FillSeries(CreateSeries(51),0);
OlderLmag := FillSeries(CreateSeries(51),0);

Opg     := CreateParameterInteger('Aantal te meten koersbars',250,10000,300,False);
sHP     := FillSeries(CreateSeries(Barcount),0);
sSmthHP := FillSeries(CreateSeries(Barcount),0);
Dc      := FillSeries(CreateSeries(Barcount),0);
DomCyc  := CreateSeries(Barcount);
sPrice  := DivideSeriesBy((AddSeries(High,Low)),2);
Alpha1  := (1-Sin(Pi*2/40))/(Cos(Pi*2/40));   //(1-Sin((Pi/180)*(360/40)))/Cos((Pi/180)*(360/40));
Ln10    := Ln(10);
Brs     :=(Barcount-(Opg+65));
If (Brs<7)Then Brs:=7;

For i:= Brs to BarCount-1 Do
Begin
    sHP[i] := 0.5*(1+Alpha1)*(sPrice[i]-sPrice[i-1])+(sHP[i-1]*Alpha1);
    sSmthHp[i] :=(sHP[i]+sHP[i-1]*2+sHP[i-2]*3+sHP[i-3]*3+sHP[i-4]*2+sHP[i-5])/12;
    Delta := -0.15*i+0.5;
    If (Delta <0.15) Then Delta := 0.15;
    T:=(sSmthHp[i]-sSmthHp[i-1])/(2*Pi);

    For n := 8 to 50 Do
      Begin
        Beta    :=Cos(2*Pi/n);    //Cos((Pi/180)*(360.0/n));
        Gamma   :=1/(Cos(4*Pi*Delta/n)); //1/(Cos((Pi/180)*(720*Delta/N)));
        Alpha   := Gamma-(Sqrt(Gamma*Gamma -1));
        Q[n]    := n * T;
        La[n]   := sSmthHp[i];
        Real[n] := 0.5*(1-Alpha)*(La[n] - OlderLa[n]) + Beta*(1+Alpha)*OldReal[n] - Alpha*OlderReal[n];
        Lmag[n] := 0.5*(1-Alpha)*(Q[n]-OlderQ[n])+ Beta*(1+Alpha)*OldLMag[n] - Alpha*OlderLMag[n];
        Ampl[n] := (Real[n]*Real[n]+LMag[n]*LMag[n]);
      End;
   OlderLa   := DivideSeriesBy(OldLa,1);
   OldLa     := DivideSeriesBy(La   ,1);
   OlderQ    := DivideSeriesBy(OldQ ,1);
   OldQ      := DivideSeriesBy(Q    ,1);
   OlderReal := DivideSeriesBy(OldReal,1);
   OldReal   := DivideSeriesBy(Real   ,1);
   OlderLmag := DivideSeriesBy(OldLmag,1);
   OldLmag   := DivideSeriesBy(Lmag   ,1);

   MaxAmpl := Ampl[10];
   For n:=8 to 50 Do
     Begin
       If (Ampl[n] > MaxAmpl) Then  MaxAmpl := Ampl[n];
      End;
     
   For n:= 8 to 50 Do
    Begin
      If (MaxAmpl<>0) Then  DB[n] := -10*Ln(0.01/(1- 0.99*Ampl[n]/MaxAmpl))/Ln10;
      If (DB[n] > 20 ) Then DB[n] :=20;
    End;

  Num   := 0;
  Denom := 0;
    If (i>(Brs+65))Then
      Begin
        For n:=8 to 50 Do
          Begin
            If (DB[n] <=3) Then
              Begin
                Num :=Num+n*(20-DB[n]);
                Denom :=Denom+(20-DB[n]);
              End;
            If (Denom <>0) Then DC[i] := Num/Denom;
          End;
      End;
End;

  DomCyc := Median(DC,10);
  CreateLine(DomCyc).Color :=ClAqua;

End.
Gr Paulkr

Janus
Berichten: 1284
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Bericht door Janus » za jan 15, 2011 9:49 pm

Dat moet kunnen PaulKr, ik zal er morgen even mijn best voor doen, ik zal tevens de andere methode voor dominante cyclus meting indoen, dan heb je een keuze mogelijkheid.
.
Vriendelijke groet,
JanS ;)

Janus
Berichten: 1284
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Bericht door Janus » zo jan 16, 2011 6:18 pm

Hallo PaulKr,
Ik heb even de dominante cyclus meetmethode van Dhr. Ehlers ingevoegd in het COG script om daarmee de venster waarde te laten bepalen door de helft van de gemeten cyclus.
Ik heb de filterbank methode even vervangen door de Homodyne discriminator methode, de filterbankmethode uitkomst moet eerst nog even worden omgezet, de COG kan met de uitkomst daarvan niet overweg.
De uitkomst verbaast me, en stelt me ergens teleur.
We moeten ons dan natuurlijk ook realiseren wat we nu eigenlijk aan 'het meten zijn'.
De 'center of gravity indicator' meet waar het zwaartepunt ligt in koerstijgingen of dalingen in de te meten periode, de vensterwaarde.
Door het constant wisselen van de vensterwaarde ( hetgeen ontstaat bij wisselende ingave van de vensterwaarde door die te laten afhangen van de gemeten dominante cyclus op dat moment) ontstaat een onrustig beeld.
Kijk even of je er wat meekan, en zo ja dan heeft het zin de output van de Filterbank methode zodanig te wijzigen dat de COG er wat mee kan.
Tot die tijd laat ik dat even liggen.
Hieronder even de code van de samengebreide constructie, wanneer ik een steekje heb laten vallen hoor ik dat graag, mijn breiwerk is nu eenmaal niet zo sterk ;)

De te sterk wisselende weergave werd veroorzaakt door een 'programmeer foutje', dit is in onderstaande versie aangepast.

code gewijzigd, check versienummer.

Code: Selecteer alles


{- Filename: COG ema Auto -}
{ "Center of Gravity" van J.F. Ehlers }
{ met keuze mogelijkheid: 'Automatische venster waarde'
  aan de hand van de gemeten dominante cyclus}
{ Vertaling: www.JSTAS.com }
{ Versie 1.01  16-01-2011 }
//
Type
 COG = Record
   Ln, Metho,DlFct,ClCOG,ClTrig,TXTGrt,
   LnType,ClMid,VPos,HPos,ClNV        : Integer;
   sLN       : TSeries;
   iLevel    : Real;
   NV        : Boolean;
 End;
 
Var
CG :COG;
{*----------------------------------------------------------------------------*}
{* ---Functie om een TColor te selecteren doormiddel van een Integer getal----*}
Function KleurSelec(Selec:Integer): TColor;
 Begin
   case Selec of
     0:  Result := clAqua;            1: Result := clBlack;
     2:  Result := clBlue;            3: Result := clDkGray;
     4:  Result := clFuchsia;         5: Result := clGray;
     6:  Result := clGreen;           7: Result := clLime;
     8:  Result := clltGray;          9: Result := clMaroon;
     10: Result := clNavy;           11: Result := clOlive;
     12: Result := clPurple;         13: Result := clRed;
     14: Result := clSilver;         15: Result := clTeal;
     16: Result := clWhite;          17: Result := clYellow;
     18: Result := RGB(196,196,0);
     else
       Result := clGray;
   end;
 End;
//
{******************************************************************************}
{************************** Keuze lijn-type ***********************************}
Function Lijnsoort(Lijntype:Integer):TTrendLineStyle;
 Begin
  Case Lijntype of
    1: Result:=LsSolid   ;
    2: Result:=LsDash    ;
    3: Result:=LsDot     ;
    4: Result:=LsDashDot ;
    5: Result:=LsDashDotDot;
  End;
 End;
//
{******************************************************************************}
{********************** Naam en Indicator-naam vermelding *********************}
Procedure NaamVermeld();
Var
str : String;

Begin
  Case CG.Metho of
    0 : Str:= ' COG Handmatig www.JSTAS.com';
    1 : Begin
          If Cg.DlFct=1 Then Str:= ' COG Automatisch-1 www.JSTAS.com';
          If Cg.DlFct=2 Then Str:= ' COG Automatisch-2 www.JSTAS.com';
        End;
  End;
  { $IFDEF SCRIPTVERSION-4}
    With CreateText(0,0,Str) Do
      Begin
        Y1PCT := CG.Vpos;
        X1Pct := CG.Hpos;
        Color := KleurSelec(CG.ClNV);
        Font.Size := CG.TXTGrt;
      End;
  {ENDIF}
End;
//
{**************************** Homodyne discriminator **************************}
{********************** Berekening dominante cyclus lengte ********************}
Function DomCycle():TSeries;
Var
 Calc3,Calc5,Calc6,Calc12,C1,C2,C3,a       :Real   ;
 i                                         :Integer;
 SCalc1,SCalc2,SCalc3,SCalc7,SCalc8,SCalc9 :Tseries;
 SCalc10,SCalc11,SCalc12,SCalc13,SCalc15   :TSeries;
begin
 Scalc1 := Fillseries(CreateSeries(Barcount),1);
 Scalc2 := FillSeries(CreateSeries(Barcount),1);
 Scalc3 := FillSeries(CreateSeries(Barcount),6);
 Scalc7 := FillSeries(CreateSeries(Barcount),1);
 Scalc8 := FillSeries(CreateSeries(Barcount),1);
 Scalc9 := FillSeries(CreateSeries(Barcount),1);
 Scalc10:= FillSeries(CreateSeries(Barcount),1);
 Scalc11:= FillSeries(CreateSeries(Barcount),1);
 Scalc12:= FillSeries(CreateSeries(Barcount),10);
 Scalc13:= CreateSeries(Barcount);
 SCalc15:= CreateSeries(Barcount);
 C1 := 0.0962;  C2 := 0.5769;
For i:= 30 To Barcount-1 Do
Begin
 C3 :=(Scalc3[i-1]*0.075+0.54);
 SCalc1[i] :=((H[i]+L[i])*2+(H[i-1]+L[i-1])*1.5+(H[i-2]+L[i-2])+
                                                        ((H[i-3]+L[i-3])/2))/10;
 SCalc2[i] :=(SCalc1[i]*C1+SCalc1[i-2]*C2-SCalc1[i-4]*C2-SCalc1[i-6]*C1)*C3;
 SCalc7[i] :=(SCalc2[i]*C1+SCalc2[i-2]*C2-SCalc2[i-4]*C2-SCalc2[i-6]*C1)*C3;
 Calc5 :=(Scalc2[i-3]*C1+SCalc2[i-5]*C2-SCalc2[i-7]*C2-SCalc2[i-9]*C1)*C3;
 Calc6 :=(SCalc7[i]*C1+SCalc7[i-2]*C2-SCalc7[i-4]*C2-SCalc7[i-6]*C1)*C3;
 SCalc8[i] :=(SCalc2[i-3]-Calc6)*0.2+SCalc8[i-1]*0.8;
 SCalc9[i] :=(SCalc7[i]+Calc5)*0.2+SCalc9[i-1]*0.8;
 SCalc10[i]:=(SCalc8[i]*SCalc8[i-1]+SCalc9[i]*SCalc9[i-1])*0.2+SCalc10[i-1]*0.8;
 SCalc11[i]:=(SCalc8[i]*SCalc9[i-1]-SCalc9[i]*SCalc8[i-1])*0.2+SCalc11[i-1]*0.8;
  If SCalc10[i] = 0 Then SCalc10[i] := 0.0001;
  If SCalc11[i] = 0 Then SCalc11[i] := 0.0001;
 SCalc3[i] :=(360/((arctan(SCalc11[i]/SCalc10[i]))*180/Pi));
  If SCalc3[i] > (SCalc3[i-1]*1.5)  Then SCalc3[i] := SCalc3[i-1]*1.5;
  If SCalc3[i] < (SCalc3[i-1]*0.67) Then SCalc3[i] := SCalc3[i-1]*0.67;
  If SCalc3[i] < 6  Then SCalc3[i]:=6;
  If SCalc3[i] > 50 Then SCalc3[i]:=50;
 Calc3:= 0.2*SCalc3[i]+ 0.8*SCalc3[i-1];
 SCalc3[i]:= Calc3;
 SCalc12[i] := 0.33*SCalc3[i]+(SCalc12[i-1]*0.67);
 Calc12 :=SCalc12[i];
End;
a:=1.0;
If CG.DlFct=1 Then a:=0.0;
Result := SubtractSeries((DivideSeriesBy(sCalc12,CG.DlFct)),
                                  (FillSeries((CreateSeries(BarCount)),a)));

End;
//
{******************************************************************************}
{****************************** Gebruiker keuzes ******************************}
Procedure UserChoices();
Var
KzeKL,Meth,LijnTypes : String;
Begin
Meth := 'Handmatig '#9
        'Homodyne discr.';
        
LijnTypes := 'Doorgetrokkenlijn  '#9
             'Gestreepte lijn    '#9
             'Gestippelde lijn   '#9
             'Streep-Stippel lijn'#9
             'Streep-Stip-Stip-lijn';
             
KzeKL := 'Aqua'   #9
         'Black'  #9
         'Blue'   #9
         'DkGray' #9
         'Fuchsia'#9
         'Gray'   #9
         'Green'  #9
         'Lime'   #9
         'LtGray' #9
         'Maroon' #9
         'Navy'   #9
         'Olive'  #9
         'Purple' #9
         'Red'    #9
         'Silver' #9
         'Teal'   #9
         'White'  #9
         'Yellow' ;
        
CG.Metho := CreateParameterSelect('Kies Methode vensterwaarde: ',Meth,0,False);
CG.Ln    := CreateParameterInteger('Geef Handm. vensterwaarde: ',2,25,8,False);
Cg.DlFct := CreateParameterInteger('Cyclus deelfactor: ',1,2,1,False);
CG.ClCOG := CreateParameterSelect('Kleur COG lijn :',KzeKL,2,False);
CG.ClTrig:= CreateParameterSelect('Kleur Triggerlijn: ',KzeKL,13,False);
CG.iLevel:= CreateParameterReal('mid-line',-10,10,-0.0,True);
CG.LnType:= CreateParameterSelect('Lijn type Midline :',LijnTypes,1,False)+1;
CG.ClMid := CreateparameterSelect('Kleur van de Midline:',KzeKl,1,False);
CG.NV    := CreateParameterBoolean('Indicator naam weergeven?' ,True,False);
CG.VPos  := CreateParameterInteger('Horizontale pos.vermelding:',1,99,98,False);
CG.HPos  := CreateParameterInteger('Verticale pos. vermelding' ,1,99,2,False);
CG.ClNV  := CreateParameterSelect('Kleur naamvermelding:',KzeKl,6,False);
CG.TXTGrt:= CreateParameterInteger('Letter formaat:',8,15,8,False);
End;
//
{******************************************************************************}
{***************************** Venster series) ********************************}
Procedure VensterSerie();
Begin
 Case CG.Metho Of
  0: CG.sLN := FillSeries(CreateSeries(BarCount),CG.Ln);
  1: CG.sLN := DomCycle();
 End;
End;
//
{******************************************************************************}
{*************************** Tekenen indicatorlijn ****************************}
Procedure Indicatorlijn(sCG:Tseries);
Var
Dtm1,Dtm2 : TDateTime;
i         : Integer;
Begin

For i:= 1 to BarCount-1 Do
 Begin
  if i=1            Then Dtm1:= DateTime[i];
  if i=(BarCount-1) Then Dtm2:= DateTime[i];
 End;

 With CreateLine(sCG) Do
  Begin
    Name  := 'COG'         ;
    Color := ClGray;
  End;

With CreateLine(ShiftSeries(sCG,-1)) Do
  Begin
    Name := 'Trigger';
    Color := ClGray;
  End;

With CreateTrendLine(Dtm1,CG.iLevel,Dtm2,CG.iLevel) Do
  Begin
    Style := Lijnsoort(CG.LnType);
    Color := KleurSelec(CG.ClMid);
  End;

End;
//
{******************************************************************************}
{**************************** Berekening CG lijn ******************************}
Function COGserie():Tseries;
Var
i,j : integer;
Num, Denom, sCG, Price : TSeries;

Begin
sCG   := CreateSeries(Barcount)               ;
Num   := FillSeries(CreateSeries(BarCount),0) ;
Denom := FillSeries(CreateSeries(Barcount),0) ;
Price := DivideSeriesBy(AddSeries(High,Low),2);

For i := 50 to BarCount-1 Do
 Begin
  If IsValid(CG.sLN[i])Then
   Begin
    For j := 0 To ((Round(CG.slN[i]))-1) Do
     Begin
      Num[i]   := Num[i] + (1+j)*Price[i-j];
      Denom[i] := Denom[i] + Price[i-j]    ;
     End;
    sCG[i] := -Num[i]/Denom[i] + (Round(CG.sLN[i])  + 1)/2;
   End;
 End;
Result :=sCG;
End;
{******************************************************************************}
{********************* geef de lijnen een kleur *******************************}
Procedure Inkleurlijnen();
Var
i:Integer;
Begin
 For i := 1 to BarCount-1 do
  Begin
   SetBarColor(0,i,KleurSelec(CG.ClCOG ));
   SetBarColor(1,i,KleurSelec(CG.CLTrig));
  End;
End;
//
{*****************************************************************************}
{******************************* Hoofdprogramma ******************************}
Begin
UserChoices();
VensterSerie();
Indicatorlijn(COGSerie());
Inkleurlijnen();
If CG.NV Then Naamvermeld();
End.
//

Succes !.
.
Laatst gewijzigd door Janus op ma jan 17, 2011 2:05 am, 4 keer totaal gewijzigd.
Vriendelijke groet,
JanS ;)

paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » zo jan 16, 2011 8:29 pm

JanS,

Het resultaat valt inderdaad anders uit dan verwacht, echter dat is altijd (helaas) pas achteraf te ondervinden.
Zou je toch nog aub de koop / verkoop signalen kunnen opnemen in het script? In de eerdere COG versie met de signalen, worden deze echter een of twee bars later gegeven, dan kan ik jouw versie gebruiken voor de tar filter. Alvast hartelijk dank Janus.

Gr Paulkr

Janus
Berichten: 1284
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Bericht door Janus » zo jan 16, 2011 11:08 pm

Ik zal dat deze week even doen PaulKr.
Intussen zat me de afwijkende werking dan dat wat we verwacht hadden niet lekker, en onder de koffie schoot me iets te binnen, ik heb dat even aangepast, ik heb de code hierboven vervangen.
De laatste versie is nu 1.01.

Plaatje d'rbij ;)

Afbeelding
.
Vriendelijke groet,
JanS ;)

paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » ma jan 17, 2011 2:09 pm

Janus, die ingeving heeft een verhelderende weergave van de indicator tot gevol :lol: g. Ga vanavond na het werk en de kleine op een oor ligt eens stoeien. Bedankt voor alle moeite.

Janus
Berichten: 1284
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Bericht door Janus » ma jan 17, 2011 3:39 pm

tja, die ingeving .... koffie van DE, dan weet je 't wel ;-)
.
Vriendelijke groet,
JanS ;)

paulkr
Berichten: 379
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Bericht door paulkr » vr jan 21, 2011 9:30 pm

Janus,

Mocht je nog ‘n vrij momentje hebben .... :roll: en beide honden hebben uitgelaten , dan zou ondergetekende het waarderen indien in bovenstaande script nog even de koop/verkoop signalen bij het kruisen van de cog lijn worden opgenomen. Ik geloof dat ik deze indicator in het verleden nooit goed op waarde heb weten te schatten. :wink:

GrPaulkr

Janus
Berichten: 1284
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Bericht door Janus » za jan 22, 2011 6:58 pm

Ik zal dat morgen even voor elkaar maken PaulKr.
.
Vriendelijke groet,
JanS ;)

Janus
Berichten: 1284
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Bericht door Janus » zo jan 23, 2011 5:54 pm

Is dit wat je bedoelt PaulKr ?

Code: Selecteer alles


{- Filename: COG ema Auto -}
{ "Center of Gravity" van J.F. Ehlers }
{ met keuze mogelijkheid: 'Automatische venster waarde'
  aan de hand van de gemeten dominante cyclus}
{ Vertaling: www.JSTAS.com }
{ Versie 1.02  23-01-2011 }
//
Type
 COG = Record
   Ln, Metho,DlFct,ClCOG,ClTrig,TXTGrt,
   LnType,ClMid,VPos,HPos,ClNV        : Integer;
   sLN,sInd  : TSeries;
   iLevel    : Real;
   NV,Signal : Boolean;
 End;
 
Var
CG :COG;
{*----------------------------------------------------------------------------*}
{* ---Functie om een TColor te selecteren doormiddel van een Integer getal----*}
Function KleurSelec(Selec:Integer): TColor;
 Begin
   case Selec of
     0:  Result := clAqua;            1: Result := clBlack;
     2:  Result := clBlue;            3: Result := clDkGray;
     4:  Result := clFuchsia;         5: Result := clGray;
     6:  Result := clGreen;           7: Result := clLime;
     8:  Result := clltGray;          9: Result := clMaroon;
     10: Result := clNavy;           11: Result := clOlive;
     12: Result := clPurple;         13: Result := clRed;
     14: Result := clSilver;         15: Result := clTeal;
     16: Result := clWhite;          17: Result := clYellow;
     18: Result := RGB(196,196,0);
     else
       Result := clGray;
   end;
 End;
//
{******************************************************************************}
{************************** Keuze lijn-type ***********************************}
Function Lijnsoort(Lijntype:Integer):TTrendLineStyle;
 Begin
  Case Lijntype of
    1: Result:=LsSolid   ;
    2: Result:=LsDash    ;
    3: Result:=LsDot     ;
    4: Result:=LsDashDot ;
    5: Result:=LsDashDotDot;
  End;
 End;
//
{******************************************************************************}
{********************** Naam en Indicator-naam vermelding *********************}
Procedure NaamVermeld();
Var
str : String;

Begin
  Case CG.Metho of
    0 : Str:= ' COG Handmatig www.JSTAS.com';
    1 : Begin
          If Cg.DlFct=1 Then Str:= ' COG Automatisch-1 www.JSTAS.com';
          If Cg.DlFct=2 Then Str:= ' COG Automatisch-2 www.JSTAS.com';
        End;
  End;
  { $IFDEF SCRIPTVERSION-4}
    With CreateText(0,0,Str) Do
      Begin
        Y1PCT := CG.Vpos;
        X1Pct := CG.Hpos;
        Color := KleurSelec(CG.ClNV);
        Font.Size := CG.TXTGrt;
      End;
  {ENDIF}
End;
//
{**************************** Homodyne discriminator **************************}
{********************** Berekening dominante cyclus lengte ********************}
Function DomCycle():TSeries;
Var
 Calc3,Calc5,Calc6,Calc12,C1,C2,C3,a       :Real   ;
 i                                         :Integer;
 SCalc1,SCalc2,SCalc3,SCalc7,SCalc8,SCalc9 :Tseries;
 SCalc10,SCalc11,SCalc12,SCalc13,SCalc15   :TSeries;
begin
 Scalc1 := Fillseries(CreateSeries(Barcount),1);
 Scalc2 := FillSeries(CreateSeries(Barcount),1);
 Scalc3 := FillSeries(CreateSeries(Barcount),6);
 Scalc7 := FillSeries(CreateSeries(Barcount),1);
 Scalc8 := FillSeries(CreateSeries(Barcount),1);
 Scalc9 := FillSeries(CreateSeries(Barcount),1);
 Scalc10:= FillSeries(CreateSeries(Barcount),1);
 Scalc11:= FillSeries(CreateSeries(Barcount),1);
 Scalc12:= FillSeries(CreateSeries(Barcount),10);
 Scalc13:= CreateSeries(Barcount);
 SCalc15:= CreateSeries(Barcount);
 C1 := 0.0962;  C2 := 0.5769;
For i:= 30 To Barcount-1 Do
Begin
 C3 :=(Scalc3[i-1]*0.075+0.54);
 SCalc1[i] :=((H[i]+L[i])*2+(H[i-1]+L[i-1])*1.5+(H[i-2]+L[i-2])+
                                                        ((H[i-3]+L[i-3])/2))/10;
 SCalc2[i] :=(SCalc1[i]*C1+SCalc1[i-2]*C2-SCalc1[i-4]*C2-SCalc1[i-6]*C1)*C3;
 SCalc7[i] :=(SCalc2[i]*C1+SCalc2[i-2]*C2-SCalc2[i-4]*C2-SCalc2[i-6]*C1)*C3;
 Calc5 :=(Scalc2[i-3]*C1+SCalc2[i-5]*C2-SCalc2[i-7]*C2-SCalc2[i-9]*C1)*C3;
 Calc6 :=(SCalc7[i]*C1+SCalc7[i-2]*C2-SCalc7[i-4]*C2-SCalc7[i-6]*C1)*C3;
 SCalc8[i] :=(SCalc2[i-3]-Calc6)*0.2+SCalc8[i-1]*0.8;
 SCalc9[i] :=(SCalc7[i]+Calc5)*0.2+SCalc9[i-1]*0.8;
 SCalc10[i]:=(SCalc8[i]*SCalc8[i-1]+SCalc9[i]*SCalc9[i-1])*0.2+SCalc10[i-1]*0.8;
 SCalc11[i]:=(SCalc8[i]*SCalc9[i-1]-SCalc9[i]*SCalc8[i-1])*0.2+SCalc11[i-1]*0.8;
  If SCalc10[i] = 0 Then SCalc10[i] := 0.0001;
  If SCalc11[i] = 0 Then SCalc11[i] := 0.0001;
 SCalc3[i] :=(360/((arctan(SCalc11[i]/SCalc10[i]))*180/Pi));
  If SCalc3[i] > (SCalc3[i-1]*1.5)  Then SCalc3[i] := SCalc3[i-1]*1.5;
  If SCalc3[i] < (SCalc3[i-1]*0.67) Then SCalc3[i] := SCalc3[i-1]*0.67;
  If SCalc3[i] < 6  Then SCalc3[i]:=6;
  If SCalc3[i] > 50 Then SCalc3[i]:=50;
 Calc3:= 0.2*SCalc3[i]+ 0.8*SCalc3[i-1];
 SCalc3[i]:= Calc3;
 SCalc12[i] := 0.33*SCalc3[i]+(SCalc12[i-1]*0.67);
 Calc12 :=SCalc12[i];
End;
a:=1.0;
If CG.DlFct=1 Then a:=0.0;
Result := SubtractSeries((DivideSeriesBy(sCalc12,CG.DlFct)),
                                  (FillSeries((CreateSeries(BarCount)),a)));

End;
//
{******************************************************************************}
{****************************** Gebruiker keuzes ******************************}
Procedure UserChoices();
Var
KzeKL,Meth,LijnTypes : String;
Begin
Meth := 'Handmatig '#9
        'Homodyne discr.';
        
LijnTypes := 'Doorgetrokkenlijn  '#9
             'Gestreepte lijn    '#9
             'Gestippelde lijn   '#9
             'Streep-Stippel lijn'#9
             'Streep-Stip-Stip-lijn';
             
KzeKL := 'Aqua'   #9
         'Black'  #9
         'Blue'   #9
         'DkGray' #9
         'Fuchsia'#9
         'Gray'   #9
         'Green'  #9
         'Lime'   #9
         'LtGray' #9
         'Maroon' #9
         'Navy'   #9
         'Olive'  #9
         'Purple' #9
         'Red'    #9
         'Silver' #9
         'Teal'   #9
         'White'  #9
         'Yellow' ;
With Indicator DO
Begin
RequiredBars := 100;
End;
CG.Metho := CreateParameterSelect('Kies Methode vensterwaarde: ',Meth,0,False);
CG.Ln    := CreateParameterInteger('Geef Handm. vensterwaarde: ',2,25,8,True);
CG.DlFct := CreateParameterInteger('Cyclus deelfactor: ',1,2,1,False);
CG.ClCOG := CreateParameterSelect('Kleur COG lijn :',KzeKL,2,False);
CG.ClTrig:= CreateParameterSelect('Kleur Triggerlijn: ',KzeKL,13,False);
CG.iLevel:= CreateParameterReal('mid-line',-10,10,-0.0,True);
CG.LnType:= CreateParameterSelect('Lijn type Midline :',LijnTypes,1,False)+1;
CG.ClMid := CreateParameterSelect('Kleur van de Midline:',KzeKl,1,False);
Cg.signal:= CreateParameterBoolean('Buy-Sell-signals weergave?',True,False);
CG.NV    := CreateParameterBoolean('Indicator naam weergeven?' ,True,False);
CG.VPos  := CreateParameterInteger('Horizontale pos.vermelding:',1,99,98,False);
CG.HPos  := CreateParameterInteger('Verticale pos. vermelding' ,1,99,2,False);
CG.ClNV  := CreateParameterSelect('Kleur naamvermelding:',KzeKl,6,False);
CG.TXTGrt:= CreateParameterInteger('Letter formaat:',8,15,8,False);
End;
//
{******************************************************************************}
{***************************** Venster series) ********************************}
Procedure VensterSerie();
Begin
 Case CG.Metho Of
  0: CG.sLN := FillSeries(CreateSeries(BarCount),CG.Ln);
  1: CG.sLN := DomCycle();
 End;
End;
//
{******************************************************************************}
{*************************** Tekenen indicatorlijn ****************************}
Procedure Indicatorlijn(sCG:Tseries);
Var
Dtm1,Dtm2 : TDateTime;
i         : Integer;
Begin

For i:= 1 to BarCount-1 Do
 Begin
  if i=1            Then Dtm1:= DateTime[i];
  if i=(BarCount-1) Then Dtm2:= DateTime[i];
 End;

 With CreateLine(sCG) Do
  Begin
    Name  := 'COG'         ;
    Color := ClGray;
  End;

With CreateLine(ShiftSeries(sCG,-1)) Do
  Begin
    Name := 'Trigger';
    Color := ClGray;
  End;

With CreateTrendLine(Dtm1,CG.iLevel,Dtm2,CG.iLevel) Do
  Begin
    Style := Lijnsoort(CG.LnType);
    Color := KleurSelec(CG.ClMid);
  End;

End;
//
{******************************************************************************}
{**************************** Berekening CG lijn ******************************}
Function COGserie():Tseries;
Var
i,j : integer;
Num, Denom, sCG, Price : TSeries;

Begin
sCG   := CreateSeries(Barcount)               ;
Num   := FillSeries(CreateSeries(BarCount),0) ;
Denom := FillSeries(CreateSeries(Barcount),0) ;
Price := DivideSeriesBy(AddSeries(High,Low),2);

For i := 50 to BarCount-1 Do
 Begin
  If IsValid(CG.sLN[i])Then
   Begin
    For j := 0 To ((Round(CG.slN[i]))-1) Do
     Begin
      Num[i]   := Num[i] + (1+j)*Price[i-j];
      Denom[i] := Denom[i] + Price[i-j]    ;
     End;
    sCG[i] := -Num[i]/Denom[i] + (Round(CG.sLN[i])  + 1)/2;
   End;
 End;
Result :=sCG;
End;
{******************************************************************************}
{********************* geef de lijnen een kleur *******************************}
Procedure Inkleurlijnen();
Var
i:Integer;
Begin
 For i := 1 to BarCount-1 do
  Begin
   SetBarColor(0,i,KleurSelec(CG.ClCOG ));
   SetBarColor(1,i,KleurSelec(CG.CLTrig));
  End;
End;
//
{******************************************************************************}
{**************************** aan-verkoop-signalen ****************************}
Procedure Koopsignaal();
Var
i       : Integer;
xCross  : TLineCrossings;
Begin
 xCross := Crossings(CG.sInd, ShiftSeries(CG.sInd,1));
    For i:=0 To BarCount-1 Do
     Begin
      If (xCross[i] = lc2Over1) Then Signals[i] := sgEnterShort;
      If (xCross[i] = lc1Over2) Then Signals[i] := sgEnterLong;
     End;
End;
//
{******************************************************************************}
{******************************* Hoofdprogramma *******************************}
Var
i       : Integer;
xCross  : TLineCrossings;
Begin
UserChoices();
VensterSerie();
CG.sInd := COGSerie();
Indicatorlijn(CG.sInd);
If CG.Signal Then Koopsignaal();
Inkleurlijnen();
If CG.NV Then Naamvermeld();
End.
//

Afbeelding
.
Laatst gewijzigd door Janus op zo jan 23, 2011 11:17 pm, 1 keer totaal gewijzigd.
Vriendelijke groet,
JanS ;)

Plaats reactie