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

 
Artyom Trishkin:
Tenemos que mirar más profundamente...

Más profundo, ¿dónde está eso?

Todos los intentos, con el nuevo indicador, conducen a un cuelgue.

Y con el indicador, que no cambia, hay un hipo momentáneo.

¿Cuál podría ser la solución?

 
mila.com:

Más profundo, ¿dónde está eso?

Todos los intentos, con el nuevo indicador, resultan en un cuelgue.

Y con el indicador sin cambios, hay un hipo momentáneo.

¿Cuál podría ser la solución?

En su indicador -en lugar de utilizar en él los datos de otros indicadores personalizados, en particular- busque fractales de cualquier dimensión, simplemente haga una función para buscar tales fractales y trabaje con ellos.
 
Artyom Trishkin:
Sólo hay que crear funciones para encontrar esos fractales y trabajar con ellos.

Para ti, es algo sencillo).

pero para mí es una tarea imposible.

¿Una función como esta?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

Es un fractal inferior.

¿Cómo se utiliza?

 
mila.com:

Para ti, es más fácil hacerlo).

Pero para mí es una tarea imposible.

¿Cómo implantar la función de ese indicador en el mío?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

Pues bien, se necesita que devuelva el precio de un fractal en la barra requerida. Aquí, hice un indicador simple. Tiene dos funciones que puedes sacar y utilizar en el tuyo - las he organizado especialmente como funciones - con comprobaciones de valores no válidos.

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,159);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(i,limit,high,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(i,limit,low ,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(int shift,const int limit,const double &low[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(low[i]>low[i-1]) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(low[i]>low[i+1]) return(-1);
   return(low[shift]);
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(int shift,const int limit,const double &high[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(high[i]<high[i-1]) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(high[i]<high[i+1]) return(-1);
   return(high[shift]);
}
//+----------------------------------------------------------------------------+
 

Para separar completamente las funciones para obtener fractales arbitrarios del indicador, no debemos pasar por referencia las matrices high[] y low[] y el valor del límite en ellas.

Como nuestro código es muy cercano a MQL5, tendremos que rechazar las funciones High[], Low[], iHigh() y iLow(). Así es como se verá en este indicador:

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   // PlotIndexSetInteger(0,PLOT_ARROW,217);
   // PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
Sin embargo, también debemos comprobar el -1 de las funciones GetPriceHigh() y GetPriceLow()
 
Hola, aconsejar cómo hacer un EA utilizando 15 minutos marco de tiempo para comprobar el valor cada 20 minutos, por ejemplo, en 9-20, 9-40 seguido de cruce RSI y si el nivel se cruza en veinte minutos, comprobó el cambio de precio. Esto es lo que tengo que arreglar:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Es decir, digamos que en 9-20 se cruzó el RSI. Quiero que mi EA recuerde el precio a las 9-20 y a las 9-40 compruebe los últimos 20 minutos en relación con el precio a las 9-20. Si está bajando, abrirá un corto. Muchas gracias.
 
strongflex:
Hola, aconsejar cómo hacer Asesor Experto utilizando el marco de tiempo de 15 minutos para comprobar el valor cada 20 minutos, por ejemplo, en 9-20, 9-40 seguido de cruce RSI y si el nivel se cruza en veinte minutos, comprobó el cambio de precio. Esto es lo que tengo que arreglar:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Es decir, digamos que en 9-20 se cruzó el RSI. Quiero que mi EA recuerde el precio a las 9-20 y a las 9-40 compruebe los últimos 20 minutos en relación con el precio a las 9-20. Si está bajando, abrirá un corto. Muchas gracias.

:)

¿Qué pasa si ejecuta el Asesor Experto en 9.22?

¿Y si hay un fallo del sistema o del terminal? El precio se perderá.

Es decir, hay que buscar lo que había hace 20 minutos cuando llega la hora de esta comprobación. Ha llegado el momento en el que los minutos son mayores o iguales a un múltiplo de veinte - compruebe el estado del RSI en la barra, que fue hace 20 minutos. Si tiene el cruce correcto, entonces proceda como está previsto...

Sin embargo, en M15 no se puede determinar la hora exacta del cruce ni el precio exacto, pero se puede mirar el precio en M1 - al menos 15 veces más preciso.

 
Artyom Trishkin:

:)

¿Y si ejecutas el EA a 9,22?

¿Qué pasa si hay un fallo del sistema o del terminal? El precio se perderá.

Es decir, hay que buscar lo que había hace 20 minutos cuando llega la hora de esta comprobación. Ha llegado el momento en que los minutos son mayores o iguales a un múltiplo de veinte - compruebe el estado del RSI en la barra, que fue hace 20 minutos. Si tiene el cruce deseado, entonces procedemos como estaba previsto...

Sin embargo, en M15 no se puede determinar la hora exacta del cruce ni el precio exacto, pero se puede mirar el precio en M1 - al menos 15 veces más preciso.

Vale, supongo que no puedo hacerlo)) Chicos, ¿quién puede escribir esta parte del código? Pagaré 1000 rublos
 
strongflex:
Bueno, entiendo que no puedo hacer frente a ella)))) chicos que pueden escribir esta parte del código? Voy a pagar 1000 rublos
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

¿Y dónde están los mil?

(es una broma)

 
Alekseu Fedotov:
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

¿Y dónde están los mil?

(bromeando)

El RSI debe durar 15 minutos. Necesitamos que el EA lo compruebe cada 20 minutos desde la apertura del mercado (9-00, 9-20, 9-40 etc.) Digamos que a las 10-20 hay un cruce de abajo a arriba del nivel 70 recuerda el precio y a las 10-40 comprueba si el precio es menor que a las 10-20 abre una venta.
Razón de la queja: