Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1256

 
Vladimir Pastushak:

¿Cómo puedo saber el tipo de parámetro de entrada?

el propio compilador sustituye los tipos en el momento de la llamada a la función de plantilla, si dicha llamada no estaba todavía en el código, entonces el compilador creará otra copia de la función y establecerá los tipos por sí mismo - bueno, como si lógicamente - una plantilla


si la pregunta es sobre cómo definir el tipo en dicha función, utilice

typename

UPD: añadido al ejemplo anterior el parámetro tipo impresoras:

#define  PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: añadido__FUNCSIG__ a este ejemplo

 

Por la tarde.
Me encuentro con algo extraño al escribir un indicador en MQL5 (indicador en una subventana separada, 4 líneas).

Las descripciones de los búferes iniciales son las siguientes:

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

Siguiente en OnInit:

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

Esencialmente: el indicador dibuja 4 líneas: las dos primeras son de un solo color, las dos siguientes son bicolores (cambian de color en las curvas).

El bicolor se debe a la forma de dibujar DRAW_COLOR_LINE.

Pregunta: la primera línea (búferes 2 y 3 en el código anterior) se dibuja perfectamente y todo el código escrito para ella en OnInit funciona;
segunda línea aparece por alguna razón, por ejemplo la línea no funciona:

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Es decir, en lugar del texto que puse en la ventana de datos, sólo aparece el nombre del indicador en lugar del buffer. Aunque la propia línea está trazada, y es, como debe ser, multicolor.
Creo que el truco está en el cambio de numeración? Por ejemplo, no estoy seguro de por qué en la parte superior del código, cuando declaro la última línea con la directiva #property, el índice debería ser 4, y no 5, ya que antes se han utilizado 4 buffers. ¿Existe alguna relación entre la numeración de líneas al declarar con #property y la numeración de buffers al enlazar con arrays en OnInit?

Por favor, indique qué es lo que está mal en el código anterior. Quizá alguien pueda encontrar un ejemplo de indicador en el que se dibujen al menos dos líneas utilizando el método de dibujo DRAW_COLOR_LINE....

Otra pregunta relacionada: ¿cómo se unen los topes de las líneas de colores? Es decir, ¿cómo sabe el código compilado que si pongo un valor en un búfer de color, este color debe utilizarse para colorear una línea de algún otro búfer?

 
satorifx:

Por la tarde.
Me encuentro con algo extraño al escribir un indicador en MQL5 (indicador en una subventana separada, 4 líneas).

Las descripciones de los búferes iniciales son las siguientes:

Siguiente en OnInit:

Esencialmente: el indicador dibuja 4 líneas: las dos primeras son de un solo color, las dos siguientes son bicolores (cambian de color en las curvas).

El bicolor se debe a la forma de dibujar DRAW_COLOR_LINE.

Pregunta: la primera línea (búferes 2 y 3 en el código anterior) se dibuja perfectamente y todo el código escrito para ella en OnInit funciona;
segunda línea aparece por alguna razón, por ejemplo la línea no funciona:

Es decir, en lugar del texto que puse en la ventana de datos, sólo aparece el nombre del indicador en lugar del buffer. Aunque la propia línea está trazada, y es, como debe ser, multicolor.
Creo que el truco está en el cambio de numeración? Por ejemplo, no estoy seguro de por qué en la parte superior del código, cuando declaro la última línea con la directiva #property, el índice debería ser 4, y no 5, ya que antes se han utilizado 4 buffers. ¿Existe alguna relación entre la numeración de líneas al declarar con #property y la numeración de buffers al enlazar con arrays en OnInit?

Por favor, indíqueme qué es lo que falla en el código anterior. Quizá alguien pueda encontrar un ejemplo de indicador en el que se dibujen al menos dos líneas utilizando el método de dibujo DRAW_COLOR_LINE....

Otra pregunta relacionada: ¿cómo se unen los topes de las líneas de colores? Es decir, ¿cómo sabe el código compilado que si pongo un valor en un búfer de color, este color debe utilizarse para colorear una línea de algún otro búfer?

Las asignaciones se numeran de forma diferente a los búferes.

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

Esto debería funcionar.

 

¡Buenas tardes a todos!

Hice una función para modificar el stoploss. Pero cuando funciona da EURUSD,H1: OrderModify error 130.

Y el precio está muy lejos del lugar donde se debe fijar el stoploss.

Esta es la función:

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Buen día. Quiero escribir un EA basado en la medición del ángulo de inclinación de una media móvil (o mejor un conjunto de ellas, concretamente la Alligator), de forma que el EA dé una alerta ante un fuerte impulso del precio, preferiblemente con un pequeño retardo. Por favor, aconseje cómo medir el ángulo de la MA o "decirle al EA" que el pulso se produjo. Tal vez ya se conozcan formas de hacerlo. ¿O, por ejemplo, un indicador gratuito basado en el cálculo de impulsos?
 

Escribí una función para encontrar el número de barra de un fractal de 3 barras. En el gráfico en línea parece encontrarlo correctamente. Pero durante las pruebas visuales en el probador miente. ¿Puede alguno de los profesionales echar un vistazo al código y encontrar algún error?

Se lo agradecería mucho.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Buenas tardes. ¿QUÉ CÓDIGO DEBO AÑADIR PARA QUE EL INDICADOR DEJE DE FUNCIONAR EN EL PROBADOR DESPUÉS DE UN MES? ES DECIR, ¡ESCRIBÍ TODO BIEN! PERO CUANDO HAGO UN BACKTEST VUELVE A FUNCIONAR. (mgl4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
Archivos adjuntos:
 

¡Hola!

Quería poner una condición en el ciclo de cierre de órdenes enel día de apertura, para que las órdenes que se abrieron el viernes no se cerraran.

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

Buenas tardes. ¿QUÉ CÓDIGO DEBO AÑADIR PARA QUE EL INDICADOR DEJE DE FUNCIONAR EN EL PROBADOR DESPUÉS DE UN MES? ES DECIR, ¡ESCRIBÍ TODO BIEN! PERO CUANDO HAGO UN BACKTEST VUELVE A FUNCIONAR. (mgl4)

Es necesario escribir este código no en OnInit, sino en OnTick().

 
Yerkin Sagandykov:

¡Hola!

Quería poner una condición en el ciclo de cierre de pedidos enel día de apertura de los mismos, para que no se cerraran los abiertos el viernes.

Inténtalo de esta manera:

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }