
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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?
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.
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");
} } }
Wiederveröffentlicht:
ein, um ihn lesbar zu machen
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
{ 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("Ошибка модификации в безубыток на покупку");
} } }
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
{ 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("Ошибка модификации в безубыток на покупку");
} } }
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
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 suchenstringOrderStopLoss, OrderTakeProfit// wonachwir suchen
intstart_pos=0// an welcher Position die Suche beginnen soll
);
... Wenn ich falsch liege, korrigieren Sie mich ...
Warum lügen Sie, was die Anzahl der Schilder angeht? Führen Sie die Menschen nicht in die Irre.