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

 

6.Parece que falta:

TradePerformer( 4, Symb4, Trade4, StLoss4, TkProfit4, Lots4, Slippage4, UpSignal, DnSignal, UpStop, DnStop);

en Exp_TEMA.mq5 ?

 
ias:

6.Parece que falta

en Exp_TEMA.mq5?

¡Sí! ¡Debo haber trabajado demasiado y me he sobrecalentado con un calor tan anormal!
 
Renat:

Por favor, haz un ejemplo reproducible. Es decir, necesitas un código listo que puedas compilar, lanzar en un gráfico y obtener resultados.

Sin esto, poca gente entenderá de qué estamos hablando.

Pensé en recortar para no desanimar a la gente por nada.

Aquí está la versión completa:

#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);
   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;

//--------------------------------------------------------------------
   //1 entrada rates_total = 9667 / prev_calculated = 0 / Bars = 9667
   //-- entonces rates_total = 9667 / prev_calculated = 9667 / Bars = 9667
   //-- en proceso entonces rates_total = 9668 / prev_calculated = 9667 / Bars = 9668
   //Imprimir("tarifas_total: " + (cadena)tarifas_total);
   if (rates_total == prev_calculated) return (rates_total);//-- Sigue siendo el mismo bar, así que estamos fuera...

   //-- Obtener el número de barras no procesadas (en la primera entrada es todas, luego 1)
   //-- El número de barras de salida se refiere al gráfico en sí, pero estaremos dando salida a otro instrumento
   //-- el número de barras puede ser diferente, así que primero volcamos todos los datos en el buffer --
   Counted_bars = rates_total-prev_calculated;
   
   // Print("Barras_contadas: " + Barras_contadas);
   Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));
   //-- Asignar memoria por el número de compases del instrumento principal --
   if (ArrayResize(ArrayBuffer, Counted_bars,0) == -1) return (rates_total);//-- Error de asignación de memoria --
   //--- inicializar los elementos del array con el valor EMPTY_VALUE ----
   ArrayInitialize(ArrayBuffer,EMPTY_VALUE);
         
   //-- Obtener cuántas barras tiene este instrumento --
   copied = (int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   
   if (copied > 0){
      copied=CopyClose(InstrumentName,0,0,copied,ArrayBuffer);//-- Escribir datos en el buffer de memoria --
      if (copied <= 0) return (rates_total);//-- error
   } 
   else{

      return (rates_total);//-- error 
   }
    
   if (Counted_bars > copied) Counted_bars = copied;//-- Toma el valor más bajo --

   Counted_bars--;//-- Ya que contando desde 0 --
   //-- Los datos se cargan en el buffer de memoria, ahora escríbelos en el buffer de pantalla de derecha a izquierda --
   for (int i = Counted_bars; i > 0; 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.
}
 

¿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.

 
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.


No estoy seguro de la corrección de la implementación y el algoritmo en general, pero basado en el código y lo que yo era capaz de hacer con él, supongo que:

La cadena

// Print("Barras_contadas: " + Barras_contadas);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));

debería tener este aspecto

// Print("Barras_contadas: " + Barras_contadas);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(InstrumentName,Period()));


Tal vez sería más correcto cambiar el punto en todas partes como "0" a PERIOD_CURRENT.

Por lo menos todo funcionó para mí después de tales cambios.....

PS

Tal vez no es relevante, pero de esta manera el compilador importa mucho menos

Print("rates_total: ",rates_total," / prev_calculated: ",prev_calculated," / Bars: ",Bars(InstrumentName, PERIOD_CURRENT));
 
Interesting:

No estoy seguro de la implementación correcta y el algoritmo en general, pero basado en el código y lo que pude hacer con él voy a suponer que:

La cadena

debería tener este aspecto

PS

Tal vez sería más correcto cambiar el período en todas partes como "0" a PERIOD_CURRENT.

Por lo menos todo funcionó para mí después de tales cambios....

Cambiado, sigue sin funcionar, el gráfico no se corresponde con la realidad.
 

En mi pantalla se ve así:


Claramente mal.
 

Así es como me resultó a mí

Pero como no entré en la lógica del inductor y su implementación, no me corresponde juzgar la corrección de los resultados.


PS

Igual me desharía del símbolo en el parámetro y lo haría por el símbolo actual y TF, y luego lo usaría en Expert Advisor u otra herramienta usando el iCustom() habitual.

Además, no entiendo muy bien la lógica de trabajar con buffers (me refiero a la cola de la calculadora y demás). En mi opinión, hay mucho que trabajar en....

Archivos adjuntos:
proba.mq5  4 kb
 
Interesting:

Eso es lo que tengo

Pero como no entré en la lógica del inductor y su implementación, no me corresponde juzgar la corrección de los resultados.


PS

Yo aún me desharía del símbolo en el parámetro y lo haría de acuerdo con el símbolo actual y TF, y luego lo usaría en Expert Advisor o cualquier otra herramienta usando el iCustom() habitual.


Gracias por el consejo, lo probaré.
 

Interesting:

Además, no entiendo muy bien la lógica de trabajar con buffers (me refiero a la cola de la calculadora y demás). En mi opinión, hay mucho que trabajar en....


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....