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

 
Sergey Likho:

Können Sie mir sagen, wie man die Sicherheiten für ein Geschäft berechnet?


Zwei Ansätze ausprobiert

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


Und diese hier

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



Der erste gibt seltsame Ergebnisse auf EURJPY, wenn meine Einzahlungswährung USD ist. Muss ich der Formel etwas hinzufügen?

Der zweite funktioniert auch nur einmal, manchmal gibt er den richtigen Wert an, manchmal gibt er irgendeinen Unsinn an (es hängt von der Einzahlung ab)

Die zweite Variante ist der korrekte Weg, um die Einzahlung zu berechnen. Um genau zu sein, zeigt die Variable val den Wert der freien Mittel nach der Bestellung und die VariableFreeMarginCheck den Wert der Einzahlung selbst an

 
Igor Makanu:

Die zweite Option ist der richtige Weg, um die Marge zu berechnen, oder vielmehr erhalten Sie den Wert der freien Mittel in der val-Variable nach der Platzierung einer Bestellung, und die VariableFreeMarginCheck ist der Wert der Marge selbst

Sind Sie sicher?

AccountFreeMarginCheck

Gibt den Betrag der freien Mittel zurück , der nach der Eröffnung des angegebenen Auftrags zum aktuellen Preis auf dem aktuellen Konto verbleibt.


Auch hier gibt es eine gewisse Subtilität:

Wenn Gegengeschäfte offen sind, d.h. eine vollständige oder unvollständige Sperre des Kontos besteht, kann die Funktion falsche Werte liefern.


 
Sergey Likho:

Sind Sie sicher?

Ja, Sie haben Recht, das ist genau richtig:

Gibt den Betrag der freien Mittel zurück, der nach Eröffnung des angegebenen Auftrags zum aktuellen Preis auf dem aktuellen Kontoverbleibt.

was die offenen Geschäfte betrifft, müssen Sie überprüfen, ich erinnere mich nicht, aber höchstwahrscheinlich sollte das, was das Terminal schreibt, mit den berechneten Daten übereinstimmen: die Gesamtzahl der Lots in jeder Richtung der Geschäfte (BAY/SELL) für alle Symbole, dann rufen Sie für jedes Symbol

AccountFreeMarginCheck() übergibt Lose in jede Richtung und addiert diese Ergebnisse

Der Markt funktioniert heute, es ist leicht zu überprüfen, wie folgt

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

Guten Tag, könnten Sie mir sagen, was mit der Funktion nicht in Ordnung ist? Die Funktion führt eine Handelspause nach Zeit durch, die Parameter umfassen den Beginn der Pause und das Ende der Pause.
Die Funktion liest die Zeit nicht vom Server des Brokers, sondern vom Computer, obwohl TimeCurrent vorgeschrieben ist. Im Allgemeinen werden die Geschäfte während der Pause geschlossen, d.h. die Funktion funktioniert nicht.

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

Guten Tag, können Sie mir sagen, was mit der Funktion nicht stimmt? Die Funktion führt eine Handelspause nach Zeit durch, die Parameter sind Pausenbeginn und Pausenende.
Die Funktion liest die Zeit nicht vom Server des Brokers, sondern vom Computer, obwohl TimeCurrent vorgeschrieben ist. Im Allgemeinen werden die Geschäfte während einer Pause geschlossen, was bedeutet, dass die Funktion nicht funktioniert.

UnprintTimeStart undStrToTime(TimeStart);

dann unprintTimeCurrent()

IhrTimeStart ist nicht im vollständigen Datumsformat, d. h. die Zeit ist immer der aktuelle Tag, Monat und das Jahr, wenn Sie den EA ausführen, und dann ändert sie sich?

Und global ... um die Stunden und Minuten des Handels zu bestimmen, sollten Stunden und Minuten mit der Stunde und Minute der Serverzeit verglichen werden, Sie vergleichen nur die Tatsache, dass die Serverzeit länger ist als die angegebene

SZZ: um Verwirrung zu vermeiden, können Siedatetime als int betrachten, was es auch ist, und wenn Sie 2datetimevergleichen, vergleichen Sie 2 int

PSPS:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

Ihr Code wird wahrscheinlich funktionieren, Sie sollten es auf diese Weise versuchen:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


Normalerweise zähle ich die Zeit auf diese Weise:

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

und vergleichen Sie sie dann mit den EA-Einstellungen

 
Igor Makanu:

Danke, ich werde versuchen, es herauszufinden, ich bin nur ein Anfänger), mit && Option anstelle von || Ich habe nicht versucht, online noch, durch die Art und Weise in Tester dieser Code funktioniert, es liest Zeit aus dem Terminal, keine Schließung der Aufträge während der Pause, aber online ist es anders.

 

Hallo! Das Terminal startet nicht im Strategie-Tester. Ich stelle das Datum ein, z.B. (2017,04,01 bis 2018,05,29), drücke auf Start, es gibt sofort einen Stopp. Im Protokoll steht Folgendes,

TestGenerator: keine Verlaufsdaten 'EURUSD30' von 2017.04.01 bis 2018.05.29. Und so weiter auf jedem Segment. Mein Computer funktioniert, ich dachte, er hätte vielleicht nicht genug RAM. Auf dem Heimcomputer ist es dasselbe, ein Neustart hilft nicht, aber es läuft eine Weile. Ich habe den Expert Advisor aus dem Market heruntergeladen und getestet. Falls jemand den Grund kennt, bitte ich um einen Hinweis.


 
danil77783:

Hallo! Das Terminal startet nicht im Strategie-Tester. Ich stelle das Datum ein, z.B. (2017,04,01 bis 2018,05,29), drücke auf Start, es gibt sofort einen Stopp. Im Protokoll steht Folgendes,

TestGenerator: keine Verlaufsdaten 'EURUSD30' von 2017.04.01 bis 2018.05.29. Und so weiter auf jedem Segment. Mein Computer funktioniert, ich dachte, er hätte vielleicht nicht genug RAM. Dasselbe auf dem Heimcomputer, ein Neustart hilft nicht, aber es läuft eine Weile. Ich habe Expert Advisor aus dem Market heruntergeladen und getestet. Können Sie mir bitte einen Hinweis geben, wenn ich den Grund dafür kenne?


Ich glaube, der Tester sagt, dass es keine Verlaufsdaten gibt, drücken Sie F2 und laden Sie den Verlauf herunter, dann starten Sie das Terminal neu

 
danil77783:

Hallo! Das Terminal startet nicht im Strategie-Tester. Ich stelle das Datum ein, z.B. (2017,04,01 bis 2018,05,29), drücke auf Start, es gibt sofort einen Stopp. Im Protokoll steht Folgendes,

TestGenerator: keine Verlaufsdaten 'EURUSD30' von 2017.04.01 bis 2018.05.29. Und so weiter auf jedem Segment. Mein Computer funktioniert, ich dachte, er hätte vielleicht nicht genug RAM. Auf dem Heimcomputer ist es dasselbe, ein Neustart hilft nicht, aber es läuft eine Weile. Ich habe Expert Advisor aus dem Market heruntergeladen und getestet. Wenn ich den Grund kenne, bitte ich um Rat.


Bedeutet dasFehlen historischer Daten etwas?

 
Igor Makanu:

Es sieht so aus, als ob das Testgerät Ihnen mitteilt, dass es keine Verlaufsdaten gibt. Drücken Sie F2 und laden Sie den Verlauf herunter, dann laden Sie das Terminal neu.

Ich danke Ihnen! Ich werde es ausprobieren. Wirkt sich die Aktualisierung des Terminals in irgendeiner Weise aus? Ob es aktualisiert ist oder nicht, obwohl es Ihnen das selbst mitteilen wird......

Grund der Beschwerde: