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

 
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.

Wird dies korrekt sein?

Möchten Sie jedem Auftrag eine magische Zahl zuordnen?
 
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! Es wäre sehr interessant zu verstehen, wie genau das funktioniert.

OrderOpenPrice - Eröffnungspreis der Order, derselbe (Preis) ist das Verhältnis einer Währung zu einer anderen

AccountMargin - gibt die Gesamtspanne des Kontos für alle offenen Aufträge an.

 
Vladimir Karputov:

Aufgeschoben:

Vasiliy Danilov, 2016.12.02 07:18

Können Sie mir bitte sagen, was ich tun soll? Ichhabe fasteinen einfachen Expert Advisor mit einem externen Indikatorgeschrieben, aber es gibt einen Haken.

Das Schließen der Hälfte des Loses funktioniert nicht korrekt, und der Auftrag wird bei jedem Tick geändert.

Hier ist der Block der Modifikation zu kaufen

if (CountBuy()>0) //In dieser Funktion wird die Anzahl der Kaufaufträge berechnet
{ 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); //Ändern Sie hier 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");

} } }


If SL != OrderStopLoss()) modify .... Dann wird der Auftrag nur geändert, wenn SL vom aktuellen OrderStopLoss abweicht.

Und um zu verstehen, was beim Schließen schief läuft, verwenden Sie GetLastError(); im Allgemeinen wäre es gut, OrderClose zu überprüfen ... bool testOrCls

testOrCls=OrderClose ......

if(!testOrCls) Print (GetLastError() );

d.h. wenn ein Fehler vorliegt, fragen wir nach dem Fehlercode; wenn kein Fehler vorliegt, fragen wir nicht nach dem Fehlercode.


 
bablusut:

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, schloss ich, dass die Parameter sein müssen:

intStringFind(

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

);

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

So funktioniert das aber gar nicht. Die Argumente dieser Funktion sind 1) die Zeichenfolge, die Sie suchen möchten; 2) die Zeichenkombination, die Sie finden möchten; 3) der Beginn der Suche (standardmäßig ab dem Nullzeichen der Zeichenfolge gemäß Schritt 1).

Sie gibt die Nummer der Position in der Zeichenkette zurück, an der die gesuchte Teilzeichenkette beginnt, oder -1, wenn keine Teilzeichenkette gefunden wird.

Mit anderen Worten: Schreiben Sie es so:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

Sie haben einen Fehler bei der Schließung der Hälfte der Partie, so dass sie nicht geändert werden kann. Bitte korrigieren Sie sie entsprechend meinem obigen Beitrag.

Wenn Sie dies nur einmal tun möchten, sollten Sie den Break-even-Wert um eine feste Anzahl von Punkten festlegen und die Bedingung der Gewinnmitnahmeprüfung hinzufügen, um zu sehen, ob er mit dieser Anzahl übereinstimmt

Und wenn eine solche Bedingung im Block zur Auftragsänderung durchlaufen wird, ist die Hälfte geschlossen.

Vasiliy Danilov:
Können Sie mir bitte sagen, was ich tun soll? Ich habe fasteinen einfachen Expert Advisor mit einem externen Indikatorgeschrieben, aber es gibt einen Haken.

Wenn der Block OrederClose enthält, wird die Hälfte der Partie sofort geschlossen und OrderModify funktioniert nicht weiter.

Wenn wir OrederClose entfernen, dann ä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 die Hälfte des Auftrags geschlossen werden, wenn der Kurs die MinMove-Marke erreicht, während die andere Hälfte einmal zum Breakeven geht?

Übrigens habe ich gerade bemerkt, dass OrderSelect nach Position SELECT_BY_POS, aber wo ist die Ticketauswahl?

OrderClose(OrderTicket()

 
Babu Bonappan:

Bitte beraten Sie, wie man MQL4 verwenden, um einen Margin-Wert für jede offene Position im Terminal zu erhalten?

Ich habe es immer so gemacht:

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

Beim Handel mit EUR/USD hat diese Konstruktion gut funktioniert, und ich war mir sicher, dass ihre Logik korrekt war.

Aber jetzt möchte ich das gleiche Ergebnis für EUR/JPY (oder EUR/CHF) erhalten. Offensichtlich muss ich anstelle vonOrderOpenPrice() den Wert eines Standard-Lots mit dem Kurs der Basiswährung zur Einzahlungswährung multiplizieren (in meinem Fall mit EUR/USD). Doch wie hoch ist dieser Satz? Der Wechselkurs, der zum Zeitpunkt der Positionseröffnung galt, oder der, den wir jetzt haben (zu dem Zeitpunkt, an dem wir den Betrag der Einlage für diese Position wissen wollen)?

Nein MODE_MARGINMAINTENANCE?

 
A1exPit:

Übrigens, ich habe gerade bemerkt, OrderSelect auf SELECT_BY_POS Position, aber wo ist die Auswahl Ticket?

OrderClose(OrderTicket()

Wissen Sie denn überhaupt nichts über dieses Thema?

Wenn die Bestellung ausgewählt ist, gibt OrderTicket() das Ticket der ausgewählten Bestellung zurück. Dabei spielt es keine Rolle, wie die Bestellung ausgewählt wird - nach Index oder nach Ticket.

Bei der Auswahl nach Ticket gibt es eine Besonderheit - der Pool wird nicht berücksichtigt, und wir müssen prüfen, aus welcher Liste die Bestellung ausgewählt wurde, indem wir den Zeitpunkt ihres Abschlusses prüfen.

 
Vasiliy Danilov:
Könnten Sie mir bitte einige Hinweise geben, wie ich das verstehen kann? Ich habe fastein einfaches Expert Advisor mit einem externen Indikatorgeschrieben, aber ich habe auf ein Problem gestoßen.

Wenn ein OrederClose im Block vorhanden ist, 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 Änderungsblock für den Kauf

   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 des Auftrags schließen, wenn der Kurs das MinMove-Niveau erreicht, und die andere Hälfte, wenn der Kurs den Breakeven erreicht?

Bei teilweiser Schließung ändert sich das Ticket. Erst den Break-even erreichen, dann den Abschluss.

Entweder Sie ändern die Logik.

 
Artyom Trishkin:

A1exPit:

Übrigens ist mir gerade OrderSelect by SELECT_BY_POS aufgefallen, aber wo ist das Auswahlticket?

OrderClose(OrderTicket()

Wissen Sie denn überhaupt nichts über diesen Thread?

Wenn eine Bestellung ausgewählt ist, gibt OrderTicket() das Ticket der ausgewählten Bestellung zurück. Dabei spielt es keine Rolle, wie die Bestellung ausgewählt wird - nach Index oder nach Ticket.

Bei der Auswahl nach Ticket gibt es eine Nuance - der Pool wird nicht berücksichtigt, und Sie müssen überprüfen, aus welcher Liste der Auftrag ausgewählt wurde, indem Sie den Zeitpunkt des Abschlusses überprüfen.

Und wenn wir uns den Code ansehen, zu dem dieser Kommentar geschrieben wurde? Dort ist es nicht so einfach...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

Und wenn Sie sich den Code ansehen, zu dem dieser Kommentar geschrieben wurde? Da ist es nicht so eindeutig...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
Na ja... Ja... Ich habe nicht genau hingesehen. Nur ein kleiner Einblick. Aus irgendeinem Grund bin ich an diesem Thema nicht interessiert
Grund der Beschwerde: