Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 143

 
Лауреат:
Wie kann man eine Funktion erstellen, die eine offene Position durch ihre eigene Brücke schließt, nachdem eine bestimmte Anzahl von Kerzen im Zeitverlauf vergangen ist?
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
Ich bin am Experimentieren!!! Logik ist spezifisch!!! Können Sie mir helfen?

Was ist das Besondere daran?

Sehen Sie sich die letzte Position an, und öffnen Sie die gegenüberliegende Position.

 
Konstantin Nikitin:

Ich werde es mir ansehen.

 
sviter-pro:

Ich werde das überprüfen.

 

Hallo. Bitte helfen Sie mit der Funktion. Auf einem Konto sollen mehrere EAs handeln. Jeder EA kann maximal einen Handel pro Tag eröffnen. Ich brauche eine Funktion, die true zurückgeben würde, wenn der EA bereits einen Handel hatte, und false , wenn es keinen Handel gab. Soweit ich weiß, sollte die Prüfung auf magische Weise zum aktuellen Datum erfolgen. Wenn Sie mir helfen können, plane ich, diese Funktion in jeden meiner EAs einzubauen, die eine solche Prüfung benötigen. Wenn ich helfen kann, plane ich, es in jeden meiner EAs einzubauen, wo ich eine solche Prüfung benötige.

 
Kolya32:

Hallo. Bitte helfen Sie mit der Funktion. Auf einem Konto soll er mit mehreren EAs handeln. Jeder EA darf nicht mehr als einen Handel pro Tag eröffnen. Wir brauchen eine Funktion, die true zurückgibt, wenn es einen Handel gab, und false , wenn es keinen Handel gab. Soweit ich weiß, sollte die Prüfung auf magische Weise zum aktuellen Datum erfolgen. Wenn Sie mir helfen können, plane ich, diese Funktion in jeden meiner EAs einzubauen, die eine solche Prüfung benötigen. Wenn ich helfen kann, plane ich, es in jeden meiner EAs einzubauen, wo ich eine solche Prüfung benötige.

Alles wurde bereits vor uns getan )) Siehe hier.

 

Sieht aus, als bräuchte ich die Funktion isTradeToDay(). Nun, ich werde experimentieren) Danke.

Ich habe die Funktion für mich korrigiert, indem ich int mn=-1 auskommentiert und mn durch Magic ersetzt habe. Nachdem ich den EA mit dieser Funktion im Tester laufen ließ, sah ich einen großen Nachteil: die Zeit für das Testen des EA stieg um JAHRE! Nun habe ich mich entschlossen, den Expert Advisor mit dieser Funktion auf einem Demokonto zu testen. Ich habe 5 Expert Advisors in meinem Konto und mache mir Sorgen, dass die Geschäfte mit Verzögerung eröffnet werden...

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) {
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
if (ZeitTag(OrderOpenTime())==Tag()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) return(True);
}
}
}
}
}
}
k=AufträgeGesamt();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
if (ZeitTag(OrderOpenTime())==Tag()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) return(True);
}
}
}
}
}
}
return(False);
}

 

Sie müssen das Break-even-Niveau des Gitters auf dem Diagramm markieren.

Gewinn in Pips:

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

Breakeven-Position für das BUY-Grid

zero = Bid-current_Prof_Pts*_Point

(Für SELL, bzw.: Ask+aktuelle_Prof_Pts*_Point)

Ergebnis: Scheint zu stimmen, springt aber immer um etwa 3 Punkte um den wahren Wert.

Können Sie mir sagen, wo der Fehler liegt?

 
Kolya32:

Sieht aus, als bräuchte ich die Funktion isTradeToDay(). Nun, ich werde experimentieren) Danke.

Ich habe einen großen Nachteil festgestellt: die Zeit für das Testen eines EA hat sich EXAKT FÜNF MAL erhöht!

Ja, natürlich. Die Funktion ist in einer universellen Weise geschrieben. Wenn Sie bei jedem Ticken darauf zugreifen, geht die Schleife durch die gesamte Kontohistorie. Und die Kontohistorie kann recht umfangreich sein (ich habe Fälle gesehen, in denen es mehr als 100 000 Bestellungen gab). Um die Ausführung zu beschleunigen, müssen Sie die Schleife nicht jedes Mal über den gesamten Verlauf laufen lassen. Es reicht aus, dies nur einmal ganz am Anfang zu tun und sich den Index des zuletzt bearbeiteten Auftrags zu merken. Beim nächsten Mal müssen Sie die Schleife nur für die Aufträge durchlaufen, deren Index größer als der gespeicherte Index ist. Danach merken Sie sich wieder den Index der letzten Bestellung und so weiter.

 
Igor Zakharov:

Sie müssen das Break-even-Niveau des Gitters auf dem Diagramm markieren.

Gewinn in Pips:

Breakeven-Position für das BUY-Grid

(Für SELL, bzw.: Ask+aktuelle_Prof_Pts*_Point)

Ergebnis: Scheint zu stimmen, schwankt aber immer um etwa 3 Punkte um den wahren Wert.

Bitte teilen Sie uns mit, wo der Fehler liegt?

Schuld daran ist der Floating Spread.