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.
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;