Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4331
Beiträge: 39811
Benutzer: 6.660
Aktive Benutzer: 206
Links: 80
Wir begrüßen unseren neuesten Benutzer: amin233
Mit 1.311 Benutzern waren die meisten Benutzer gleichzeitig online (16.09.19 um 01:18).
Neue Benutzer:
vor 3 Tagen
- amin233
vor 3 Tagen
- foo
vor 4 Tagen
- ecollabora...
vor 6 Tagen
- karakar
vor 6 Tagen
- exesor

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 186
Gesamt: 187
Team: 0
Team:  
Benutzer:  traderdoc
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard 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!
Mit Zitat antworten
  #2 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 812
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

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);}
Mit Zitat antworten
  #3 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.249
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

[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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard

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 )
Mit Zitat antworten
  #5 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.249
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Bucardo Beitrag anzeigen
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #6 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 812
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.249
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von MA-EA Beitrag anzeigen
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #8 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 180
RetepM befindet sich auf einem aufstrebenden Ast
Standard

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


+++++++++++++++++++++++++++++++++
Mit Zitat antworten
  #9 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.249
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von RetepM Beitrag anzeigen
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #10 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 812
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Bucardo Beitrag anzeigen
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. Warum schickst Du nicht gleich nen SL beim Öffnen mit raus?
Mit Zitat antworten
Antwort

Lesezeichen


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 08:52 Uhr.


Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2019 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------