Wie programmiert man? - Seite 67

 

Zähler?

Ich programmiere seit so vielen Monaten Indikatoren, dass es mir an Experten mangelt, aber ich habe vor, das zu ändern. Auf dem Weg brauche ich ein wenig Hilfe. In meinem Experten, den ich zusammengewürfelt habe, wird bei Bar Close geprüft, ob es eine Bedingung gibt, die das Schließen des Trades rechtfertigt.

Ich beginne mit einer globalen Variablen,

//--- Global variable

datetime PreviousBar; // record candle/bar time[/CODE]

and set one bool in init()

int init()

{

do_this = true;

}

[/CODE]

blah blah boring stuff.... etc, etc

then in the main loop I have:

[CODE]

if(do_this == true)

{

PreviousBar = Time[0];

do_this= false; // so it does this only once only

}

if(NewBar() == true)

{

if(TotalOpenOrders() == blah blah close my order you crazy monkey)

}

and outside the main loop I have:

[CODE]//--- returns true if current bar just formed

bool NewBar()

{

if(PreviousBar<Time[0])

{

PreviousBar = Time[0];

return(true);

}

else

{

return(false);

}

return(false);

}

OK, es ist also so eingestellt, dass es einmal pro Bar geschieht. Was ich tun möchte, ist eine Funktion, die 90 Sekunden oder 60 Sekunden oder was auch immer inkrementiert und dann ein bool auf true setzt, nachdem sie diese Zeit inkrementiert hat. Grundsätzlich möchte ich die Indikatoren alle 60, 90, 120 Sekunden oder was auch immer, anstatt bei Bar schließen zu überprüfen. Wie kann ich das tun?

Danke für jede Hilfe,

- Nittany1

 
nittany1:
Ich programmiere seit so vielen Monaten Indikatoren, dass es mir an Experten mangelt, aber ich habe vor, das zu ändern. Auf dem Weg dorthin brauche ich ein wenig Hilfe. In meinem Experten, den ich zusammengewürfelt habe, wird bei Bar Close geprüft, ob es eine Bedingung gibt, die das Schließen des Trades rechtfertigt.

Ich beginne mit einer globalen Variablen,

//--- Global variable

datetime PreviousBar; // record candle/bar time[/CODE]

and set one bool in init()

int init()

{

do_this = true;

}

[/CODE]

blah blah boring stuff.... etc, etc

then in the main loop I have:

[CODE]

if(do_this == true)

{

PreviousBar = Time[0];

do_this= false; // so it does this only once only

}

if(NewBar() == true)

{

if(TotalOpenOrders() == blah blah close my order you crazy monkey)

}

and outside the main loop I have:

[CODE]//--- returns true if current bar just formed

bool NewBar()

{

if(PreviousBar<Time[0])

{

PreviousBar = Time[0];

return(true);

}

else

{

return(false);

}

return(false);

}

OK, es ist also so eingestellt, dass sie einmal pro Takt ausgeführt wird. Was ich tun möchte, ist eine Funktion, die 90 Sekunden oder 60 Sekunden oder was auch immer inkrementiert und dann ein bool auf true setzt, nachdem sie diese Zeit inkrementiert hat. Im Grunde möchte ich die Indikatoren alle 60, 90, 120 Sekunden oder was auch immer statt bei Bar schließen zu überprüfen. Wie kann ich das tun?

Danke für jede Hilfe,

- nittany1

So sollte es gehen. Denken Sie daran, dass MT eine Tick-basierte Ausführung verwendet, so dass eine sekundengenaue Prüfung nicht möglich ist (es sei denn, Sie führen eine Schleife in der Init()-Subdatei durch).

if (CallIndicatorsCheck())

{

// Ihr Code hier

}

bool CallIndicatorsCheck()

{

statisch datetime Oldtime;

int Secs = 90;

bool Flag;

if (AktuelleZeit() >= AlteZeit) {

Oldtime = CurrTime() + Secs;

Flag = true; }

return(Flag);

}

 

Platzierung von Kommentaren

Könnte mir jemand den Code zeigen, um einen Kommentar in derRECHTEN oberenEcke des Bildschirms zu platzieren, anstatt der Standardeinstellung oben links?

