| Autor |
Nachricht |
|
Verfasst am: 14.07.10 [09:07]
|
|
sten
Themenersteller
Dabei seit: 02.04.2010
Beiträge: 304
|
Hallo,
bei diesem Code werden Signale irgendwie "verschluckt". Um den Effekt besser analysieren zu können, würde ich gerne die Berechung (den return-Wert) in Chart des EA's darstellen.
Wie geht das ?
//Methode die den cross der beiden GD's berechnet
int crossed(double lineKlein, double lineGross) {
static int last_direction = 0;
static int current_direction = 0;
if(lineKlein > lineGross) current_direction = 1; //long-Trade
if(lineKlein < lineGross) current_direction = 2; //short-Trade
if(last_direction != current_direction) {
last_direction = current_direction;
return(current_direction);
} else {
return(0);
}
}
Ist es ratsam mit static-Variablen zu arbeiten, wenn man den EA auf mehreren Titeln in einem MetaTrader laufen lassen möchte? Beieinflussen diese verschiedenen Instanzen sich dann nicht gegenseitig?
Ich möchte nicht zum Open in einen long-Trade einsteigen, sondern mit 3 Pips unterhalb des Opens. Mit OrderSend(Symbol(),OP_BUYLIMIT,...) hat es nicht funktioniert, d.h. es wurden überhaupt keine Trades gemacht. Gibt es für so einen Limit-Einstieg vielleicht ein kleines Codebeispiel?
Danke.
Viele Grüße
Sten
|
|
Verfasst am: 14.07.10 [11:35]
|
|
MCall
Dabei seit: 03.05.2010
Beiträge: 118
|
Hallo Sten,
kann es sein ,dass Dein Codefragment Teil einer Funktion ist?
Wg des Return() gehe ich mal davon aus.
Dann aber ist es falsch die static Variablen =0 zu setzen.
Die Absicht bei static ist ja, den Infhalt für spätere Aufrufe zu erhalten. Du setzt aber diese Var jedesmal eingangs auf 0 !!!
Um solche Abläufe korrekt zu gestalten wird folgende Systematik angewandt:
returncode Funktion(bool boFirst, diverse Params...)
{
static int Var;
if(boFirst)
{
//Initialisieren statics
Var=0;
returncode= irgendwas;
}
else
{
//Berechnung
Var = Var+1 ; // z.Beispiel
}
return(irgendwas)
}
Somit sind alle Aufgaben für die Berechnung einer Static Variablen in einer Funktion
//Programminit
..
..Funktion(True,..); //Einmalig Init zum Start des Progr.
..
..Funktion(False,...) //hier tut die Funktion das,was sie soll
Gruß MCALL
|
|
Verfasst am: 14.07.10 [11:54]
|
|
MCall
Dabei seit: 03.05.2010
Beiträge: 118
|
@sten
Pardon,habe den Textanfang Deines Codebeispiels irgendwie verschluckt.
Deine Funktion tut also dann das ,was sie soll, wenn die static Var richtig behandelt werden.
Als Faustregel: Werden static Var in einer Funktion benutzt,sollte es für eine solche Funktion IMMER eine Initialisierungsfunktion geben. Diese wird im einfachsten Fall in der MT4-Funktion init()
untergebracht.
Gruß MCAll
|
|
Verfasst am: 14.07.10 [12:13]
|
|
sten
Themenersteller
Dabei seit: 02.04.2010
Beiträge: 304
|
Hallo MCALL,
ja das ist eine Funktion die außerhalb der expert-Funktionen (start(), ...) steht. Aufgerufen wird die Methode bei jedem neuen Tick, d.h. der Funktionsaufruf steht innerhalb der start() Funktion.
Du hast recht, dass man bei jedem crossed(..) die beiden static-Variablen neu setzt ist sinnlos.
Ich werde das setzen der beiden static-Variablen über die Funktion verschieben und alles in den init()-Bereich verschieben.
-> Dann ist sichergestellt, dass nur beim Start des EA's einmalig die beiden static-Variablen gesezt werden.
Schön wäre es trotzdem, wenn man solche Berechnungen irgendwie im Chart beim laufen des EA's darstellen könnte.
So ein Art graphisches Debugging...
Da gibt es bestimmt ein ganz einfache Möglichkeit...
Vielleicht hat jemand eine Idee.
Danke.
Viele Grüße
Sten
[Dieser Beitrag wurde 2mal bearbeitet, zuletzt am 14.07.2010 um 12:15.]
|
|
Verfasst am: 14.07.10 [12:43]
|
|
MCall
Dabei seit: 03.05.2010
Beiträge: 118
|
@sten
Zum grafischen debuggen gibt es mehrere Möglichkeiten:
1)Einfügen eines grafischen Objektes in den Chart
Du kannst ohne Aufwand grafische Objekte erzeugen, die an einer gewünschten Stelle positioniert werden (also Time in X,Price in Y-Richtung) Diese Objekte kann man dann auch wieder löschen.
Das geht mit den Funktionen CreateObject(...) und DeleteObject()
Reicht eine Marke als Symbol, nimmt man das Object "ARROW"
Will man Texte ausgeben, dann kann man auch das.
Dieser Themenkomplex ist unter ObjectFunctions zu finden.
2) Ausgabe eines Labels
Darunter versteht man die Ausgabe eines Textes an einer festen Pos des Charts. Diese Texte sind Objekte vom Typ "LABEL"
So sind z.B. Die Überschriftzeilen des Trado oben rechts genau solche Labels.
3) Ausgabe in ein Indikatorfenster a la VM
Das funktioniert genauso, man muss nur als "Zielfenster" den Parameter Window auf 1 setzen(1.Indijkatorfenster)
Diese Vorgehensweise wird dann nötig, wenn man Größen mit anderen Inhalt darstellen will. Z.B. die Equity hat ja Wete von 0.0 bis 10.000. da man das Indikatorfenster beliebig skalieren kann, ist dort die Equity[€] maßstabsgerecht möglich.
Hier muss man herumexperimentieren. Das Studium der Doku ist aber unumgänglich, aber einfache Darstellungen bekommt man schnell hin.
Gruß MCall
|
|
Verfasst am: 15.07.10 [17:17]
|
|
sten
Themenersteller
Dabei seit: 02.04.2010
Beiträge: 304
|
Hallo MCall,
erstmal Danke für die Erklärungen. Es gibt in dem xtb-Programmierhandbuch auf S.249 ein Kapitel "Indikatoren im Expert Advisor einbetten (iCustom Alternative)".
Diese Varinate gefällt mir, weil dann alles im EA enthalten ist was zusammen gehört. Eigentlich wollte ich nur die beiden GD's im Chart gleich mit anzeigen, sobald man den EA in den Chart legt & aktiviert.
Aber in diesem Beispiel auf Seite 252/253 ist irgendwie der Wurm drinne. Habe eine Indikator-Methode programmiert und dann mit der Print()-Methode im start()-Bereich aufgerufen, genau wie im Beispielcode.
Leider wird der Indikator aber im Chart nicht angezeigt.
Da bin ich leider noch nicht weiter gekommen.
Viele Grüße
Sten
PS:
Kann es sein das das Beispiel unvollständig ist?
Bräuchte man nicht irgendwelche #property-Definitionen, z.B. mit welcher Farbe der Indikator gezeichnet werden soll?
[Dieser Beitrag wurde 5mal bearbeitet, zuletzt am 15.07.2010 um 17:22.]
|
|
Verfasst am: 15.07.10 [21:23]
|
|
MCall
Dabei seit: 03.05.2010
Beiträge: 118
|
Hallo Sten,
leider habe ich das Handbuch nicht,meine engl. Version habe ich irgendwie verschlampt.
Aber wie ich mich erinnere, lassen alle Dokus aus dem Internet beim Thema Indikatoren für die reale Umsetzung viele Details weg.
Es gibt da auch sehr viele ganz unterschiedliche Anwendungsfälle.
Schick mir doch mal die Erklärung vom Handbuch,auf die Du dich stützt, und den Code,den Du daraus gemacht hast. Da debugge ich deinen Ind soweit,dass er was anzeigt, das geht am schnellsten.
Der Indikator muss ja separat ohne EA aufrufbar sein und was zeigen,sonst fehlts da schon am Ind-Code
Es gibt aber im Verzeichnis "Indikatoren" viele Ind. lauffähig mit Sourcecode, da kann man auch mal reinschauen . Diese Indis sind definitiv lauffähig.
Gruß MCALL
|