Ereignisse
AgenaTrader ist nach der Definition der Softwaretechnik eine ereignisorientierte Applikation.
Die Programmierung in AgenaTrader mit Methoden des Application Programming Interface (API) beruht initial auf dem Überschreiben von vordefinierten Routinen zur Ereignisbehandlung.
Folgende Methoden können verwendet, d.h. überschrieben werden:
- OnBrokerConnect()
- OnBrokerDisconnect()
- OnCalculate()
- OnChartPanelMouseDown()
- OnChartPanelMouseMove()
- OnDispose()
- OnLevel1()
- OnLevel2()
- OnOrderChanged()
- OnOrderExecution()
- OnStart()
- OnStop()
OnBrokerConnect()
Beschreibung
Die Methode OnBrokerConnect() wird jedesmal dann aufgerufen, wenn die Verbindung zum Broker hergestellt wurde.
Mit Hilfe von OnBrokerConnect() besteht die Möglichkeit, bei einem Verbindungsabbruch mit dem Broker, die bestehenden bzw. noch offenen Orders wieder der Strategie zuzuordnen und somit von dieser wieder verwalten zu lassen
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
keine
Verwendung
protected override void OnBrokerConnect()
Beispiel
private IOrder _takeProfit = null;
private IOrder _trailingStop = null;
protected override void OnBrokerConnect()
{
if (Trade != null && Trade.PositionType != PositionType.Flat)
{
_takeProfit = Orders.FirstOrDefault(o => o.Name == this.GetType().Name && o.OrderType ==OrderType.Limit);
_trailingStop = Orders.FirstOrDefault(o => o.Name == this.GetType().Name && o.OrderType ==OrderType.Stop);
}
}
OnBrokerDisconnect()
Beschreibung
Die Methode OnBrokerDisconnect() wird jedesmal dann aufgerufen, wenn die Verbindung zum Broker unterbrochen wurde.
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
Ein Objekt vom Typ TradingDatafeedChangedEventArgs
Verwendung
protected override void OnBrokerDisconnect(TradingDatafeedChangedEventArgs e)
Beispiel
protected override void OnBrokerDisconnect(TradingDatafeedChangedEventArgs e)
{
if (e.Connected)
Print("Die Verbindung zum Broker wird getrennt.");
else
Print("Die Verbindung zum Broker wurde getrennt.");
}
OnCalculate()
Beschreibung
Die Methode OnCalculate() wird immer dann aufgerufen, wenn sich ein Bar ändert. Abhängig von der Variablen CalculateOnClosedBar,wird sie entweder bei jedem hereinkommenden Tick oder erst nach Fertigstellung eines Bars aufgerufen. OnCalculate ist die wichtigste Methode, die im Normalfall auch den größten Teil des Codes selbsterstellter Indikatoren bzw. Strategien enthält. Die Bearbeitung beginnt mit dem ältesten Bar und läuft bis zum jüngsten Bar im Chart. Der älteste Bar erhält dabei die Nummer 0. Es wird fortlaufend weiter nummeriert. Auf diese Nummerierung kann über die Variable ProcessingBarIndex zugegriffen werden, siehe Beispiel unten.
Achtung: Diese Nummerierung unterscheidet sich vom BarIndex, siehe Bars.
More information can be found here: Ereignisse.
Parameter
keiner
Verwendung
protected override void OnCalculate()
Beispiel
protected override void OnCalculate()
{
Print("Aufruf von OnBarUpdate für Bar Nr. " + ProcessingBarIndex + " von " +Time[0]);
}
OnChartPanelMouseDown()
Beschreibung
In einem Indikator, oder einer Strategie, kann die aktuelle Position der Maus ausgewertet und verarbeitet werden. Dafür ist es notwendig, dass man einen EventHandler als Methode programmiert und diese Methode anschließend dem Event ChartControl.ChartPanelMouseDown hinzufügt.
Achtung!
Es ist wichtig, den EventHandler innerhalb der OnDispose() Methode wieder aus dem Event zu entfernen, da sonst der EventHandler selbst dann noch ausgeführt wird, wenn der Indikator aus dem Chart entfernt wurde!
Beispiel
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
using AgenaTrader.API;
using AgenaTrader.Custom;
using AgenaTrader.Plugins;
using AgenaTrader.Helper;
namespace AgenaTrader.UserCode
{
public class ChartPanelMouseDown : UserIndicator
{
protected override void OnInit()
{
IsOverlay = true;
}
protected override void OnStart()
{
// Add event listener
if (Chart != null)
Chart.ChartPanelMouseDown += OnChartPanelMouseDown;
}
protected override void OnDispose()
{
// Remove event listener
if (Chart != null)
Chart.ChartPanelMouseDown -= OnChartPanelMouseDown;
}
private void OnChartPanelMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
Print("X = {0}, Y = {1}", Chart.GetDateTimeByX(e.X),Chart.GetPriceByY(e.Y));
}
}
}
OnChartPanelMouseMove()
Beschreibung
In einem Indikator, oder einer Strategie, kann die aktuelle Position der Maus ausgewertet und verarbeitet werden. Dafür ist es notwendig, dass man einen EventHandler als Methode programmiert und diese Methode anschließend dem Event Chart.ChartPanelMouseMove hinzufügt.
Achtung!
Es ist wichtig, den EventHandler innerhalb der OnDispose() Methode wieder aus dem Event zu entfernen, da sonst der EventHandler selbst dann noch ausgeführt wird, wenn der Indikator aus dem Chart entfernt wurde!
Beispiel
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
using AgenaTrader.API;
using AgenaTrader.Custom;
using AgenaTrader.Plugins;
using AgenaTrader.Helper;
namespace AgenaTrader.UserCode
{
public class ChartPanelMouseMove : UserIndicator
{
protected override void OnInit()
{
IsOverlay = true;
}
protected override void OnStart()
{
// Add event listener
if (Chart != null)
Chart.ChartPanelMouseMove += OnChartPanelMouseMove;
}
protected override void OnDispose()
{
// Remove event listener
if (Chart != null)
Chart.ChartPanelMouseMove -= OnChartPanelMouseMove;
}
private void OnChartPanelMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
Print("X = {0}, Y = {1}", Chart.GetDateTimeByX(e.X), Chart.GetPriceByY(e.Y));
}
}
}
OnDispose()
Beschreibung
Die Methode OnDispose() kann überschrieben werden, um alle im Script verwendeten Ressourcen wieder freizugeben.
Siehe auch OnInit() und OnStart().
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
keiner
Verwendung
protected override void OnDispose()
Weitere Informationen
Achtung: Bitte überschreiben Sie nicht die Dispose() Methode, da diese erst sehr viel später aufgerufen werden kann. Ressourcen bleiben zu lange erhalten und können zu unerwartetem und unvorhersehbarem Verhalten der gesamten Anwendung führen.
Beispiel
protected override void OnDispose()
{
if (Window != null)
{
Window.Dispose();
Window = null;
}
}
OnLevel1()
Beschreibung
Die Methode OnLevel1() wird bei jeder Änderung in den Level-I-Daten aufgerufen, d.h. bei einer Änderung des Bid-Preises, Ask-Preises, des Bid-Volumens, des Ask-Volumens und natürlich des Last-Preises nachdem ein realer Umsatz stattfand. In a multibar indicator, the ProcessingBarSeriesIndex die jeweilige Datenreihe ermittelt werden, für die OnLevel1() aufgerufen wurde.
OnLevel1() wird nicht für historische Daten aufgerufen Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Hinweis zu Daten von Yahoo (YFeed)
Das Feld "LastPrice" entspricht - wie gewohnt - je nach letztem Handelsumsatz entweder dem "BidPrice" oder dem "AskPrice".
Das Feld "MarketDataType" ist immer "Last".
Die Felder "Volumen", "BidSize" und "AskSize" sind immer 0.
Verwendung
protected override void OnLevel1(Level1Args e)
Parameter
[*Level1Args*] e
Beispiel
protected override void OnLevel1(Level1Args e)
{
Print("AskPrice "+e.AskPrice);
Print("AskSize "+e.AskSize);
Print("BidPrice "+e.BidPrice);
Print("BidSize "+e.BidSize);
Print("Instrument "+e.Instrument);
Print("LastPrice "+e.LastPrice);
Print("MarketDataType "+e.MarketDataType);
Print("Price "+e.Price);
Print("Time "+e.Time);
Print("Volume "+e.Volume);
}
OnLevel2()
Beschreibung
Die Methode OnLevel2() wird bei jeder Änderung in den Level-II-Daten (Markttiefe) aufgerufen. In einem Multibar-Indikator kann mit ProcessingBarSeriesIndex die jeweilige Datenreihe ermittelt werden, für die OnMarketDepth() aufgerufen wurde. OnLevel2 wird nicht für historische Daten aufgerufen.
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Verwendung
protected override void OnLevel2(Level2Args e)
Parameter
Ein Objekt von Level2Args
Beispiel
protected override void OnLevel2(Level2Args e)
{
// Ausgabe des jeweils aktuellen Ask-Kurses
if (e.MarketDataType == MarketDataType.Bit)
Print("The current bit is " + e.Price );
}
OnOrderChanged()
Beschreibung
Die Methode OnOrderChanged() wird jedesmal dann aufgerufen, wenn sich der Status einer durch eine Strategie verwaltete Order ändert. Ene Statusänderung kann dabei durch die Änderung des Volumens, des Preises oder des Status an der Börse (von working zu filled) ausgelöst werden. Es ist sichergestellt, dass diese Methode für alle Ereignisse in der korrekten Reihenfolge aufgerufen wird.
Wichtiger Hinweis: Wenn eine Strategie durch Orderausführungen gesteuert werden soll, ist es ratsamer, OnOrderExecution() anstelle von OnOrderChanged() zu verwenden. Es kann sonst zu Problemen bei Teilausführungen kommen..
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
Ein Order-Objekt vom Type IOrder
Verwendung
protected override void OnOrderChanged(IOrder order)
Beispiel
private IOrder entry = null;
protected override void OnCalculate()
{
if (CrossAbove(EMA(14), SMA(50), 1) && IsSerieRising(ADX(20)))
entry = OpenLong("EMACrossesSMA");
if (entry != null && entry == order)
{
if (order.OrderState == OrderState.Filled)
{
PlaySound("OrderFilled.wav");
entryOrder = null;
}
}
}
protected override void OnOrderChanged(IOrder order)
{
}
OnOrderExecution()
Beschreibung
Die Methode OnOrderExecution() wird jedesmal dann aufgerufen, wenn eine Order ausgeführt (filled) wurde oder sich der Status einer durch eine Strategie verwaltete Order ändert. Ene Statusänderung kann dabei durch die Änderung des Volumens, des Preises oder des Status an der Börse (von working zu filled) ausgelöst werden. Es ist sichergestellt, dass diese Methode für alle Ereignisse in der korrekten Reihenfolge aufgerufen wird.
OnOrderExecution() wird immer nach OnOrderChanged() aufgerufen.
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
Ein execution-Objekt vom Type IExecution
Verwendung
protected override void OnOrderExecution(IExecution execution)
Beispiel
private IOrder entry = null;
protected override void OnCalculate()
{
if (CrossAbove(EMA(14), SMA(50), 1) && IsSerieRising(ADX(20)))
entry = OpenLong("EMACrossesSMA");
}
protected override void OnOrderExecution(IExecution execution)
{
// Beispiel
if (entry != null && execution.Order == entry)
{
Print(execution.Price.ToString());
Print(execution.Order.OrderState.ToString());
}
}
OnStart()
Beschreibung
Die Methode OnStart() kann überschrieben werden, um eigene Variablen zu initialisieren, Lizenzchecks auszuführen, UserForms aufzurufen usw. OnStart() wird nur einmal am Beginn des Scrips nach OnInit() und vor OnCalculate() aufgerufen.
Siehe auch OnDispose().
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
keiner
Verwendung
protected override void OnStart()
Beispiel
private myForm Window;
protected override void OnStart()
{
if (Chart != null)
{
Window = new myForm();
Window.Show();
}
}
OnStop()
Beschreibung
Die OnStop()-Methode wird aufgerufen, sobald ein Script beendet wird. Dies kann z.B. vorkommen, wenn ein Indikator vom Chart entfernt wurde oder eine Spalte mit einem Indikator / einer gescripteten Condition vom Scanner entfernt wurde.
Siehe auch OnDispose().
Siehe auch weitere Methoden zur Ereignisbehandlung unter Ereignisse.
Parameter
keiner
Verwendung
protected override void OnStop()
Beispiel
protected override void OnStop()
{
Log("Stop: " + this.ToString() + " | " + Instrument.Symbol, InfoLogLevel.Info);
}