Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Problem mit SL-Setzung bei JPY-Paaren (http://www.expert-advisor.com/forum/showthread.php?t=6529)

Bucardo 04.11.19 10:45

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:

//+------------------------------------------------------------------+
//|                                                Overwatch_0.1.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "XX"
#property link      ""
#property version  "0.4"
#property strict



//+------------------------------------------------------------------+
//| Variablendefinitionen                                            |
//+------------------------------------------------------------------+
datetime LastActiontime;                  //Variable für Once-Per-Bar-Aktion
int x ;                                  //Platzhalter für OrderSend
double StopSumme = 0;                    //Variable für StopSumme
static bool flag_notification = false;    //flag für Bericht


//+------------------------------------------------------------------+
//| Unterprogramme                                                  |
//+------------------------------------------------------------------+
  void Testorders()
  {
    x=OrderSend(Symbol(),OP_BUY,0.01,Ask,500*Point,0,0,"",0);
    x=OrderSend(Symbol(),OP_SELL,0.01,Bid,500*Point,0,0,"",0);
  }
 
  void StopAddition()
  {
    if(Hour() == 17 && flag_notification == false)
    {
    for(int i=0;i<OrdersTotal();i++)
    {
    x=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if(OrderType() == OP_BUY)
    {
      StopSumme = StopSumme + ((OrderOpenPrice() - OrderStopLoss()) /Point /10);
    }
    if(OrderType() == OP_SELL)
    {
      StopSumme = StopSumme + ((OrderStopLoss() - OrderOpenPrice()) /Point /10);
    }
    }
    SendNotification("Gesamtrisiko: "+NormalizeDouble(StopSumme,3)+" Pips / " + OrdersTotal() + " offene Orders");
    Print("Gesamtrisiko: " + NormalizeDouble(StopSumme,3) + " Pips / " + OrdersTotal() + " offene Orders");
    StopSumme = 0;
    flag_notification = true;
    }
    if(Hour() == 22)     
    {
    flag_notification = false;
    }
  }

  void AutoSL()
  {
    for(int j=0;j<OrdersTotal();j++)
    {
    x=OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
    if(OrderType() == OP_BUY && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 500 * Point,OrderTakeProfit(),0,0);
    }
    if(OrderType() == OP_SELL && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 500 * Point,OrderTakeProfit(),0,0);
    }
    }
  }
 
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   
  if(LastActiontime!=Time[0])
  {
    //Code to execute once in the bar START
   
    //Testorders();
   
    AutoSL(); //AutoStoploss
 
    StopAddition(); //StopAddition
   
    //Code to execute once in the bar ENDE
    LastActiontime=Time[0];
  } 
  }
//+------------------------------------------------------------------+

Danke für eure Hilfe!

MA-EA 04.11.19 14:59

Das einfachste dürfte NormalizeDouble sein.

https://docs.mql4.com/convert/normalizedouble

Code:

//SLs auf 0 stellen, wenn oben = 0,
//um irgendwelche Missverständnisse zu vermeiden.
if(Stop_Loss==0){
  Buy_SL=0.0;
  Sel_SL=0.0;}

//Market Order SLs
//einfacher Buy SL, der bei Open Buy gesendet werden soll.
else{
Buy_SL=NormalizeDouble(Ask-Stop_Loss*_Point,_Digits);

//einfacher Sell SL, der bei Open Sell gesendet werden soll.
Sel_SL=NormalizeDouble(Bid+Stop_Loss*_Point,_Digits);}


traderdoc 04.11.19 15:24

[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

Bucardo 04.11.19 19:24

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()
  {
    for(int j=0;j<OrdersTotal();j++)
    {
    x=OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
    if(OrderType() == OP_BUY && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 500 * MarketInfo(Symbol(),MODE_POINT),OrderTakeProfit(),0,0);
    }
   
    if(OrderType() == OP_SELL && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 500 * MarketInfo(Symbol(),MODE_POINT),OrderTakeProfit(),0,0);
    }
    }
  }

Wenn ich z.B. einen USD/JPY Trade ohne SL eröffne, und z.B. den AUD/JPY Chart offen habe, funktioneirt alles wunderbar. Sobald ich aber den EUR/USD CHart offen habe, setzt er statt 50 Pips nur noch einen 5 Pips SL. Das alte problem also :/

Hoffe auf eure Hilfe :) (Will nämlcih nicht alle 28 WP-Charts öffnen müssen, um das Problem zu umgehen ;))

traderdoc 04.11.19 20:25

Zitat:

Zitat von Bucardo (Beitrag 42998)
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()
  {
    for(int j=0;j<OrdersTotal();j++)
    {
    x=OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
    if(OrderType() == OP_BUY && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 500 * MarketInfo(Symbol(),MODE_POINT),OrderTakeProfit(),0,0);
    }
   
    if(OrderType() == OP_SELL && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 500 * MarketInfo(Symbol(),MODE_POINT),OrderTakeProfit(),0,0);
    }
    }
  }

Wenn ich z.B. einen USD/JPY Trade ohne SL eröffne, und z.B. den AUD/JPY Chart offen habe, funktioneirt alles wunderbar. Sobald ich aber den EUR/USD CHart offen habe, setzt er statt 50 Pips nur noch einen 5 Pips SL. Das alte problem also :/

Hoffe auf eure Hilfe :) (Will nämlcih nicht alle 28 WP-Charts öffnen müssen, um das Problem zu umgehen ;))

Na ja, Du muss dann schon bei
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

MA-EA 04.11.19 21:10

Wie wärs, bei OrderSelect auch zu prüfen, ob
Code:

OrderSymbol() == Symbol()
ist? Das Problem hat anscheinend nix mit Points oder Digits zu tun, sondern mit der Auswahl des WPs.

traderdoc 04.11.19 21:17

Zitat:

Zitat von MA-EA (Beitrag 43000)
Wie wärs, bei OrderSelect auch zu prüfen, ob
Code:

OrderSymbol() == Symbol()
ist? Das Problem hat anscheinend nix mit Points oder Digits zu tun, sondern mit der Auswahl des WPs.

@MA-EA, nun hast Du doch schon so viel selber programmiert und nun das hier.
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

RetepM 05.11.19 09:22

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);
}


+++++++++++++++++++++++++++++++++

traderdoc 05.11.19 15:13

Zitat:

Zitat von RetepM (Beitrag 43002)
Hi, hier funktionierender EA-Code, den mein Framework erzeugt. Achtung der EA setzt Pending Orders, nur Demo oder AutoTrading false!

Sorry, aber auch dieser Code wird ihn nicht an sein Ziel führen, weil auch hier nur die Variablen des jeweiligen WP des Charts benutzt werden, auf dem sich der EA befindet. D.h. liegt der EA auf einem EURUSD-Chart wird er auch nur die WPe richtig behandeln, die dem 4-Digit-Format entsprechen, aber nicht dem 5-Digit-Format bzw. umgekehrt, wenn der EA auf einem WP im 5-Digit-Format liegen sollte.

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

MA-EA 05.11.19 15:39

Zitat:

Zitat von Bucardo (Beitrag 42995)
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?

Das Problem ist wohl, dass ich das ganze Problem nicht verstehe. :rolleyes: Warum schickst Du nicht gleich nen SL beim Öffnen mit raus? :confused:

traderdoc 05.11.19 16:17

Zitat:

Zitat von MA-EA (Beitrag 43005)
Das Problem ist wohl, dass ich das ganze Problem nicht verstehe. :rolleyes: Warum schickst Du nicht gleich nen SL beim Öffnen mit raus? :confused:

Korrekt, @MA-EA, das ist Dein Problem, obwohl es eigentlich gar keins ist.
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

Bayreuther 05.11.19 22:10

Ein Beispiel für Modify_SL_TP_ALL_Symbol.mq4 ist hier zu finden:
https://www.mql5.com/de/code/18011

Bucardo 06.11.19 21:59

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()
  {
    for(int j=0;j<OrdersTotal();j++)
    {
    x=OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
    if(OrderType() == OP_BUY && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 600 * MarketInfo(OrderSymbol(),MODE_POINT),OrderTakeProfit(),0,0);
    }
   
    if(OrderType() == OP_SELL && OrderStopLoss() == 0)
    {
      x=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 600 * MarketInfo(OrderSymbol(),MODE_POINT),OrderTakeProfit(),0,0);
    }
    }
  }

Für Vorschläge hinsichtlich Failsafe-Programmierung oder eleganter Lösungen bin ich immer offen. Das ist meine Lösung als MQL-Autodidakt ;)

Gruß

traderdoc 06.11.19 22:57

Jepp, so einfach kann die Lösung sein.

traderdoc

MA-EA 07.11.19 03:15

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