Zeit basierte Pending Orders für MT4

Martin Steffens  

Hallo zusammen, nachdem ich nun schon länger das Internet nach einem bestimmten Script oder EA vergeblich durchsucht habe

wollte ich mal hier im Forum fragen, ob jemand einen Tipp hat.

Ich würde gerne zu einem bestimmten Zeitpunkt also z.B. t =  2021.04.08 23:00 Uhr eine Pending Order erstellen.

Das kann ich natürlich auch manuell tun. Da ich aber zu den bestimmte Zeitpunkten nicht immer am Rechner bin suche ich nach einem Script, was dies automatisiert tut.

Also grob gesagt müsste das Script zu dem bestreffenden Zeitpunkt den aktuellen Preis ermitteln und dann davon abhängig die Pending Order plazieren, d.h. ich gebe nur den Zeitpunkt,

die Distanz vom Preis, SL, TP, und Lot Größe ein.

Würde mich sehr freuen, wenn mir da jemand weiterhelfen kann.

Grüße,

Martin

amando  
Also entweder du suchst mal in der codebase, die englische ist größer, oder du beauftragst einen freelancer
Martin Steffens  

Hallo amando, danke für den Tipp. In der codebase habe ich leider nichts gefunden. Es gibt wohl etwas für MT5, was ich aber nicht genau beurteilen kann, da ich halt mit MT4 arbeite.

Die Beauftragung eines Freelancers müsste ich mir echt mal überlegen. Ich bin aber doch sehr erstaunt, dass es zu dem Thema absolut nichts gibt.

Carl Schreiber  

Warum MT4, wenn Du es bereits für MT5 gefunden hast?

Martin Steffens  
Carl Schreiber:

Warum MT4, wenn Du es bereits für MT5 gefunden hast?

Hallo Carl, ich habe 2 Real-Handelskonten, die beide an MT4 gebunden sind. Mit MT5 habe ich keine Erfahrung.

Für die Zukunft werde ich mich sicherlich auch mit MT5 befassen. Es gibt wohl auch andere Tradingplattformen, die

grundsätzlich zeitgesteuerte Orders unterstützen. Ich stelle mir einfach die Frage, ob dies auch mit dem mir vertrauten MT4 möglich ist und ich nicht gezwungen bin, die Tradingplatform zu wechseln!?

Carl Schreiber  
Martin Steffens:

Hallo Carl, ich habe 2 Real-Handelskonten, die beide an MT4 gebunden sind. Mit MT5 habe ich keine Erfahrung.

Für die Zukunft werde ich mich sicherlich auch mit MT5 befassen. Es gibt wohl auch andere Tradingplattformen, die

grundsätzlich zeitgesteuerte Orders unterstützen. Ich stelle mir einfach die Frage, ob dies auch mit dem mir vertrauten MT4 möglich ist und ich nicht gezwungen bin, die Tradingplatform zu wechseln!?

Geht schon. Beginne mal im Editor Neu => Expert Advisor (Vorlage)
Martin Steffens  
Carl Schreiber:
Geht schon. Beginne mal im Editor Neu => Expert Advisor (Vorlage)

Ok, kann ich mal versuchen. Habe allerdings zuvor noch nie ein MQL4 Script geschrieben. Komme aber ursprünglich aus der Softwareentwicklung.

Mal schauen, wie aufwendig das ist ...

Carl Schreiber  
Martin Steffens:

Ok, kann ich mal versuchen. Habe allerdings zuvor noch nie ein MQL4 Script geschrieben. Komme aber ursprünglich aus der Softwareentwicklung.

Mal schauen, wie aufwendig das ist ...

Auf Deinem PC gibt es einen EA, der SL und TP berechnet: ..\Experts\Examples\..

Und hier ist ein Artikel über die Zeit: https://www.mql5.com/de/articles/599

Und bedenke, es gibt fast nichts, was nicht auch für MT4/MT5 programmiert wurde.

AAABER die Zeitorientierung von MQ4 und MQ5 sind entgegengesetzt!
Programmierungsgrundlagen für MQL5 Zeit
Programmierungsgrundlagen für MQL5 Zeit
  • www.mql5.com
Dieser Beitrag konzentriert sich auf Standard MQL5-Funktionen zur Arbeitsweise mit Zeit sowie Programmiertechniken und praktisch sinnvolle Funktionen zur Arbeitsweise mit Zeit, die für die Erzeugung von Expert Advisors und Indikatoren erforderlich sind. Besondere Aufmerksamkeit wird auf die allgemeine Theorie der Zeitmessung gelegt. Dieser Beitrag sollte vor allem für Anfänger unter den MQL5-Programmierern von großem Interesse sein.
Igor Widiger  
Martin Steffens:

Hallo zusammen, nachdem ich nun schon länger das Internet nach einem bestimmten Script oder EA vergeblich durchsucht habe

wollte ich mal hier im Forum fragen, ob jemand einen Tipp hat.

Ich würde gerne zu einem bestimmten Zeitpunkt also z.B. t =  2021.04.08 23:00 Uhr eine Pending Order erstellen.

Das kann ich natürlich auch manuell tun. Da ich aber zu den bestimmte Zeitpunkten nicht immer am Rechner bin suche ich nach einem Script, was dies automatisiert tut.

Also grob gesagt müsste das Script zu dem bestreffenden Zeitpunkt den aktuellen Preis ermitteln und dann davon abhängig die Pending Order plazieren, d.h. ich gebe nur den Zeitpunkt,

die Distanz vom Preis, SL, TP, und Lot Größe ein.

Würde mich sehr freuen, wenn mir da jemand weiterhelfen kann.

Grüße,

Martin

Hallo,

hier ist der Code.


input ulong            Magic  = 12345;             // Magicnumber
input double             Lots = 0.10;              // Lots
int input          StopLoss   = 50;                // SL Points
int input        TakeProfit   = 250;               // TP Points

input string      Trade_start = "23:00";           // Trading start period
input int     TimeBeforeStart = 5;                 // Sekunden vor Trading beginn!

#include <Trade/Trade.mqh>
CTrade m_trade;

int OnInit() {
if(!m_symbol.Name(_Symbol)) // sets symbol name
      return(INIT_FAILED);
 m_trade.SetExpertMagicNumber(Magic);
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);

      return(INIT_FAILED);

}


void OnTick{

 // Place pending orders
   int buy_stop_total = 0;
   int sell_stop_total = 0;
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      ulong ticket = OrderGetTicket(i);
      if(!OrderSelect(ticket))continue;
      ulong magic = OrderGetInteger(ORDER_MAGIC);
      if(magic != Magic)continue;
      string symbol = OrderGetString(ORDER_SYMBOL);
      if(symbol != _Symbol)continue;
      ENUM_ORDER_TYPE order_type = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
      if(order_type == ORDER_TYPE_BUY_STOP || order_type == ORDER_TYPE_SELL_STOP) {
         buy_stop_total++;
         sell_stop_total++;
      }
   }

   // Time before start in seconds!
   datetime  localtime = TimeCurrent();
   datetime zeitanfang = StringToTime(Trade_start);
   datetime zeitresult = (zeitanfang-(1*TimeBeforeStart));

   if(localtime>=zeitresult && (localtime<zeitanfang)) {
      if(buy_stop_total == 0 && sell_stop_total == 0) {
         OrderBuyStop();
         OrderSellStop();
      }
      return;
   }


}

// Order Sell Stop Funktion
void OrderSellStop() {

   string symbol=_Symbol;    // specify the symbol, at which the order is placed
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // current buy price
   double price=bid - (StopLoss*point);                        // unnormalized open price
   price=NormalizeDouble(price,digits);                        // normalizing open price
   double SL_pips=StopLoss;                                    // Stop Loss in points
   int TP_pips=TakeProfit;                                     // Take Profit in points
   double SL=price+SL_pips*point;                              // unnormalized SL value
   SL=NormalizeDouble(SL,digits);                              // normalizing Stop Loss
   double TP=price-TP_pips*point;                              // unnormalized TP value
   TP=NormalizeDouble(TP,digits);                              // normalizing Take Profit
   datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);

//--- everything is ready, sending a Buy Stop pending order to the server
   m_trade.SellStop(Lots,price,symbol,SL,TP,ORDER_TIME_GTC,expiration);
}

// Order Buy Stop Funktion
void OrderBuyStop() {

   string symbol=_Symbol;    // specify the symbol, at which the order is placed
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);             // current buy price
   double price=ask + (StopLoss*point);                        // unnormalized open price
   price=NormalizeDouble(price,digits);                        // normalizing open price
   double SL_pips=StopLoss;                                    // Stop Loss in points
   int TP_pips=TakeProfit;                                     // Take Profit in points
   double SL=price-SL_pips*point;                              // unnormalized SL value
   SL=NormalizeDouble(SL,digits);                              // normalizing Stop Loss
   double TP=price+TP_pips*point;                              // unnormalized TP value
   TP=NormalizeDouble(TP,digits);                              // normalizing Take Profit
   datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);

//--- everything is ready, sending a Buy Stop pending order to the server
   m_trade.BuyStop(Lots,price,symbol,SL,TP,ORDER_TIME_GTC,expiration);

}

Ich hoffe, dass ich ihnen helfen konnte. 

Habe nicht geprüft, sollte aber funktionieren.

Da werden Pendingorders in beide Richtungen gesetzt. 

Den Rest müssen Sie selbst machen! .-)

Gruß Igor.

Grund der Beschwerde: