Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1116

 
Artyom Trishkin:

E come si controlla se una posizione non è ancora stata aperta su questa barra?

Forse dovremmo modificare un po' la funzione di Aleksey Vazhmikin e aggiungere una struttura per controllare l'apertura di una posizione su una nuova barra in questo modo:

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

E poi alza il flag di controllo nell'Expert Advisor quando una posizione viene aperta con successo:

BarOpen.IsPositionOpened=true;

E controllarlo prima di aprire un'altra posizione. È più affidabile?

 
Grigori.S.B:

La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno.

 

Grazie per tutto il vostro aiuto. Ho studiato tutto in dettaglio. Ho un ritardo di 5 secondi dopo ogni richiesta di scambio, ma ancora non aiuta. Il problema è solo su ICMarkets demo MT5 hedge. Aggiungerò i controlli e l'output dei risultati del polling di stato. La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso e il cliente lo ha regolarmente, anche se ci colleghiamo allo stesso server.

 
Salve signori! C'è qualcuno di Simferopol?
 
Олег Юдин:
Salve signore e signori! C'è qualcuno di Simferopol?

Quindi pensi che questo ti aiuterà in qualche modo a imparare MQL5 :). Questo è un forum di programmazione MQL5, non un club di appuntamenti.

 
Vladimir Karputov:

Quindi pensi che questo ti aiuterà in qualche modo ad imparare MQL5 :). Questo è un forum di programmazione MQL5, non un club di appuntamenti.

Io stesso ho una buona comprensione della programmazione mql5, non perfetta, ma non male!
 
Grigori.S.B:

Grazie per tutto il vostro aiuto. Ho studiato tutto in dettaglio. Ho un ritardo di 5 secondi dopo ogni richiesta di scambio, ma ancora nessun aiuto. Il problema è solo su ICMarkets demo MT5 hedge. Aggiungerò i controlli e l'output dei risultati del polling di stato. La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso e il cliente lo ha regolarmente, anche se ci colleghiamo allo stesso server.

Penso che abbia qualcosa a che fare con la qualità della connessione del client, ad esempio un grande ping. Hai un ritardo di 5 secondi, ma non c'è, come ho capito dal tuo codice. Cosa restituisce la classe m_trade? Numero del biglietto? O vero o falso? Avete un controllo del risultato restituito da questo oggetto, ma immaginate che a causa di un ritardo nella connessione con il server una risposta positiva non sia stata ancora ricevuta. Quale sarà il risultato dell'esecuzione dell'istruzione if? Probabilmente, sarà falso e di conseguenza il vostro ciclo passerà a una seconda iterazione dopo 5 secondi. E alla fine il server risponderà, ma la seconda iterazione sarà già iniziata e verrà inviata una seconda richiesta per aprire una posizione simile. Il fatto che ci sia un certo delta nel tempo di apertura dell 'ordine è dimostrato dal fatto che entrambi gli ordini sono spostati nel grafico, il che significa che sono stati eseguiti in tempi e prezzi diversi.

 
Grigori.S.B:

La situazione è aggravata dal fatto che non riesco a riprodurre il problema con me stesso, ma con il cliente si verifica regolarmente, anche se ci colleghiamo allo stesso server.

Controlla sulla barra, una posizione per simbolo. Molto probabilmente vi sbarazzerete del problema.

 
Konstantin Nikitin:

Controlla sulla barra, una posizione per simbolo. Probabilmente vi sbarazzerete del problema.

C'è un altro intoppo. In questa situazione è più facile riscrivere in stile MT4 che inventarsi una stampella.

 

Buona giornata a tutti!

Ecco una parte del codice dello script per 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));
        }
     }
  }


Sono sorte delle domande:

1. Lo script dovrebbe impostare o ordini limite pendenti a una certa distanza da ask e bid, o ordini stop. Gli ordinipendenti limite sono impostati senza problemi, ma quelli stop no. Per favore, aiutatemi a scoprire perché gli ordini pendenti Buy Stop e Sell Stop non vengono impostati.

2. C'è la possibilità di testare lo script quando il mercato è chiuso (per esempio nei fine settimana)?

Sinceramente, Vladimir.