Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1116

 
Artyom Trishkin:

¿Y cómo se comprueba si todavía no se ha abierto una posición en esta barra?

Tal vez deberíamos modificar un poco la función de Aleksey Vazhmikin y añadir una estructura para controlar la apertura de una posición en una nueva barra de esta manera:

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

Y luego levantar la bandera de control en el Asesor Experto cuando una posición se abre con éxito:

BarOpen.IsPositionOpened=true;

Y controlarlo antes de abrir otra posición. ¿Es más fiable?

 
Grigori.S.B:

La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno.

 

Gracias por toda su ayuda. He estudiado todo en detalle. Tengo un retraso de 5 segundos después de cada solicitud de comercio, pero todavía no ayuda. El problema es sólo en ICMarkets demo MT5 cobertura. Añadiré comprobaciones y emitiré los resultados del sondeo de estado. La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo y el cliente lo tiene regularmente, a pesar de que nos conectamos al mismo servidor.

 
¡Hola señores! ¿Hay alguien de Simferopol?
 
Олег Юдин:
¡Hola Señoras y Señores! ¿Hay alguien de Simferopol?

Así que crees que esto te ayudará de alguna manera en el aprendizaje de MQL5 :) . Este es un foro de programación MQL5, no un club de citas.

 
Vladimir Karputov:

Así que crees que esto te ayudará de alguna manera en el aprendizaje de MQL5 :) . Este es un foro de programación MQL5, no un club de citas.

Yo mismo tengo un buen conocimiento de la programación en mql5, no es perfecto, pero no está mal.
 
Grigori.S.B:

Gracias por toda su ayuda. He estudiado todo en detalle. Tengo un retraso de 5 segundos después de cada solicitud de comercio, pero todavía no hay ayuda. El problema es sólo en ICMarkets demo MT5 cobertura. Añadiré comprobaciones y emitiré los resultados del sondeo de estado. La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo y el cliente lo tiene regularmente, a pesar de que nos conectamos al mismo servidor.

Creo que tiene algo que ver con la calidad de la conexión del cliente, por ejemplo, un ping alto. Sí tienes un retraso de 5 segundos, pero no está ahí, según entiendo de tu código. ¿Qué devuelve la clase m_trade? ¿Número de billete? ¿O verdadero o falso? Tiene una comprobación del resultado devuelto por este objeto, pero imagina que debido a un retraso en la conexión con el servidor no se ha recibido aún una respuesta positiva. ¿Cuál será el resultado de la ejecución de la sentencia if? Probablemente, será falso y como resultado su bucle pasará a una segunda iteración después de 5 segundos. Y por fin el servidor responderá, pero ya se iniciará la segunda iteración y se enviará una segunda petición para abrir una posición similar. El hecho de que haya algún delta en la hora de apertura de la orden se demuestra por el hecho de que ambas órdenes están desplazadas en el gráfico, lo que significa que se han ejecutado a horas y precios diferentes.

 
Grigori.S.B:

La situación se agrava por el hecho de que no puedo reproducir el problema conmigo mismo, pero con el cliente ocurre regularmente, aunque nos conectemos al mismo servidor.

Compruebe en la barra, una posición por símbolo. Lo más probable es que te deshagas del problema.

 
Konstantin Nikitin:

Compruebe en la barra, una posición por símbolo. Seguramente te librarás del problema.

Hay otro inconveniente. En esta situación es más fácil reescribir al estilo de MT4 que idear una muleta.

 

¡Buenos días a todos!

Aquí está parte del código del script para 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));
        }
     }
  }


Han surgido preguntas:

1. Se supone que el script debe establecer órdenes limitadas pendientes a una determinada distancia de la oferta y la demanda, o bien órdenes stop. Las órdenespendientes de límite se fijan sin problemas pero las de stop no. Por favor, ayúdenme a averiguar por qué no se establecen las órdenes pendientes de Buy Stop y Sell Stop.

2. ¿Hay alguna posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Sinceramente, Vladimir.
Razón de la queja: