Problem mit SL-Setzung bei JPY-Paaren
Hallo zusammen,
ich habe einen relativ simplen EA geschrieben, der meine aktuellen Trades mit einem automatischen Stop versieht, falls noch kein SL festgelegt wurde. Soweit so gut. Mein Problem ist, dass ich falsche Stops erhalte, wenn ich z.B. den CHart EUR/USD geöffnet habe, der Trade aber im USD/JPY eröffnet wurde. Das Problem sind die unterschiedlichen Digits. Aber wie löse ich die SL-Setzung vom aktuell geöffneten Chart ab? So dass der EA automatisch erkennt, ob es 2 oder 4 Nachkommastellen sind? S. AutoSL-Funktion() Code:
//+------------------------------------------------------------------+ |
Das einfachste dürfte NormalizeDouble sein.
https://docs.mql4.com/convert/normalizedouble Code:
//SLs auf 0 stellen, wenn oben = 0, |
[QUOTE=MA-EA;42996]Das einfachste dürfte NormalizeDouble sein.
https://docs.mql4.com/convert/normalizedouble Nein, das ist weder die einfachste noch überhaupt eine Lösung. Wenn aus einem EA in einem Chart heraus mit einem WP und einem Digit von 4 (EURUSD) ein WP mit einem Digit von 5 (USDJPY) angesprochen werden soll, dann darf da nicht Point oder Digits benutzt werden, weil die sich auf das WP beziehen, wo der EA gerade läuft (EURUSD), sondern dann muss auch das Point und Digit benutzt werden des entsprechend zu bearbeitenden WP (USDJPY). Und dazu müssen die Funktionen des MarketInfo() benutzt werden. traderdoc |
Das hätte ich auch vermutet, dass das Hauptproblem darin liegt die POINTS des Symbols des WP zu nutzen, obwohl ein anderes WP geöffnet ist.
Habe den Code wie folgt geändert, leider ohne Erfolg... Code:
void AutoSL() Hoffe auf eure Hilfe :) (Will nämlcih nicht alle 28 WP-Charts öffnen müssen, um das Problem zu umgehen ;)) |
Zitat:
MarketInfo(Symbol(),MODE_POINT) für das Symbol() (welches das Symbol des Charts darstellt) natürlich das Symbol des zu ändernden WP einsetzen. Dazu muss vorher das WP des Trades ermittelt werden und dann wird das statt Symbol() eingesetzt in " " geschrieben. traderdoc |
Wie wärs, bei OrderSelect auch zu prüfen, ob
Code:
OrderSymbol() == Symbol() |
Zitat:
Tz. tz! Erstens habe ich das gerade geschrieben, dass er die WP prüfen muss aber nicht wie bei Dir, sondern string symbol = OrderSymbol(); und dann wird das symbol in MarketInfo eingesetzt. Und zweitens, wenn Du der Meinung bist, dass das nix mit Points oder Digits zu tun hast, dann brauchst Du Dich auch nicht über Deine nichtlaufenden EAs wundern. traderdoc |
Hi, hier funktionierender EA-Code, den mein Framework erzeugt. Achtung der EA setzt Pending Orders, nur Demo oder AutoTrading false!
+++++++++++++++++++++++++++++++++ #include <stdlib.mqh> #include <WinUser32.mqh> //------------------------------------------------ extern double LotSize = 0.1; extern int SLSize = 20; extern int TPSize = 30; extern int PriceOffset = 20; double PipValue=1; // this variable is here to support 5-digit brokers bool Terminated = false; string LF = "\n"; // use this in custom or utility blocks where you need line feeds int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names //------------------------------------------------ int init() { if (false) ObjectsDeleteAll(); // clear the chart Comment(""); // clear the chart return (0); } //------------------------------------------------ // Expert start int start() { if (Bars < 10) { Comment("Not enough bars"); return (0); } if (Terminated == true) { Comment("EA Terminated."); return (0); } OnEveryTick(); return (0); } //------------------------------------------------ void OnEveryTick() { PipValue = 1; if (Digits == 3 || Digits == 5) PipValue = 10; PrintFunctionsToChart(); IfNoOrderExist(); } //------------------------------------------------ void PrintFunctionsToChart() { string temp = "Show Points And Digits:\n"; temp = temp + "Points; " + DoubleToStr(Point, Digits) + "\n" + "Digits: " + DoubleToStr(Digits, 0) + "\n" + "------------------------------------------------\n"; Comment(temp); } //------------------------------------------------ void IfNoOrderExist() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists == false) { BuyPendingOrder(); SellPendingOrder(); } } //------------------------------------------------ void BuyPendingOrder() { int expire = TimeCurrent() + 60 * 0; double price = NormalizeDouble(Ask, Digits) + PriceOffset*PipValue*Point; double SL = price - SLSize*PipValue*Point; if (SLSize == 0) SL = 0; double TP = price + TPSize*PipValue*Point; if (TPSize == 0) TP = 0; if (0 == 0) expire = 0; int ticket = OrderSend(Symbol(), OP_BUYSTOP, LotSize, price, 4, SL, TP, "Test Digits", 100, expire, Blue); if (ticket == -1) { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } //------------------------------------------------ void SellPendingOrder() { int expire = TimeCurrent() + 60 * 60; double price = NormalizeDouble(Bid, Digits) - PriceOffset*PipValue*Point; double SL = price + SLSize*PipValue*Point; if (SLSize == 0) SL = 0; double TP = price - TPSize*PipValue*Point; if (TPSize == 0) TP = 0; if (60 == 0) expire = 0; int ticket = OrderSend(Symbol(), OP_SELLSTOP, LotSize, price, 4, SL, TP, "Test Digits", 100, expire, Red); if (ticket == -1) { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } //------------------------------------------------ int deinit() { if (false) ObjectsDeleteAll(); return (0); } +++++++++++++++++++++++++++++++++ |
Zitat:
Deshalb nochmal: Er muss nach OrderSelect() das WP auslesen und das Ergebnis der Funktion MarketInfo() übergeben, damit z.B. die Variable Point richtig berechnet wird und damit auch der SL und TP. Sonst wird das nix! traderdoc |
Zitat:
|
Zitat:
Er will ganz einfach von einem!!! EA auf einem Chart eines WP bzgl. der Änderung von SL (und TP) auf die Orders der anderen WP zufreifen. Nicht mehr, aber auch nicht weniger. traderdoc |
Ein Beispiel für Modify_SL_TP_ALL_Symbol.mq4 ist hier zu finden:
https://www.mql5.com/de/code/18011 |
Hallo zusammen,
war die letzten Tage sehr beschäftigt, deshalb die verspätete Antwort. Vielen Dank an TraderDoc für den zur Lösung führenden Hinweis! Ziel des EA ist es, eine vom Handy aus abgesetzte Order mit einer Art Sicherheits-STop zu versehen, falls nicht innerhalb von 5 Minuten ein manueller Stop eingegeben wird. Das Netz hier ist eine Katastrophe, so dass es sein kann, dass ein Trade noch raus geht, ich den SL aber nicht mehr setzen kann. Deswegen läuft der EA auf einem EUR/USD-Chart (M5) auf meinem virtuellen Server mit und setzet notfalls einen STop bei 60 Pips. Hier meine Lösung die auch funktioniert: Code:
void AutoSL() Gruß |
Jepp, so einfach kann die Lösung sein.
traderdoc |
Ich würde eben auch OrderSymbol()==Symbol() checken und nen Trailing- oder wenigstens nen Break-Even Stop einbaun. Wenn man eh schon nen VPS benutzt.
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 12:33 Uhr. |
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum