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)
-   -   Handelssignal zu einer bestimmten Uhrzeit (http://www.expert-advisor.com/forum/showthread.php?t=3753)

Selfinvest 09.07.14 18:12

Handelssignal zu einer bestimmten Uhrzeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Bräuchte mal Hilfe von einem/einer "Fachmann/Fachfrau"...

Ich habe mir über das Internet mal die Grundkenntnisse für eine einfache MQL4 angeeignet.
Leider bin ich nicht dahinter gekommen wie ich ein Signal zu einer (mehreren) bestimmten Uhrzeit(en) programmieren kann.
Es soll z.B. um 05:13 und/oder 9:22 und/oder 14:47 usw. eine Long und eine Short Position eröffnet werden.
Ich poste hier mal meine bisherige Arbeit. Würde mich sehr über kompetente Hilfe freuen.

traderdoc 09.07.14 18:56

Code:


string Time1 = "18:00";

if(NeuePeriodeBegonnen == true)
{
  LongSignal = false;
  if(TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time1))
                  //TimeCurrent() für die Serverzeit des Brokers oder TimeLocal(), wenn die PC-Zeit benutzt werden soll
                  // Zeitpunkt ist erfüllt (alle Zeitpunkte sollen oben als Variable stehen...
                  // beliebig viele Zeitpunkte sollen möglich sein...)
                  // Bsp.: 07:24 und 10:13 und 14:47 und und und
  {
      LongSignal = true;
  }
           
}

usw.

traderdoc

Selfinvest 09.07.14 20:18

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo traderdoc!

Danke für die schnelle Antwort. Ich habe das jetzt mal soweit eingebaut.
Bei dem Code den du mir gepostet hast verstehe ich das " LongSignal = false; " in der 5ten Zeile nicht. Ich habe das weggelassen. Brauche ich das da?

Wenn ich mehrere Zeiten eintrage (Time1 und Time2 habe ich oben mal als Variable drin), wie muss ich das Time2 dann unten einbauen? Den ganzen Block für Time2, Time3, ... dann reinkopieren?

2 Fehlermeldungen bekomme ich noch beim Kompilieren (Zeile 78 und 92).

Kannst du mir da auch noch Tipps geben?

Danke im Voraus!

traderdoc 09.07.14 20:52

Code:

//+------------------------------------------------------------------+
//|                                                      Test001.mq4 |
//|                                                              abc |
//|                                                          http:// |
//+------------------------------------------------------------------+

#property copyright "abc"
#property link      "http://"
#property version  "1.00"
#property strict

//--- Externe Variablen (vom Nutzer einstellbar)

extern double  Lots = 0.01;
extern double  SL_in_Pips_bzw_Punkten = 100;
extern double  TP_in_Pips_bzw_Punkten = 100;
extern int    MagicNumber = 12345;


//--- Interne Variablen (nicht vom Nutzer einstellbar)

datetime PeriodenStartZeit;
bool    NeuePeriodeBegonnen;
bool    LongSignal;
bool    ShortSignal;
bool    Time1Flag, Time2Flag;
int      LongOrder;
int      ShortOrder;
string  Time1 = "18:53", Time2 = "19:27";


//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
      PeriodenStartZeit = Time[0];
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert Deinitialisierungsfunktion                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 
  }
//+------------------------------------------------------------------+
//| Expert Tick-Funktion                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Überprüfung, ob neuer Periodenbeginn vorliegt

  if(PeriodenStartZeit != Time[0])
      {
        NeuePeriodeBegonnen = true;
        PeriodenStartZeit = Time[0];
      }
  else NeuePeriodeBegonnen = false;


//--- Handelssignale ermitteln

  //--- Long Signal ermitteln
      if(NeuePeriodeBegonnen == true)
        {
              LongSignal = false;
              if(!Time1Flag && TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time1))
              {
                  LongSignal = true;
                  Time1Flag = true;
              }
              if(!Time2Flag && TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time2))
              {
                  LongSignal = true;
                  Time2Flag = true;
              }
          }
       
  //--- Short Signal ermitteln
      if(NeuePeriodeBegonnen == true)
        {
              ShortSignal = false;
              if(TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time1))
              {
                  ShortSignal = true;
              }
          }

//--- Handelssignale umsetzen

  //--- Long Signal umsetzen
      if(LongSignal == true)
        {
            while(LongOrder<=0)
              {
                  LongOrder = OrderSend(Symbol(),OP_BUY,Lots,Ask,50,SL_in_Pips_bzw_Punkten,TP_in_Pips_bzw_Punkten,"Test001",MagicNumber,0,Green);
              }
        }
       
  //--- Short Signal umsetzen
      if(ShortSignal == true)
        {
            while(ShortOrder<=0)
              {
                  ShortOrder = OrderSend(Symbol(),OP_SELL,Lots,Bid,50,SL_in_Pips_bzw_Punkten,TP_in_Pips_bzw_Punkten,"Test001",MagicNumber,0,Red);
              }
        }
  }
//+------------------------------------------------------------------+

Das Time1Flag verhindert, dass die Order bei Erreichen der Zeit mit jeder neuen Kerze wieder geöffnet wird.
Das LongSignal = false; braucht nur einmal gesetzt werden. Entweder die Zeit wurde erreicht, dann wird LongSignal = true; gesetzt, ansonsten bleibt die Variable false! (Verkürzung des Codes!)
Entsprechend für Sell noch coden.

traderdoc

Selfinvest 09.07.14 23:12

Liste der Anhänge anzeigen (Anzahl: 1)
Fertig! Keine Fehlermeldung mehr, danke!

Leider klappt es beim Strategietester irgendwie nicht. Die erste Kerze, egal ob M1, M5, M15, usw. schafft der Tester, dann bleibt er hängen...
Es wird auch bei H1 kein Trade ausgeführt...

Siehst du vielleicht auf den ersten Blick warum der EA nicht funktioniert?

traderdoc 10.07.14 00:46

LongOrder = OrderSend(Symbol(),OP_BUY,Lots,Ask,50,SL_in_Pips_bzw_Punkten,TP_in_Pips_bzw_Punkten,"Test001",MagicNumber,0,Green);

Da müssen die Kurse der realen SL- und TP-Werte stehen.

traderdoc

Selfinvest 10.07.14 08:15

Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe nun Variablen für SL und TP eingefügt.
Fehlermeldung gibt es keine.

Beim Strategietester läuft immer noch nur die erste Kerze durch, bevor der EA hängen bleibt.
Order wird um 8:23 auch keine platziert im H1-Durchlauf.

Als mql4-Anfänger habe ich leider keine Ahnung wo ich da Fehler mache.
Würdest du mir vielleicht noch weiter helfen, bis das Ding läuft?

Der EA soll ja immer zur Uhrzeit "x" eine Long- und eine Short-Order aufgeben.
Es sollen beliebig viele Uhrzeiten vorgegeben werden können.
Die Anzahl der offenen Trades soll nicht beschränkt sein, aber z.B. am Dienstag um 13:47 soll nur 1 Long- und 1 Short-Trade geöffnet werden.

traderdoc 10.07.14 09:18

Nein, in die Funktion
LongOrder = OrderSend(Symbol(),OP_BUY,Lots,Ask,50,SL_Long,TP_L ong,"Test001",MagicNumber,0,Green);
muß nach Ask, der Kurswert des StopLoss rein, also wenn die Order bei 1,2345 geöffnet werden soll, dann liegt der StopLoss bei 1,2295 und der TP z.B. bei 1,2395, d.h. in diese Funktion gehören keine Pipwerte von SL und TP rein, sondern, die Kurswerte!

Ansonsten meine Empfehlung, das Handbuch bitte nehmen, auch gern die Online-Hilfe des MT4 und unter den Funktionen nachschauen.

traderdoc

fxdaytrader 10.07.14 09:41

Hm, wenn ich mir das so betrachte:

Code:

extern int    SL_in_Pips_bzw_Punkten = 100;
extern int    TP_in_Pips_bzw_Punkten = 100;
(...)
double  Long = Ask;
double  Short = Bid;
double  SL_Long = Long - SL_in_Pips_bzw_Punkten;
double  SL_Short = Short + SL_in_Pips_bzw_Punkten;
double  TP_Long = Long + TP_in_Pips_bzw_Punkten;
double  TP_Short = Short - TP_in_Pips_bzw_Punkten;

dann denke ich das kann auch nicht funktionieren, unabhängig von etwaigen anderen Fehlern.

Die Werte für bid/ask und den daraus resultierenden SL/TP-Preisen ändern sich doch ständig, da macht es überhaupt keinen Sinn diese nur einmal beim start des EA zu aktualisieren. Das sollte sinnigerweise erst vor dem ordersend-command geschehen.

pako 10.07.14 15:58

Zitat:

Zitat von traderdoc (Beitrag 26710)
Code:

//+------------------------------------------------------------------+
//|                                                      Test001.mq4 |
//|                                                              abc |
//|                                                          http:// |
//+------------------------------------------------------------------+

#property copyright "abc"
#property link      "http://"
#property version  "1.00"
#property strict

//--- Externe Variablen (vom Nutzer einstellbar)

extern double  Lots = 0.01;
extern double  SL_in_Pips_bzw_Punkten = 100;
extern double  TP_in_Pips_bzw_Punkten = 100;
extern int    MagicNumber = 12345;


//--- Interne Variablen (nicht vom Nutzer einstellbar)

datetime PeriodenStartZeit;
bool    NeuePeriodeBegonnen;
bool    LongSignal;
bool    ShortSignal;
bool    Time1Flag, Time2Flag;
int      LongOrder;
int      ShortOrder;
string  Time1 = "18:53", Time2 = "19:27";


//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
      PeriodenStartZeit = Time[0];
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert Deinitialisierungsfunktion                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 
  }
//+------------------------------------------------------------------+
//| Expert Tick-Funktion                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Überprüfung, ob neuer Periodenbeginn vorliegt

  if(PeriodenStartZeit != Time[0])
      {
        NeuePeriodeBegonnen = true;
        PeriodenStartZeit = Time[0];
      }
  else NeuePeriodeBegonnen = false;


//--- Handelssignale ermitteln

  //--- Long Signal ermitteln
      if(NeuePeriodeBegonnen == true)
        {
              LongSignal = false;
              if(!Time1Flag && TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time1))
              {
                  LongSignal = true;
                  Time1Flag = true;  /// und für false EA neu  starten ?????
              }
              if(!Time2Flag && TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time2))
              {
                  LongSignal = true;
                  Time2Flag = true;  /// und für false EA neu  starten ?????
              }
          }
       
  //--- Short Signal ermitteln
      if(NeuePeriodeBegonnen == true)
        {
              ShortSignal = false;
              if(TimeCurrent() >= StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + Time1))
              {
                  ShortSignal = true;
              }
          }

//--- Handelssignale umsetzen

  //--- Long Signal umsetzen
      if(LongSignal == true)
        {
            while(LongOrder<=0)
              {
                  LongOrder = OrderSend(Symbol(),OP_BUY,Lots,Ask,50,SL_in_Pips_bzw_Punkten,TP_in_Pips_bzw_Punkten,"Test001",MagicNumber,0,Green);
              }
        }
       
  //--- Short Signal umsetzen
      if(ShortSignal == true)
        {
            while(ShortOrder<=0)
              {
                  ShortOrder = OrderSend(Symbol(),OP_SELL,Lots,Bid,50,SL_in_Pips_bzw_Punkten,TP_in_Pips_bzw_Punkten,"Test001",MagicNumber,0,Red);
              }
        }
  }
//+------------------------------------------------------------------+

Das Time1Flag verhindert, dass die Order bei Erreichen der Zeit mit jeder neuen Kerze wieder geöffnet wird.
Das LongSignal = false; braucht nur einmal gesetzt werden. Entweder die Zeit wurde erreicht, dann wird LongSignal = true; gesetzt, ansonsten bleibt die Variable false! (Verkürzung des Codes!)
Entsprechend für Sell noch coden.

traderdoc

und für das nächste "Time1Flag=false;" EA neu starten ????? :eek::confused:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 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