Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 306

 
Alexey Viktorov:

Und es konnte keine andere geben. Kein Computer kennt ein Jahr weniger als 1970. Beginnen Sie mit dem Jahr, das in den Angeboten des Maklers erscheint.

Ich verstehe) Danke.
 
Aleksey Vyazmikin:

Code im MT5

Ergebnis:


SZY: Ich habe den Code geändert - er stammt nicht von diesem ME.

Ich habe die Idee nicht sofort verstanden. Ich habe es nicht in mql5 gemacht, ich werde es herausfinden müssen. In mql4 können Sie dies jedoch auf folgende Weise tun:

Erstellen Sie zwei zusätzliche Puffer.

Legen Sie einen Offset für N Takte fest und füllen Sie diese N Takte mit dem letzten Wert der Hauptpuffer.

Und natürlich muss der Index N+1 dieser zusätzlichen Puffer mit einem leeren Wert gefüllt werden.

 
Alexey Viktorov:

Ich habe die Idee nicht sofort verstanden. Ich habe es nicht in mql5 gemacht, ich muss es herausfinden. In mql4 können Sie dies jedoch auf folgende Weise tun:

Erstellen Sie zwei zusätzliche Puffer.

Legen Sie für sie einen Versatz von N Takten fest und füllen Sie diese N Takte mit dem letzten Wert der Hauptpuffer.

Und natürlich wird der Index N+1 dieser zusätzlichen Puffer mit einem leeren Wert gefüllt.


Danke für die Idee - ich habe das ursprünglich in MT5 gemacht, dann habe ich es optimiert.

Wie auch immer, ging um 4 Uhr morgens zu Bett (öffentlicher Code ist natürlich nicht vollständig), aber tat, was ich mit zwei Puffern wollte.

Das Problem war, dass im MT5 die Füllung von links nach rechts erfolgt, im MT4 ist es umgekehrt. Die FunktionArraySetAsSeries hat nicht geholfen - ich habe die gesamte Logik neu geschrieben.

 

Guten Tag, Artem!

Ich möchte um Hilfe bei meiner Überarbeitung von TrExp_Nik ver. Ich möchte die Möglichkeit hinzufügen, den Wert auf den Breakeven zu verschieben, aber meine begrenzten Programmierkenntnisse erlauben mir das nicht. Ich habe mich für e-MovingInWL entschieden, dessen Code ich versuche, in meinen EA zu integrieren, aber ich kann die Variablen nicht richtig kombinieren oder ich verstehe den Code des zweiten Breakeven Expert Advisors nicht richtig. Vielleicht ist dies nicht die optimale Variante. Ich möchte Sie um Ihren Rat bitten, wie ich es besser oder einfacher machen kann.

Dateien:
 
niktach:

Guten Tag, Artem!

Ich möchte um Hilfe bei meiner Überarbeitung von TrExp_Nik ver. Ich möchte die Möglichkeit hinzufügen, den Wert auf den Breakeven zu verschieben, aber meine begrenzten Programmierkenntnisse erlauben mir das nicht. Ich habe mich für e-MovingInWL entschieden, dessen Code ich versuche, in meinen EA zu integrieren, aber ich kann die Variablen nicht richtig kombinieren oder ich verstehe den Code des zweiten Breakeven Expert Advisors nicht richtig. Vielleicht ist dies nicht die optimale Variante. Ich möchte Sie um Ihren Rat bitten, wie ich sie verbessern oder vereinfachen kann.

Guten Tag. Was genau haben Sie versucht zu tun? Ich sehe nur zwei beigefügte Codes. Wenn Sie jemanden brauchen, der alles für Sie erledigt, ist die Freiberuflichkeit genau das Richtige für Sie.

Und wenn Sie versuchen, es selbst zu tun, dann zeigen Sie mir genau, was Sie tun und wo Sie es nicht verstehen.

 

Hallo,

Gibt es eine Möglichkeit, programmatisch auf die Eigenschaften des grafischen Objekts "Dreieck" zuzugreifen, das auf dem Diagramm platziert ist? Ich meine die Zeit- und Preiskoordinaten der Scheitelpunkte, die auf der Registerkarte "Parameter" angezeigt werden, wenn das Eigenschaftsformular interaktiv geöffnet wird. Ich habe versucht, die FunktionenObjectGetInteger und ObjectGetDouble zu verwenden, aber sie können nur Daten für einen Vertex abrufen.

Ich danke Ihnen.

 
oddball:

Hallo,

Gibt es eine Möglichkeit, programmatisch auf die Eigenschaften des grafischen Objekts "Dreieck" zuzugreifen, das auf dem Diagramm platziert ist? Ich meine die Zeit- und Preiskoordinaten der Scheitelpunkte, die auf der Registerkarte "Parameter" angezeigt werden, wenn das Eigenschaftsformular interaktiv geöffnet wird. Ich habe versucht, die Funktionen ObjectGetInteger und ObjectGetDouble zu verwenden, aber sie können nur Daten für einen Vertex abrufen.

Ich danke Ihnen.

Ja, das können Sie. Und die Richtung der Überlegungen ist richtig. Können Sie mir zeigen, wie Sie versucht haben, die Parameter zu erhalten?

 
Artyom Trishkin:

Wenn der Auftrag per Ticket ausgewählt wird, muss kein Pool angegeben werden - MODE_TRADES ist hier überflüssig - dieser Parameter wird bei der Auswahl per Ticket ignoriert und der Auftrag wird aus einer der beiden Listen ausgewählt - aus der Liste der geschlossenen oder aus der Liste der Marktpositionen - je nachdem, ob die Position geschlossen ist oder nicht.

Nach der erfolgreichen Auswahl eines Auftrags auf der Grundlage des Tickets muss, um zu verstehen, aus welcher der beiden Listen der Auftrag ausgewählt wurde, die Positionsschlusszeit überprüft werden - wenn sie größer als Null ist, wurde der Auftrag bereits geschlossen und aus der Liste der historischen Aufträge ausgewählt, andernfalls ist der Auftrag noch auf dem Markt.

Aber um zu verstehen, wo Sie einen Fehler haben, müssen Sie den Code anhängen - geben Sie mehr Informationen, denn im Prinzip gibt es in dieser Zeile keinen Fehler (außer, dass Sie das Rückgabeergebnis der Funktion nicht überprüfen, Sie verwenden einen Modifikator, der in diesem Fall ignoriert wird, und es gibt kein ";" nach der schließenden Klammer).


Vielen Dank für die Antwort.

Hier ist die ganze Funktion, der Punkt ist, dass es eine Bestellung öffnet und dann fügt konstante Stop-Loss und Take-Profit-Werte über Modifikation.

Die Order ist eröffnet, aber Stop Loss und Take Profit sind nicht gesetzt (die Berechnungsfunktion in rot, in derOrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) einen Fehler liefert ((() )

//Open Order-Funktion, Variablen: Symbol, Ordertyp, Lot, Eröffnungskurs, TP- und SL-Berechnungsmethode (0 - im Preis festgelegt, 1 - in Punkten, die vom Eröffnungskurs aus berechnet werden sollen), Stop Loss, Take Profit)

//Symbol/Paar, offener Auftragstyp - pending, offener Preis, Schalter = 1, SL B TP - Stop Loss und Take Profit Werte sind konstant!

bool SendOrder(string Symb,int Type, double OP,int Mode) {
color CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type==1) CL=Red;
if (Type==2 || Type==4) CL=DarkTurquoise;
if (Type==3 || Type==5) CL=Orange;
//Übersicht Volumen
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; sonst DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Nicht genug Geld, um den Handel zu eröffnen",Type," ",DoubleToStr(Lot,DG)),0);
return;
}
// Pending Orders prüfen
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (Type>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //Limit Stop Loss/Stake Profit Level in Pips. Min. Abstand
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //Der letzte erhaltene Verkaufspreis. Er wird in der vordefinierten Variable Ask für das aktuelle Symbol gespeichert
double Tek_Bid = MarketInfo(Symb,MODE_BID); //Der letzte erhaltene Geldkurs. Sie wird in der vordefinierten Variable Bid für das aktuelle Symbol gespeichert
double Tek_Point = MarketInfo(Symb,MODE_POINT); //Punktgröße in der Kurswährung. Sie wird in der vordefinierten Variable Point für das aktuelle Symbol gespeichert
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//Die Anzahl der Nachkommastellen im Symbolpreis. Sie wird in der vordefinierten Variablen Digits gespeichert

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// check stops
if (SL!=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Typ==0 || Typ==2 || Typ==4) SL=OP-Slv; else SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (Typ==0 || Typ==2 || Typ==4) TP=OP+Slv; else TP=OP-Slv;
}
}else{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// october
for(int k=0;k<=TryToTrade;k++) {
if (Typ==0) OP=MarketInfo(Symb,MODE_ASK);
if (Typ==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Trying to open an order, type: ",Typ," Volumen: ",Lot," Preis: ",OP),0);
if (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Cannot open order ",k),0;) Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Bestellung geöffnet ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
// Stopps setzen
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
if (Typ==0 || Typ==2 || Typ==4) SL=OrderOpenPrice()-SL*Pp;
if (Typ==1 || Typ==3 || Typ==5) SL=OrderOpenPrice()+SL*Pp;
}
if (TP!=0) {
if (Typ==0 || Typ==2 || Typ==4) TP=OrderOpenPrice()+TP*Pp;
if (Typ==1 || Typ==3 || Typ==5) TP=OrderOpenPrice()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on an order: ",Ticket," s/l: ",SL," t/p: ",TP),0);
if (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE)
}else{ PnC(StringConcatenate("Cannot modify order ",k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Bestellung geändert ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true);

}

 

Kann jemand erklären, warum die Fehlermeldung 131"Falsches Volumen" erscheint, wenn eine Bestellung geändert wird?

Das Pending öffnet sich normal, das Lot ist normalisiert, bei der Druckausgabe ist das minimale Lot 0,01, was nicht weniger ist als mein Volumen (Demokonto)

Ich habe alles im Forum noch einmal gelesen und konnte das Problem nicht finden!

Ich frage mich immer noch, was hinter den Kulissen vor sich geht und was nicht beschrieben wird.
 
forexman77:

Kann jemand erklären, warum die Fehlermeldung 131"Falsches Volumen" erscheint, wenn eine Bestellung geändert wird?

Das Pending öffnet sich normal, das Lot ist normalisiert, bei der Druckausgabe ist das minimale Lot 0,01, was nicht weniger ist als mein Volumen (Demokonto)

Ich habe alles in meinem Forum noch einmal gelesen, aber ich konnte das Problem nicht finden!

Lassen Sie sich nur nicht von versteckten Fehlern überraschen, die auftauchen und nicht beschrieben werden.

Ich habe es bei einem anderen Maklerunternehmen versucht, aber es hat mich nicht umgestimmt. Die Frage ist, warum, wenn Sie anrufen:

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

zieht 0,01 ab, und der Bot druckt 131?

Grund der Beschwerde: