Mittwoch, 6. Juli 2011

NinjaTrader Insides - Holidays

Da mein Account-Statement für Juni noch auf sich warten lässt und auch NinjaTrader etwas rumzickt und mir nur Trades seit dem 16.06.2011 auswirft, schiebe ich hier noch schnell ein Posting zwischen. 

Dies ist zwar kein gänzlich neues Thema, aber ich habe mich nun endlich einmal überwinden können dieses anzugehen. Es handelt sich um die allseits bekannte Feiertagsproblematik. Nachdem ich in diversen Backtests immer wieder Ergebnisse aufgrund der kürzeren Öffnungszeiten der amerikanischen oder deutschen Börsen ausklammern musste, bin ich nun dazu übergegangen, die Sache programmatisch zu lösen. Die wenigen feststehenden Feiertage sind hier nicht das Problem, aber die Feiertage die auf den 3. oder 1. Tag im Monat ausgerechnet werden machen schon ein wenig mehr Arbeit. Meiner Meinung nach ist es zu aufwendig und fehleranfällig  die beweglichen Feiertage in den USA und Deutschland dynamisch zu ermitteln.

Ich fasse die Feiertage also statisch im Code zusammen und zwar in meiner zentralen Oberklasse, die für mich wiederverendbare Methoden und Variablen zur Verfügung stellt. Hierfür habe ich ein Enum als Datenstruktur verwendet. Als Beispiel die Feiertage für 2011 in den USA:

public enum DT_HolidaysUSA
{
    FirstDate,
    ....
    // -----
    // Holidays 2011
    // -----
    _20110101,  
    _20110117,   
    _20110221,  
    _20110422,   
    _20110530,   
    _20110704,   
    _20110905,   
    _20111010,   
    _20111124,   
    _20111125,
    _20112412,

    LastDate,
}


Ob und welche Börsen an den jeweiligen Tagen geschlossen oder nur halbtags geöffnet haben, lässt sich zudem auf den Homepages des CME-Group oder auf den Seiten der Eurex herausfinden. Die Liste muss sicherlich noch wachsen und es sollten ebenso Tage mit niedrigen Volumen oder Volatilität ausgeklammert werden (je nach Handelsansatz), aber als Grundlage kann man damit bereits arbeiten.

Zu verwenden ist die Datenstruktur dann relativ einfach über eine Iteration und einen Vergleich mit dem aktuellen Datum. Zur einfacheren Verwendung innerhalb von Strategien wird der Code noch in eine Methode ausgelagert:

protected bool isTradingInDateUSA(DateTime barTime)
{
  for (DT_HolidaysUSA holiday = DT_HolidaysUSA.FirstDate;
       holiday <  DT_HolidaysUSA.LastDate; holiday++)
  {
    int dateValue = (barTime.Year * 10000 + barTime.Month * 100 + barTime.Day);
                   
    if (holiday.ToString() == "_" +dateValue)
    {
      Print ("Kein Handel an Feiertagen in den USA.");
      return false;
    }
  }
               
  // Default-Rückgabe
  return true;                   
}


Für den vollständigen Code und die Verwendung innerhalb von Strategien schreibt mir einfach kurz eine Email.

Beste Grüße
DarthTrader

Keine Kommentare:

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.