Danke!

 
wolfe:
Könnte mir jemand den Code zeigen, um einen Kommentar in derRECHTEN OBERENEcke des Bildschirms zu platzieren, anstatt der Standardeinstellung oben links? Danke!

Das können Sie nicht. Aus dem MQL4-Handbuch:

void Comment( ...)Die Funktion gibt den vom Benutzer definierten Kommentar in der linken oberen Ecke des Diagramms aus.

Wenn Sie durch den Tod benötigen, könnten Sie Objekte erstellen.

 
wolfe:
Könnte mir jemand den Code zeigen, um einen Kommentar in derRECHTEN oberenEcke des Bildschirms zu platzieren, anstatt der Standardeinstellung oben links? Danke!

LinusGuy hat recht; es gibt keinen direkten Weg. Die einfache Abhilfe ist, den Kommentar mit Leerzeichen aufzufüllen --

Kommentar(" Hallo Welt!");

wird den Text nach rechts verschieben.

Sie können auch Zeilenvorschübe einfügen, um die Seite nach unten zu verschieben.

Comment("\n\n\n\n\ihr Text");

oder kombinieren Sie Zeilenvorschübe und Leerzeichen, um den Text in der unteren rechten Ecke des Bildschirms zu drucken.

mog

 
mog:
LinusGuy hat recht; es gibt keinen direkten Weg. Die einfache Abhilfe besteht darin, den Kommentar mit Leerzeichen aufzufüllen --

Comment(" Hallo Welt!");

wird den Text nach rechts verschieben.

Sie können auch Zeilenvorschübe einfügen, um die Seite nach unten zu verschieben.

Comment("\n\n\n\n\ihr Text");

oder Sie können Zeilenvorschübe und Leerzeichen kombinieren, um in der unteren rechten Ecke des Bildschirms zu drucken.

mog

Vielen Dank für die Hilfe. Ich werde es ausprobieren!

 

kein neuer Handel für X Balken nach einem verlorenen Handel

Hallo Team - ich hoffe, jemand kann mir helfen.

Wie kann ich verhindern, dass ein neuer Handel für 10 Takte beginnt, wenn der letzte Handel ein Verlustgeschäft war?

Danke

 

Die folgende Funktion gibt true zurück, wenn die Kontohistorie einen Verlusthandel aufweist, der bei oder nach der Eröffnung des 10. vergangenen Balkens (aktueller Balken ist 0) geschlossen wurde,

und andernfalls false zurückgibt.

bool postMortem()

{

datetime since = Time[ bar+10 ];

for ( int i = OrdersHistoryTotal() - 1; i >= 0; i-- ) {

if ( ! OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )

continue;

if ( OrderProfit() = since )

return( true );

}

return( false );

}

[/PHP]

If you add that function to your EA, then include a statement like the following in the start() function, then Bob's your uncle.

[PHP]if ( postMortem() ) return( 0 );
 

Vielen Dank dafür - ich werde es versuchen.

Grüße

 

Leute, habt ihr das gleiche Problem?

Ich habe einen Experten kodiert. Ich möchte eine Position eröffnen, wenn der Preis derselbe ist wie der eines Indikators. Um dies zu tun, verwende ich den folgenden Satz:

//zu kaufen

double indicatorpast = icustom(....................,1);

double indicatornow = icustom(....................,0);

wenn (close[1]indicatornow) OpenBUY();

if (close[1]>indicatorpast && close[0]<indicatornow) OpenSELL();

aber mit diesem Satatement öffnet der Experte Positionen nicht nur, wenn der Preis den Indikator überschreitet, sondern auch oberhalb des Indikators. Ich möchte, dass der Experte die Position NUR öffnet, wenn er den Indikator überquert, also habe ich das versucht:

//zu kaufen

double indicatorpast = icustom(....................,1);

double indicatornow = icustom(....................,0);

if (close[1]<indicatorpast && close[0]==indicatornow) OpenBUY();

if (close[1]>indicatorpast && close[0]==indicatornow) OpenSELL();

Aber diese Anweisung wird nicht ausgeführt.

Wissen Sie, woran das liegt? Ich denke nämlich, dass die Anweisung keine Fehler enthält.

Mit freundlichen Grüßen.