Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1116

 
Artyom Trishkin:

Und wie kann man überprüfen, ob eine Position auf diesem Balken noch nicht eröffnet wurde?

Vielleicht sollten wir die Funktion von Aleksey Vazhmikin ein wenig modifizieren und eine Struktur hinzufügen, um die Eröffnung einer Position auf einem neuen Balken auf diese Weise zu steuern:

struct open_bar {
   bool     IsPositionOpened; // Flag
   int      bn;               // Bar Number
   datetime bot;              // Bar Open Time
   double   bop;              // Bar Open Price
}; 
open_bar BarOpen;

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
     {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
     }
   else
     {
      if(prevBarTime!=tm[0])
        {
         prevBarTime=tm[0];
         BarOpen.IsPositionOpened=false;
         BarOpen.bn++;
         BarOpen.bot=iTime(NULL,PERIOD_CURRENT,0);
         BarOpen.bop=iOpen(NULL,PERIOD_CURRENT,0);
         return true;
        }
      return false;
     }
   return true;
  }

Und heben Sie dann die Kontrollflagge im Expert Advisor, wenn eine Position erfolgreich eröffnet wurde:

BarOpen.IsPositionOpened=true;

Und kontrollieren Sie sie, bevor Sie eine weitere Position eröffnen. Ist sie zuverlässiger?

 
Grigori.S.B:

Die zweite Position wird unmittelbar nach der ersten eröffnet, in derselben Sekunde, die Ticks unterscheiden sich um eins.

 

Ich danke Ihnen für Ihre Hilfe. Ich habe alles im Detail studiert. Ich habe eine 5-Sekunden-Verzögerung nach jeder Handelsanfrage, aber das hilft immer noch nicht. Das Problem ist nur auf ICMarkets Demo MT5 hedge. Ich werde Prüfungen hinzufügen und die Ergebnisse der Statusabfrage ausgeben. Erschwerend kommt hinzu, dass ich das Problem bei mir selbst nicht reproduzieren kann und es beim Kunden regelmäßig auftritt, obwohl wir uns mit demselben Server verbinden.

 
Hallo meine Herren! Ist hier jemand aus Simferopol?
 
Олег Юдин:
Hallo meine Damen und Herren! Ist hier jemand aus Simferopol?

Sie glauben also, dass dies Ihnen beim Erlernen von MQL5 irgendwie helfen wird :) . Dies ist ein MQL5-Programmierforum, kein Dating-Club.

 
Vladimir Karputov:

Sie glauben also, dass dies Ihnen beim Erlernen von MQL5 irgendwie helfen wird :) . Dies ist ein MQL5-Programmierforum, kein Dating-Club.

Ich selbst habe ein gutes Verständnis der mql5 Programmierung, nicht perfekt, aber nicht schlecht!
 
Grigori.S.B:

Ich danke Ihnen für Ihre Hilfe. Ich habe alles im Detail studiert. Ich habe eine 5-sekündige Verzögerung nach jeder Handelsanfrage, aber immer noch keine Hilfe. Das Problem ist nur auf ICMarkets Demo MT5 hedge. Ich werde Prüfungen hinzufügen und die Ergebnisse der Statusabfrage ausgeben. Erschwerend kommt hinzu, dass ich das Problem bei mir selbst nicht reproduzieren kann und es beim Kunden regelmäßig auftritt, obwohl wir uns mit demselben Server verbinden.

Ich denke, es hat etwas mit der Qualität der Client-Verbindung zu tun, z. B. mit einem hohen Ping. Sie haben zwar eine 5-Sekunden-Verzögerung, aber die ist einfach nicht da, wie ich aus Ihrem Code entnehme. Was gibt die Klasse m_trade zurück? Fahrscheinnummer? Oder wahr oder falsch? Sie haben eine Prüfung für das von diesem Objekt zurückgegebene Ergebnis, aber stellen Sie sich vor, dass aufgrund einer Verzögerung bei der Verbindung mit dem Server noch keine positive Antwort eingegangen ist. Was wird das Ergebnis der Ausführung der if-Anweisung sein? Wahrscheinlich wird es falsch sein, und als Ergebnis wird Ihre Schleife nach 5 Sekunden zur zweiten Iteration übergehen. Und schließlich antwortet der Server, aber die zweite Iteration ist bereits eingeleitet und eine zweite Anfrage zur Eröffnung einer ähnlichen Position wird gesendet. Die Tatsache, dass es ein gewisses Delta in der Ordereröffnungszeit gibt, zeigt sich daran, dass beide Orders im Diagramm verschoben sind, was bedeutet, dass sie zu unterschiedlichen Zeiten und Preisen ausgeführt wurden.

 
Grigori.S.B:

Erschwerend kommt hinzu, dass ich das Problem bei mir selbst nicht reproduzieren kann, aber beim Kunden tritt es regelmäßig auf, obwohl wir uns mit demselben Server verbinden.

Kontrollieren Sie den Balken, eine Position pro Symbol. Höchstwahrscheinlich werden Sie das Problem loswerden.

 
Konstantin Nikitin:

Kontrollieren Sie den Balken, eine Position pro Symbol. Sie werden das Problem wahrscheinlich loswerden.

Es gibt noch einen weiteren Haken an der Sache. In dieser Situation ist es einfacher, auf den MT4-Stil umzuschreiben, als sich eine Krücke auszudenken.

 

Guten Tag zusammen!

Hier ist ein Teil des Skriptcodes für Metatrader5:

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop=0,     // Buy stop and Sell stop
   limit=1     // Buy limit and Sell limit
  };
//--- input parameters
input ushort               InpUpGap          = 15;    // Gap for pending orders UP from the current price (in points)
input ushort               InpUpStep         = 30;    // Step between orders UP (in points)

input ushort               InpDownGap        = 15;    // Gap for pending orders DOWN from the current price (in points)
input ushort               InpDownStep       = 30;    // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;  // Type of pending orders

input uchar                InpUpQuantity     = 1;     // UP quantity orders
input uchar                InpDownQuantity   = 1;     // DOWN quantity orders

input double               InpLots           = 0.01;  // Lots
input ushort               InpStopLoss       = 50;    // Stop Loss (in points)
input ushort               InpTakeProfit     = 50;    // Take Profit (in points)
//---
ulong                      m_slippage=30;             // slippage

double                     ExtUpGap=0.0;
double                     ExtUpStep=0.0;

double                     ExtDownGap=0.0;
double                     ExtDownStep=0.0;

double                     ExtStopLoss=0.0;
double                     ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }

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

//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);

//---
   ExtUpGap = m_symbol.Point() * InpUpGap;
   ExtUpStep = m_symbol.Point() * InpUpStep;

   ExtDownGap = m_symbol.Point() * InpDownGap;
   ExtDownStep = m_symbol.Point() * InpDownStep;

   ExtStopLoss = m_symbol.Point() * InpStopLoss;
   ExtTakeProfit = m_symbol.Point() * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for(int i=0; i<InpUpQuantity; i++)
     {
      double price_ask = start_price_ask+i*ExtUpStep;
      double price_bid = start_price_bid+i*ExtUpStep;
      if(InpPending==stop)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }

   for(int i=0; i<InpDownQuantity; i++)
     {
      double price_ask = start_price_ask-i*ExtDownStep;
      double price_bid = start_price_bid-i*ExtDownStep;
      if(InpPending==limit)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }
  }


Es haben sich Fragen ergeben:

1. Das Skript soll entweder schwebende Limit-Aufträge in einem bestimmten Abstand zum Geld- und Briefkurs oder Stop-Aufträge setzen. Dieschwebenden Limit-Aufträge werden ohne Probleme gesetzt, die Stop-Aufträge jedoch nicht. Bitte helfen Sie mir herauszufinden, warum die ausstehenden Buy Stop- und Sell Stop-Aufträge nicht gesetzt werden.

2. Gibt es eine Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?

Mit freundlichen Grüßen, Vladimir.