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

 
Alexey Viktorov:

No puedo aconsejarte nada. No uso la optimización. Lo considero charlatanería.

No estoy de acuerdo. La optimización, en mi opinión, es la selección de los parámetros más adecuados para un par y una estrategia determinados.

P.D. Ahora los diferenciales parecen ser normales.

 
Youri Lazurenko:

No estoy de acuerdo.

No te estaba agitando. Sólo doy mi opinión personal)).

 
Alexey Viktorov:

No te estaba agitando. Sólo he dado mi opinión personal)).

Tal vez mi opinión sea errónea. Tampoco estoy agitando.

 

Hola. Necesito ayuda. Necesito limitar el tiempo de vida de una orden pendiente, preferiblemente en el número de barras. He utilizado la función en mql4:

datetime DateExp()                                 
{
   datetime expDate = 0;
   
   if(Period() == PERIOD_M1)
      expDate = TimeCurrent() + ExpDate*60;
      
   if(Period() == PERIOD_M5)
      expDate = TimeCurrent() + ExpDate*5*60;
    
   if(Period() == PERIOD_M15)
      expDate = TimeCurrent() + ExpDate*15*60;
    
   if(Period() == PERIOD_M30)
      expDate = TimeCurrent() + ExpDate*30*60;
    
   if(Period() == PERIOD_H1)
      expDate = TimeCurrent() + ExpDate*60*60;
    
   if(Period() == PERIOD_H4)
      expDate = TimeCurrent() + ExpDate*4*60*60;
   
   if(Period() == PERIOD_D1)
      expDate = TimeCurrent() + ExpDate*24*60*60;      
    
   if(Period() == PERIOD_W1) 
      expDate = TimeCurrent() + ExpDate*7*24*60*60; 
   
   if(Period() == PERIOD_MN1)
      expDate = TimeCurrent() + ExpDate*30*24*60*60;
          
   return(expDate);  
}

donde

extern intDate = 6; //número de barras de la vida de la orden

Todo funciona.

He intentado algo similar en mql5:

datetime DateExp()                                 
{
   datetime expDate = 0;
   
   if(Period() == PERIOD_M1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M1)*ExpDate;
      
   if(Period() == PERIOD_M2)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M2)*ExpDate;
   
   if(Period() == PERIOD_M3)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M3)*ExpDate;
   
   if(Period() == PERIOD_M4)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M4)*ExpDate;
      
   if(Period() == PERIOD_M5)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M5)*ExpDate;
   
   if(Period() == PERIOD_M6)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M6)*ExpDate;
   
   if(Period() == PERIOD_M10)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M10)*ExpDate;
   
   if(Period() == PERIOD_M12)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M12)*ExpDate;
    
   if(Period() == PERIOD_M15)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M15)*ExpDate;
   
   if(Period() == PERIOD_M20)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M20)*ExpDate;
    
   if(Period() == PERIOD_M30)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M30)*ExpDate;
    
   if(Period() == PERIOD_H1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H1)*ExpDate;
   
   if(Period() == PERIOD_H2)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H2)*ExpDate;
   
   if(Period() == PERIOD_H3)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H3)*ExpDate;
    
   if(Period() == PERIOD_H4)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H4)*ExpDate;
   
   if(Period() == PERIOD_H6)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H6)*ExpDate;
   
   if(Period() == PERIOD_H8)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H8)*ExpDate;
   
   if(Period() == PERIOD_H12)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H12)*ExpDate;
   
   if(Period() == PERIOD_D1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_D1)*ExpDate;      
    
   if(Period() == PERIOD_W1) 
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_W1)*ExpDate; 
   
   if(Period() == PERIOD_MN1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_MN1)*ExpDate;
          
   return(expDate);  
}

donde

input int ExpDate = 6; //número de barras de la vida de la orden

Luego probé (la función que se muestra arriba) a utilizarla al colocar una orden pendiente, por ejemplo, para comprar

               request.action       = TRADE_ACTION_PENDING;                                         
               request.magic        = Magic;                                                       
               request.symbol       = _Symbol;                                                      
               request.volume       = GetLots();                                                    
               request.price        = openBuy;                                                      
               request.sl           = slBuy;                                                        
               request.tp           = tpBuy;                                                        
               request.type         = ORDER_TYPE_BUY_STOP;                                          
               request.type_filling = ORDER_FILLING_FOK;                                           
               request.expiration   = DateExp();                                                    
               request.deviation    = SG; 

La orden pendiente se coloca pero no se activa hasta que se activa (en el probador). He intentado establecer un número simple en request.expiration pero no funciona. No he encontrado ninguna información en Google. ¿Qué me pasa? ¿Por qué no se elimina el pedido después de un determinado período de tiempo?

P.D. Cuando se muestra en el comentario, la función DateExp() muestra la fecha y la hora.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Youri Lazurenko:


Has olvidado especificar:

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена 
   double                        stoplimit;        // Уровень StopLimit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };
 
Vladimir Karputov:

Has olvidado especificar:

Gracias, ya lo he encontrado yo mismo, quería escribir que la pregunta está eliminada. Antes de estos, pero puse, resulta, parámetro equivocado request.type_time = ORDER_TIME_GTC; Corregido a request.type_time = ORDER_TIME_SPECIFIED; y todo funciona. Pero muchas gracias por el comentario y el consejo.

 
Artyom Trishkin:

Alexey le dijo que primero debe hacer su indicador por lo menos sólo dibujar velas. Tal como son. Al menos en el bar actual. Si lo consigue, considere que ha superado el primer paso hacia la comprensión. Pero es conveniente no tratar de encontrarlo probando diferentes parámetros, sino con su propia mente.

¿Qué tiene que ver esto con el a priori? Realmente lo necesitas, ya que no puedes dibujar una vela con sólo cuatro valores.

Aquí he escrito un indicador de prueba muy simple, que debe dibujar 5 velas (reales) del gráfico USDJPY H8

//+------------------------------------------------------------------+
//|                                                        cTest.mq5 |
//|                                     Copyright 2020, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.00"
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot bars
#property indicator_label1  "bars"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double   barsBuffer1[];
double   barsBuffer2[];
double   barsBuffer3[];
double   barsBuffer4[];
//+------------------------------------------------------------------+
double   newCandles_Open[5]   = {106.785, 106.724, 106.760, 106.767, 106.769};
double   newCandles_High[5]   = {106.792, 106.765, 106.780, 106.781, 106.769};
double   newCandles_Low[5]    = {106.716, 106.719, 106.746, 106.758, 106.715};
double   newCandles_Close[5]  = {106.724, 106.760, 106.766, 106.769, 106.725};

int      tick_count           = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0, barsBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, barsBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, barsBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, barsBuffer4, INDICATOR_DATA);
   
   ArraySetAsSeries(barsBuffer1  ,true);
   ArraySetAsSeries(barsBuffer2  ,true);
   ArraySetAsSeries(barsBuffer3  ,true);
   ArraySetAsSeries(barsBuffer4  ,true);
   
   ArrayInitialize(barsBuffer1   ,0.0);
   ArrayInitialize(barsBuffer2   ,0.0);
   ArrayInitialize(barsBuffer3   ,0.0);
   ArrayInitialize(barsBuffer4   ,0.0);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int  OnCalculate(
   const int        rates_total,       // размер входных таймсерий
   const int        prev_calculated,   // количество обработанных баров на предыдущем вызове
   const datetime&  time[],            // массив Time
   const double&    open[],            // массив Open
   const double&    high[],            // массив High
   const double&    low[],             // массив Low
   const double&    close[],           // массив Close
   const long&      tick_volume[],     // массив Tick Volume
   const long&      volume[],          // массив Real Volume
   const int&       spread[]           // массив Spread
   )
{
   if(rates_total - prev_calculated > 1)
   {
      if(prev_calculated == 0)
      {
         Print("~~~~ Предварительный расчёт индикатора.");
         for(int i = 0; i < 5; i++)
         {
            barsBuffer1[0] = newCandles_Open[i];
            barsBuffer2[0] = newCandles_High[i];
            barsBuffer3[0] = newCandles_Low[i];
            barsBuffer4[0] = newCandles_Close[i];
         }
         Print("~~~~ Предварительный расчёт индикатора закончен.");
      }
      else return(0);
   }
   else Print("tick_count = ",++tick_count);
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+

Sólo dibuja esos candelabros, nada más.

Pero cuando lo ejecuto, sólo dibuja la maldita cosa...

Así que dime, ¿qué estoy haciendo mal?


Por cierto, hay una errata en la documentación:

const datetime&  time{},            // массив Time
Документация по MQL5: Обработка событий / OnCalculate
Документация по MQL5: Обработка событий / OnCalculate
  • www.mql5.com
события Calculate для обработки изменений ценовых данных. Существуют два варианта функции, в пределах одного индикатора нельзя использовать оба варианта. [in]  Размер массива price[] или входных таймсерий, доступных индикатору для расчета. Во втором варианте функции значение параметра соответствует количеству баров на графике, на котором он...
Archivos adjuntos:
cTest.mq5  8 kb
 
Сергей Таболин:

Escribí un indicador de prueba muy simple, que debería dibujar 5 velas (reales) del gráfico USDJPY,H8

Sólo dibuja estos candelabros, nada más.

Pero cuando lo ejecuto, sólo dibuja la maldita cosa...

¿Cómo puedo explicar lo que estoy haciendo mal?


Por cierto, hay una errata en la documentación:

En el depurador, compruebe el tiempo[0] y responda a la pregunta: "¿Por qué intenta dibujar velas desde la parte delantera izquierda del gráfico?


Te lo dije - utiliza la ayuda para DRAW_CANDLES. Copie el ejemplo de la ayuda de DRAW_CANDLES. Resuélvelo. Es demasiado pronto para que te metas en las garrapatas.

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
  • www.mql5.com
//|                                                 DRAW_CANDLES.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | "Рисует в отдельном окне разным цветом свечи по случайно выбранному из MarketWatch символу...
 
Vladimir Karputov:

En el depurador compruebe el tiempo[0] y responda a la pregunta: "¿Por qué está intentando dibujar velas desde el borde IZQUIERDO del gráfico?


Te lo dije - utiliza la ayuda para DRAW_CANDLES. Copie el ejemplo de la ayuda de DRAW_CANDLES. Resuélvelo. Es demasiado pronto para que te metas en las garrapatas.

Vladimir, ya he entendido lo que intentaba dibujar desde el borde izquierdo. El de la prueba tiene el borde derecho.

   ArraySetAsSeries(barsBuffer1  ,true);
   ArraySetAsSeries(barsBuffer2  ,true);
   ArraySetAsSeries(barsBuffer3  ,true);
   ArraySetAsSeries(barsBuffer4  ,true);

Y los precios de las velas son reales... Y no hay garrapatas...

 
Сергей Таболин:

Vladimir, ya he entendido que intentaba dibujar desde el extremo izquierdo. La prueba se dibuja ahora desde el borde derecho

Y los precios de las velas son reales... Y no hay garrapatas...

¡Toma el ejemplo de la ayuda! ¿Cuántas veces? No tienes que usar tus propias construcciones ficticias si no entiendes su significado. Utiliza las construcciones estándar: averigua cómo funcionan. Después de eso, tira tus propias construcciones a la basura.


Y utilizar el 'MQL Wizard' para generar una plantilla.

Código

//+------------------------------------------------------------------+
//|                                                 Draw Candles.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot USDJPY
#property indicator_label1  "USDJPY"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double   Buffer1[];
double   Buffer2[];
double   Buffer3[];
double   Buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Buffer4,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      Buffer1[i]=open[i];
      Buffer2[i]=high[i];
      Buffer3[i]=low[i];
      Buffer4[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

y el resultado


Archivos adjuntos: