Discusión sobre el artículo "Creación de un Expert Advisor que opera con varios instrumentos" - página 4

 
Interesting:

Yo seguiría prestando atención al algoritmo de trabajo con buffers. Si lo he entendido bien, con un buffer es suficiente (sólo hay que calcularlo y dibujarlo correctamente en el gráfico).

PS

Y con la variante actual tengo la impresión de que el inductor muestra los datos de la "izquierda" (el principio de la historia) en lugar de la "derecha" (actual)....

O no entiendo nada en la lógica de este indicador en absoluto....


Si la salida por ejemplo EURUSD a EURUSD o EURJPY a EURJPY, todo funciona bien.

Así que la dirección de salida parece ser correcta.

He probado un montón de variantes aquí e incluso como este:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

Sigue sin salir nada.

¿Alguien tiene algún ejemplo para mostrar dos herramientas diferentes en una misma pantalla, al menos de alguna manera?

 
gisip:

¿Qué estoy haciendo mal, por qué no puedo mostrar el gráfico de otro instrumento normalmente?

Todo funcionaba en MQL4, aquí sólo funciona si lo muestra en el mismo instrumento, entonces no hay errores.


Funciona en forma recortada. Añade comprobaciones y economía.

#property indicator_separate_window    // El indicador se dibuja en una ventana independiente
#property indicator_buffers 1

#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName="EURJPY";

//-- Matriz de indicadores
double ScreenBuffer[];

//-- Buffer dinámico --
double ArrayBuffer[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // Función especial init()
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ArrayBuffer,true);
   ArraySetAsSeries(ScreenBuffer,true);
   return 0;                          // Salir
  }
//--------------------------------------------------------------------
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 Counted_bars;   // Número de barras a accionar 
   int copied;

//--------------------------------------------------------------------
   copied=(int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   copied=CopyClose(InstrumentName,PERIOD_M1,0,copied,ArrayBuffer);//-- Escribir datos en el buffer de memoria --

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

//--------------------------------------------------------------------
   return(rates_total);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,-1);             // se borran todos los objetos del gráfico.
  }
[Eliminado]  
gisip:

Si la salida por ejemplo EURUSD a EURUSD o EURJPY a EURJPY, todo funciona bien.

Así que la dirección de salida es más o menos correcta.

He probado un montón de variantes aquí e incluso como este:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

Sigue sin salir nada.

¿Alguien tiene algún ejemplo para mostrar dos herramientas diferentes en una misma pantalla, al menos de alguna manera?

¿Tenéis el código fuente de MQL4?


Ya he sugerido una alternativa, que es hacer un índice para el instrumento actual y depurarlo al 100%. Después de eso, usted puede fácilmente llamarlo con los parámetros necesarios en Expert Advisor o en otro indicador.

Con esta implementación, es necesario cambiar la lógica básica del indicador, porque los parámetros pasados a la calculadora no son del todo correctos para otros instrumentos(el número de barras y otras cosas pueden no coincidir)....

Y en general este concepto no es muy "correcto" (por decirlo suavemente).


PS

En resumen, aquí hay dos opciones

1. Realizar todo para el TF e instrumento actual y comprobar su operatividad. Después de eso utilizar iCustom();

2. Reescribir la lógica del inductor de tal manera que en la calculadora reciba absolutamente todos los datos sobre el instrumento especificado en los parámetros (método costoso y poco correcto).

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
gisip:
Cambiado, todavía no funciona, el gráfico no es cierto.

Haga esto en su indicador

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // Función especial init()
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ScreenBuffer,true);
   
   return 0;                          // Salir
  }

y lea la sección Dirección de indexación en matrices y series de tiempo

[Eliminado]  
DC2008:

El formulario recortado funciona. Añade controles y economía.

Estas dos cosas no son realmente necesarias allí.

//1

//-- Buffer dinámico --
double ArrayBuffer[];
...............
ArraySetAsSeries(ArrayBuffer,true);

//2

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }
 
Interesting:

Esas son las dos cosas que no necesitas ahí.

En realidad, sí.
 

Sí, ¡creo que ha funcionado!

¡¡¡Muchas gracias a todos!!!

Lo probaré más a fondo.

 

Necesidad de visualizar las operaciones. El Asesor Experto es multidivisa. Digamos que se cuelga en EURUSD y abre operaciones en otros pares de divisas. Tengo una diferencia en los resultados, entiendo que es culpa mía, pero no puedo comprobarlo (no puedo abrir un gráfico con operaciones en AUDUSD cuando el Asesor Experto está colgado en EURUSD).

Si el Asesor Experto está colgado en AUDUSD, lo abro y veo que funciona como lo programé, pero si está colgado en EURUSD, los resultados son diferentes, y no puedo entender por qué. La visualización de las operaciones sería muy útil.

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 

7.Al probar Exp_TEMA.mq5, las expresiones Told[] Tnew[1]obtienen los siguientes valores:
Told[] Expression could not be evaluated
Tnew[1] Invalid array range.
¿Qué significan estos valores y cómo afectan al resultado del trabajo del Asesor Experto?

8.¿Por qué Exp_TEMA.mq5 abre operaciones dentro de una barra durante las pruebas?

9.¿Conducirá a la reducción del código, reducción del tiempo de ejecución de la operación, reducción del deslizamiento, reducción de costes (comisiones, etc.), si en lugar de cerrar una posición y abrir una posición en la dirección opuesta, hacemos un flip, es decir, abrimos una posición en la dirección opuesta con doble volumen?

Operaciones dentro de la barra.

[Eliminado]  
ias:

7.Al probar Exp_TEMA.mq5, las expresiones Told[] Tnew[1]obtienen los siguientes valores:
Told[] Expression could not be evaluated
Tnew[1] Invalid array range.
¿Qué significan estos valores y cómo afectan al trabajo del Asesor Experto?

En cuanto a Tnew[1] Invalid array range, parece ser un rebasamiento del rango. ¡No olvide que la numeración de los elementos de la matriz comienza desde 0!