Questions des débutants MQL5 MT5 MetaTrader 5 - page 1116

 
Artyom Trishkin:

Et comment vérifier si une position n'a pas encore été ouverte sur cette barre ?

Peut-être devrions-nous modifier un peu la fonction d'Aleksey Vazhmikin et ajouter une structure pour contrôler l'ouverture d'une position sur une nouvelle barre de cette manière :

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

Et ensuite lever le drapeau de contrôle dans le conseiller expert lorsqu'une position est ouverte avec succès :

BarOpen.IsPositionOpened=true;

Et le contrôler avant d'ouvrir une autre position. Est-il plus fiable ?

 
Grigori.S.B:

La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité.

 

Merci pour toute votre aide. J'ai tout étudié en détail. J'ai un délai de 5 secondes après chaque demande de transaction mais cela n'aide toujours pas. Le problème se pose uniquement sur la couverture MT5 de démonstration d'ICMarkets. Je vais ajouter des vérifications et sortir les résultats des sondages d'état. La situation est aggravée par le fait que je n'arrive pas à reproduire le problème avec moi-même et que le client le rencontre régulièrement, alors que nous nous connectons au même serveur.

 
Bonjour messieurs ! Y a-t-il quelqu'un de Simferopol ?
 
Олег Юдин:
Bonjour Mesdames et Messieurs ! Y a-t-il quelqu'un de Simferopol ?

Vous pensez donc que cela va vous aider à apprendre MQL5 :) . Il s'agit d'un forum de programmation MQL5, pas d'un club de rencontres.

 
Vladimir Karputov:

Vous pensez donc que cela va vous aider à apprendre MQL5 :) . Il s'agit d'un forum de programmation MQL5, pas d'un club de rencontres.

J'ai moi-même une bonne compréhension de la programmation mql5, pas parfaite, mais pas mauvaise !
 
Grigori.S.B:

Merci pour toute votre aide. J'ai tout étudié en détail. J'ai un délai de 5 secondes après chaque demande de transaction, mais cela ne m'aide toujours pas. Le problème se pose uniquement sur la couverture MT5 de démonstration d'ICMarkets. Je vais ajouter des vérifications et sortir les résultats des sondages d'état. La situation est aggravée par le fait que je n'arrive pas à reproduire le problème avec moi-même et que le client le rencontre régulièrement, alors que nous nous connectons au même serveur.

Je pense que cela a quelque chose à voir avec la qualité de la connexion du client, par exemple un ping important. Vous avez bien un délai de 5 secondes, mais il n'est pas présent, d'après ce que je comprends de votre code. Quel est le rendement de la classe m_trade ? Numéro de ticket ? Ou vrai ou faux ? Vous avez une vérification du résultat renvoyé par cet objet, mais imaginez qu'en raison d'un retard dans la connexion avec le serveur, une réponse positive n'a pas encore été reçue. Quel sera le résultat de l'exécution de l'instruction if ? Probablement, il sera faux et par conséquent votre boucle passera à une seconde itération après 5 secondes. Et le serveur répondra enfin, mais la deuxième itération sera déjà lancée et une deuxième demande d'ouverture d'une position similaire sera envoyée. Le fait qu'il y ait un certain delta dans le temps d'ouverture de l 'ordre est démontré par le fait que les deux ordres sont décalés dans le graphique, ce qui signifie qu'ils ont été exécutés à des moments et des prix différents.

 
Grigori.S.B:

La situation est aggravée par le fait que je ne peux pas reproduire le problème avec moi-même, mais avec le client, il se produit régulièrement, même si nous nous connectons au même serveur.

Vérifiez sur la barre, une position par symbole. Il est fort probable que vous vous débarrasserez du problème.

 
Konstantin Nikitin:

Vérifiez sur la barre, une position par symbole. Vous vous débarrasserez probablement du problème.

Il y a un autre problème. Dans cette situation, il est plus facile de réécrire en style MT4 que d'inventer une béquille.

 

Bonjour à tous !

Voici une partie du code du script pour 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));
        }
     }
  }


Des questions ont été soulevées :

1. Le script est censé définir soit des ordres à cours limité à une certaine distance du ask et du bid, soit des ordres stop. Les ordres limitésen attente sont définis sans problème, mais pas les ordres stop. Veuillez m'aider à comprendre pourquoi les ordres d'achat stop et de vente stop en attente ne sont pas définis.

2. Est-il possible de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Sincèrement, Vladimir.