Skip to main content

Scripting für Indikatoren

Die folgenden Beispiele stehen auch im Scripting-Studio in der Profiversion zur Verfügung und ergeben nach Ausführung folgende Ergebnisse d,h. direkte Logausgabe im Scripting-Studio nach eigener Formatierung und im Watchlisten-Fenster die korrekte automatische Zuordnung und Erstellung der Titel.

image-1655631926345.png

 

image-1655631932351.png

 uses Common;
(* CreateDate: 31.07.2014
   Author: Jens Werschmoeller
   Required: 13.4.18
   Ziel ist die Demonstration der Anwendung von Indikatoren. Hier am Beispiel
   am RSI-Indikator, wo eine Signalgenerierung abgefragt wird. Vorhandene
   Einstellungen werden dabei aus den Charteinstellungen übernommen, können
   aber auch per Parameter-Setup überschrieben werden
   Besonderheiten:
   - Der Indikator kann allein über die Konstante beim Aufruf CreateIndicatorWithType gewechselt werden
   - Der Ergebnistyp kann mit CalculateXXXX - Methoden zwischen Ergebniswert, Triggerwert, Aktivierungsgrad etc.
     jederzeit abgerufen werden
   - Es können aktiv Watchlisten manipuliert werden, hierzu wird über doSetup eine passende Watchliste, wenn
     notwendig angelegt und die gefundenen Titel hinzugefügt. Hierbei können dann auch beliebige Kommentare
     gesetzt werden
*)

(* Vorlagerte Variablendefinition ist nur für den Editor notwendig, damit diese erkannt werden und für
   die Autovervollständigung genutzt werden können *)
var
  itIndicator : TISignalindicator;
  itStock: TStock;
  itLogItem: TListItem;
  itWatchlist: TWatchlist;
  itWatchItem: TWatchListItem;
procedure doSetup;
begin
  {* Watchliste anlegen, wenn nicht vorhanden *}
  itWatchlist:=varWatchlists.FindOrCreate('Script-GD-Crossover');
  {* Alle vorhandenen Watchlisten-Einträge entfernen *}
  itWatchlist.List.Clear;
  (* Header für das Logging passend vorbereiten *)
  varLog.Column[1].Caption:='Indicator-Value';
  varLog.Column[1].Width:=200;
  varLog.Column[2].Caption:='Kursanzahl';
  varLog.Column[2].Width:=200;
  varLog.Column[3].Caption:='Signaltyp';
  varLog.Column[3].Width:=200;
end;
procedure doRun( indicatorTypeID: Integer);
var fSegment: TSegment;
begin
    varLog.BeginUpdate;
    varLog.Items.Clear;
    (* Durchlauf alle Titel zur Prüfung *)
    for idxStock:=1 to varStocks.Count     do
    begin
      itStock:=varStocks.Items[idxStock-1];
      (* Verwende nur Titel, die Deutsche Bank im Namen enthalten
         if (Pos('Deutsche Bank',itStock.Name)<>0) then
         if (Pos('DAX',varSegments.GetName( itStock.StockSegments ))<>0) then
         etc.
      *)
      if (itStock.Country='Deutschland') then
      begin
        (* Erzeuge den Indikator hier als den RSI-Indikator *)
        itIndicator:=varIndicators.CreateIndicatorWithTypeID(indicatorTypeID);
        (* Gebe dem Indikator die notwendigen Kursdaten des aktuellen Titels *)
        itIndicator.Kurse:=itStock.Kurs.createCache;
        (* Mittels Indicator.Parameter.Items[1].Wert:=10; könnten die Parameter
           des Indikators verändert werden. Die Bedeutung der Parameter muss pro
           Indikator nachgeschaut werden z.B. über Einstellungen / Indikatorengruppen / Doppelklick auf
           den Indikator *)
        (* Berechne die Ergebniswerte für das heutige Datum
           fValue:=itIndicator.CalculateValue(Trunc(Now()), itIndicator.Kurse);
        *)
        fValue:=itIndicator.CalculateErgActivation(Trunc(Now()), itIndicator.Kurse);
        (* Wenn ein Kauf/Verkaufssignal vorliegt, dann Logeintrag + Watch-Eintrag erzeugen *)
        if (fValue<>0) then
        begin
            (* Logging der Ergebnisse *)
            itLogItem:=doLogAndCheck(itStock.Displayname+' ['+itStock.ISIN+'], '+itStock.Sector);
            itLogItem.SubItems.Add(FloatToStr(fValue));
            if (itIndicator.Kurse<>nil) then
              itLogItem.SubItems.Add(InttoStr(itIndicator.Kurse.Count)) else
              itLogItem.SubItems.Add('-');
            if (fValue<0) then
              itLogItem.SubItems.Add('Verkaufssignal') else
              itLogItem.SubItems.Add('Kaufsignal');
            {* Watchlisteneintrag erzeugen *}
            itWatchItem:=TWatchListItem.Create(itStock);
            itWatchItem.CompareDate:=Now;
            if (fValue<0) then
              itWatchItem.Comment:='IndSignal:Verkaufssignal' else
              itWatchItem.Comment:='IndSignal:Kaufsignal';
            itWatchlist.List.Add(itWatchItem);
         end;
      end;
   end;
   varLog.EndUpdate;
end;
begin
  doSetup();
  doRun(cRSI);
end;