Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Berechnung der aktuellen Trefferquote (http://www.expert-advisor.com/forum/showthread.php?t=2069)

Sandreal 23.03.12 19:46

Berechnung der aktuellen Trefferquote
 
Hallo zusammen,

ich würde gerne in meinem EA die aktuelle Trefferquote, also ob ein Signal erfolgreich war oder nicht, dafür verwenden, ob ein neuer Trade bzgl. des Signals ausgeführt werden soll. Dabei möchte ich ein Array int[10] oder string[10] befüllen lassen, in dem dann jeweils steht, welche der letzten zehn Trades mit dem Signal erfolgreich waren bzw. erfolgreich gewesen wären und daraus die Trefferquote berechnen.

Mein Problem ist nun, dass ich sowohl tatsächlich geführte Trades als auch rein theoretische Trades (die aufgrund der zu diesem Zeitpunkt schlechten Trefferquote nicht ausgeführt wurden) im Array mitberücksichtigen möchte.

Daher meine Fragen:
- Wie kann ich feststellen, ob der letzte tatsächlich getätigte Trade einen Gewinn oder Verlust zur Folge hatte?
- Wie könnte man "nicht getätigte Trades" am besten beobachten?

Ansonsten bin ich natürlich interessiert, was ihr so von der Idee haltet.

Grüße
Sandreal

sandmann23 23.03.12 20:08

Hi,
Zitat:

Zitat von Sandreal (Beitrag 11687)
Daher meine Fragen:
- Wie kann ich feststellen, ob der letzte tatsächlich getätigte Trade einen Gewinn oder Verlust zur Folge hatte?

Speicher die Ticketnummer, die du bei OrderSend bekommst in einem array. Dann kannst du jeder Zeit OrderProfit() checken.
Zitat:

Zitat von Sandreal (Beitrag 11687)
- Wie könnte man "nicht getätigte Trades" am besten beobachten?

Simulierten entryprice speichern, mit simulierten Exitprice vergleichen und in eine csv Datei speichern.

Vorsicht mit deiner Array Idee, bei MT Neustart verlierst du den Inhalt.


Ansonsten ist deine Idee abhängig davon, was für eine Grundlogik hinter de EA steht. Normalerweise bildet ein EA durch seinen Gewinn/Verlust auch den Markt ab. d.h. mit deinem Array arbeitest du mehr mit Markttechnik als mit Indikatoren etc. dann, was bei den krummen, wilden Kursen der Brokern von Vorteil sein könnte.
Probies es aus

Gruss
sandmann

Sandreal 23.03.12 20:42

Danke sandmann für die schnelle Antwort!
Die Idee mit der csv-Datei finde ich gut. Das Problem, dass bei Schließen des MT die Array-Daten verloren gehen, kann man ja auch verhindern, indem die Daten in dieses file geschrieben werden und bei Neustart über init() wieder ausgelesen werden.

Noch eine Frage:
Gibt es eine elegantere Möglichkeit als mit OrderCloseTime() zu prüfen, ob eine Position geschlossen wurde?

Für die "nicht getätigten Trades" würde ich auf Tickbasis immer StopLoss und TakeProfit prüfen und dann bei "Aktivierung" eines der beiden Werte auf erfolgreich oder erfolglos schließen. Hat jemand ne bessere Idee? Auf Tickbasis zu prüfen ist ja schon relativ ressourcenlastig (auch wenns eigentlich nur 2-3 Zeilen sind - aber es könnten ja jede Menge "nicht getätigte Trades" gleichzeitig sein).

sandmann23 23.03.12 21:17

Zitat:

Zitat von Sandreal (Beitrag 11693)
Noch eine Frage:
Gibt es eine elegantere Möglichkeit als mit OrderCloseTime() zu prüfen, ob eine Position geschlossen wurde?

Ist elegant genug, da du mit Select_by_ticket eh das intere Orderarray von MT füllst.
Zitat:

Zitat von Sandreal (Beitrag 11693)
Für die "nicht getätigten Trades" würde ich auf Tickbasis immer StopLoss und TakeProfit prüfen und dann bei "Aktivierung" eines der beiden Werte auf erfolgreich oder erfolglos schließen. Hat jemand ne bessere Idee? Auf Tickbasis zu prüfen ist ja schon relativ ressourcenlastig (auch wenns eigentlich nur 2-3 Zeilen sind - aber es könnten ja jede Menge "nicht getätigte Trades" gleichzeitig sein).

Code:

bool Time5M(){
  static datetime PrevTime5;

  if(PrevTime5 < iTime(NULL, PERIOD_M5, 0))
  {
          PrevTime5 = iTime(NULL, PERIOD_M5, 0);
          return(true);
  } else {
          return(false);
  }
}

dann check es alle 5min nur
MT ist aber ziemlich Ressourcen schonend, auch wenn du es Tickweise berechnest.

Ausprobieren!

Sandreal 27.03.12 19:23

FileReadString
 
Ich habe nun etwas Schwierigkeiten mit dem Einlesen von Textfiles.
Mein Beispiel file sieht folgendermaßen aus:
Code:

7
1
0
1
1
0
0
1

1. Eintrag: Anzahl der Daten, also Größe von hits[]; danach kommen die einzulesenden Daten

Einlesen:
Code:

int hits[];
int handle;

...

bool readTradesFile()
{
handle = FileOpen("hits.txt", FILE_BIN|FILE_READ);
  if(handle>0)
  {
      int hitsNumber = StrToInteger(FileReadString(handle,1));
      Print("hitsNumber: "+hitsNumber);
      ArrayResize(hits,hitsNumber);
      for(int h=0; h<hitsNumber; h++) hits[h] = StrToInteger(FileReadString(handle,1)); //
      FileClose(handle);
  }
  ...
}

Beim Ausgeben der in hits eingelesenen Daten bekomme ich allerdings folgendes in der Konsole:
Code:

2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 7. entry: 0
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 6. entry: 0
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 5. entry: 0
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 4. entry: 0
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 3. entry: 1
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 2. entry: 0
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: 1. entry: 0
2012.03.27 19:15:29        2012.03.20 00:00  hitCheckerTest_Simple EURUSD,H1: hitsNumber: 7

Wie verwende ich FileReadString richtig?

naranjoe 27.03.12 21:14

Hallo,

wenn du eine Text-Datei auslesen möchtest, musst du aber FILE_CSV benutzen und nicht FILE_BIN.

Da die ausgelesenen Werte dann "Strings" sind, solltest du sie noch mit StrToInteger in Zahlen umwandeln.

Gruß
naranjoe

pat77 01.04.12 23:33

Hallo Sandreal

Hast du deinen Code bereits fertig? Habe das selbe Problem und muss eine Tradehistory für simulierte und echte Trades haben und den Trade nur ausführen, wenn der letzte echte oder simulierte Trade positiv war.

Danke dir und Gruss

Pat

Sandreal 02.04.12 13:29

Liste der Anhänge anzeigen (Anzahl: 1)
Jep, ich bin mit dem Teil, der für meinen EA wichtig war fertig. Kannst ja mal schaun, ob die Vereinfachungen in meinem Include-File für deinen Anwendungsfall ausreichen.

Verwendung sieht so aus:

Zitat:

#include <HitRate.mqh>

extern string tradesFile; // .csv
extern string hitsFile; // bei mir .txt (.csv sollte auch gehn)

int init()
{
// int num = Anzahl der zu betrachtenden Trades, auf dessen Basis die Trefferquote berechnet wird
clearHitsFile(hitsFile, num);
clearTradesFile(tradesFile);
...
}

int start()
{
...
double hitRate = hitRate(tradesFile,hitsFile);
...
OrderSend(...);
// nach jedem OrderSend einen neuen Eintrag hinzufügen!
// loserValue = Wert (Preis), bei dem der Trade als Verlierer gewertet wird
// winnerValue analog
newTradeEntry(tradesFile,TimeCurrent(), cmd, openPrice, loserValue, winnerValue);
...
}
Dabei wird der Trades (egal, ob tatsächlich ausgeführt oder nicht) als Gewinner oder Verlierer gewertet, wenn loserValue (z.b. ein StopLoss) oder winnerValue (z.B. Wert, bei dem der StopLoss über BreakEven gesetzt wird) getriggert wird.
Sinn macht HitRate.mqh nur für den diskretionären Handel und wenn loser- und winnerValue weit genug von openPrice entfernt sind, dass diese nicht innerhalb eines Bars auftreten. Für den Handel auf Tickbasis müsstest du es daher noch anpassen. Wäre nett, wenn du dann auch deine Lösung posten würdest.

Bisher ist die Trefferquote auch nur für Market Orders implementiert (ohne Berücksichtigung von Slippage).

Sandreal 02.04.12 13:36

Wenn du nur wissen musst, ob der letzte Treffer erfolgreich war, kannst du "clearHitsFile(hitsFile, 1)" sowie "double hitRate = hitRate(tradesFile,hitsFile); if(hitRate>0)..." verwenden.

Grüße
Sandreal


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:23 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum