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

 
Babu Bonappan:

OrderOpenPrice, so wie ich es verstehe, gibt mir genau das, was ich brauche. Allerdings nur, wenn die Einzahlungswährung USD und das gehandelte Paar EUR/USD ist. In diesem Fall ist es so, als ob der OrderOpenPrice den Wechselkurs der Basiswährung zur Einzahlungswährung zum Zeitpunkt der Auftragseröffnung speichert, so dass Sie die Einzahlung leicht berechnen können.

Wenn aber mindestens eine dieser Bedingungen nicht erfüllt ist, wie können wir dann den Wert der Kaution für einen einzelnen Auftrag ermitteln? Wo kann man den Kurs der Basiswährung einer Notierung im Verhältnis zur Währung des Depots zum Zeitpunkt der Eröffnung finden?

Ja, wir haben den Zeitpunkt der Auftragseröffnung auf die Sekunde genau. Aber was können wir bekommen? Höchstens - die Parameter der Minutenkerze des gewünschten Symbols. Aber niemals den genauen Wert des Zinssatzes, der für die Berechnung der Kaution verwendet wird. Aber die Funktion AccountMargin bekommt sie irgendwie! Ich würde sehr gerne verstehen, wie genau das funktioniert.

Sie benötigen drei Formeln, um die Marge zu berechnen.

Abhängig von der Währung, in der Sie Ihre Einlage getätigt haben, wird die Marge für jedes Währungspaar berechnet.

Es ist möglich, dass bei der Berechnung ein Fehler auftritt. Sie wird jedoch viel kleiner sein als diejenige, die sich ergibt, wenn das Ergebnis der Berechnung auf eine Hundertstel-Einheit der Basiswährung der Einlage gerundet wird, d.h. wenn es sich um einen Dollar handelt, dann meine ich Cent.

PS

AccountMargin ist der aktuelle, d.h. der letzte Wert

 

Was ist, wenn ich den genauen Wert der Marge zum Zeitpunkt der Auftragseröffnung mitMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot ermittle - er wird immer zwei Dezimalstellen haben, richtig? Dann multipliziere ich sie mit 100 und speichere sie als MagicNumber dieser Bestellung. Und wenn es nötig ist, werde ich sie dort herausnehmen und durch 100,0 teilen.

Ist das richtig?

 
Babu Bonappan:

Was ist, wenn ich den genauen Wert der Marge zum Zeitpunkt der Auftragseröffnung mitMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot ermittle - er wird immer zwei Dezimalstellen haben, richtig? Dann multipliziere ich sie mit 100 und speichere sie als MagicNumber dieser Bestellung. Und wenn es nötig ist, werde ich sie dort herausnehmen und durch 100,0 teilen.

Ist das richtig?

Auch dafür ist die MagicNumber nicht gedacht. Es wäre besser, die Daten in eine Protokolldatei zu schreiben und sie dann zu lesen.

Es kommt auf den Zweck einer solchen Berechnung und die Anzahl der Aufträge an, für die das Programm ausgelegt ist.

Meines Erachtens sind solche genauen Berechnungen nur für einen Makler oder eine Maklergesellschaft erforderlich.

Unter diesem Gesichtspunkt wäre die optimale Lösung die Protokollierung.

 
Vitaly Muzichenko:

Warum lügen Sie, was die Anzahl der Schilder angeht? Führen Sie die Menschen nicht in die Irre.

Ha.

Haben Sie noch nie etwas von Hochpräzisionszählung gehört?

 

Aufgeschoben:

einen einfachen Expert Advisor geschrieben, der einen externen Indikator verwendet, aber es gibt einen Haken.

Das Schließen eines halben Lots funktioniert nicht korrekt, und der Auftrag wird bei jedem Tick geändert.

Hier ist der Block der Modifikation zu kaufen

if (CountBuy()>0) //Diese Funktion zählt die Anzahl der Kaufaufträge
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //wenn der Preis die vom Indikator geforderte Bewegung überschritten hat
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //hier ändere ich Stop in Breakeven
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Ich versuche, die Hälfte des Lots zu schließen
Print("Fehler beim Schließen der Hälfte der zu kaufenden Partie");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //hier verschiebe ich den restlichen Teil zum Breakeven
Print("Fehler bei der Anpassung an die Gewinnschwelle beim Kauf");

} } }


 
Vladimir Karputov:

Wiederveröffentlicht:

ein, um ihn lesbar zu machen

 
Können Sie mir bitte einige Tipps geben, wie ich mit diesem Problem umgehen kann? Ich habe fastein einfaches Expert Advisor mit einem externen Indikatorgeschrieben, aber ich habe auf ein Problem gestoßen.

Wenn der Block OrederClose hat, wird die Hälfte der Partie sofort geschlossen und OrderModify funktioniert nicht mehr.

Wenn wir OrederClose entfernen, ändert OrderModify die Reihenfolge für jeden Tick

Hier ist der Block der Modifikation zu kaufen

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Wie kann ich die eine Hälfte der Order schließen und die andere Hälfte zum Breakeven bringen, wenn der Kurs die MinMove erreicht?
 
Vasiliy Danilov:
Können Sie mir bitte einige Tipps geben, wie ich damit umgehen kann? Ich habe fasteinen einfachen Expert Advisor mit einem externen Indikatorgeschrieben, aber es gibt einen Haken.

Wenn Sie OrederClose im Block haben, wird die Hälfte der Partie sofort geschlossen und OrderModify funktioniert nicht mehr.

Wenn Sie OrederClose entfernen, wird OrderModify den Auftrag bei jedem Tick ändern

Hier ist der Block der Modifikation zu kaufen

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Wie sollte ich die eine Hälfte der Order schließen und die andere Hälfte zum Breakeven bringen, wenn der Kurs die MinMove erreicht?

Sie haben einen Fehler beim Schließen der Hälfte des Loses, so dass es sich nicht ändert. Bitte korrigieren Sie sie entsprechend meinem obigen Beitrag.

Und um es einmal zu tun, müssen Sie den Break-even auf eine feste Anzahl von Punkten setzen und die Bedingung der Prüfung des Take-Profits des Auftrags an die Tatsache der Einhaltung dieser Zahl knüpfen

Und wenn der Preis eine solche Bedingung im Auftragsänderungsblock durchläuft, sollte die Hälfte des Auftrags geschlossen werden

 
Alexey Kozitsyn:
Nein. Versuchen Sie zu verstehen, was Sie da tun. Was Sie geschrieben haben, ist nur ein Prototyp der Funktion (d.h. nur eine Beschreibung, was sie tut). Sie haben es also einfach aus der Dokumentation herausgerissen. Sie müssen es benutzen. Sie müssen also Ihre eigenen Werte an die Stelle der Argumente setzen. Und die Funktion gibt das Ergebnis zurück. Dann muss dieses Ergebnis verarbeitet werden.

Danke für die Antwort ... Ich habe das halbe Internet durchsucht, es gibt nur sehr wenige Beispiele für die Verwendung der FunktionStringFind, und aus dem, was ich gefunden habe, habe ich geschlossen, dass die Parameter sein müssen

intStringFind(

stringcomment =OrderComment()// Die Zeichenfolge, nach der wir suchen
stringOrderStopLoss, OrderTakeProfit// wonachwir suchen
intstart_pos=0// an welcher Position die Suche beginnen soll

);

... Wenn ich falsch liege, korrigieren Sie mich ...

 
Vitaly Muzichenko:

Warum lügen Sie, was die Anzahl der Schilder angeht? Führen Sie die Menschen nicht in die Irre.

Jeder Makler hat seinen eigenen Standpunkt