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

 
Vitaly Muzichenko:

Así parece en los ciclos, y se puede prescindir de la función

Gracias.

Sin embargo, eliminada la función - los frenos permanecen.... maldita sea.

 
Aleksey Vyazmikin:

Gracias.

Sin embargo, eliminada la función - los frenos permanecen.... Maldita sea.

Una vez empecé a reescribir el programa desde 4=>5, entonces en 4, sustituí todas las construcciones como Low[1], Time[0] y otras por otras modernas, es decir,CopyLow,CopyTime, el programa se hizo más rápido incluso en 4. Ahora no utilizo las construcciones antiguas, sólo las nuevas. Así que el código es fácilmente transportable a la 5ª plataforma, sólo hay que cambiar las funciones de comercio

 
Vitaly Muzichenko:

Una vez que empecé a reescribir el programa de 4=>5 y luego reemplacé todas las construcciones como Low[1], Time[0] y otras con las modernas, es decir,CopyLow,CopyTime, el programa se hizo más rápido incluso en 4. Ahora no utilizo las construcciones antiguas, sólo las nuevas. Así que el código es fácilmente transportable a la 5ª plataforma, sólo hay que cambiar las funciones de comercio

¿No esllenar la matriz en cada estornudo un consumo de recursos?

¿Tal vez tenga sentido copiar la información en el array en la apertura de la barra, y luego tomarla de ahí a medida que el código se desarrolla? Opero en la apertura de la barra.


 
Aleksey Vyazmikin:

¿No se consumen recursos alllenar una matriz con cada estornudo?

¿Tal vez tenga sentido copiar la información en la matriz cuando se abre la barra y luego tomarla de ahí a medida que el código avanza? Opero en la apertura de la barra.

El array se puede llenar en una nueva barra, consumirá menos recursos. Si trabajas con iLow[1] en varios sitios, deberías almacenarlo en una variable una vez y leerlo en lugar del array.

Supongamos que esto

// Инициализация TIME[0] TIME[1]
  ArraySetAsSeries(TM,true);
  if(CopyTime(dSymbol,Period(),0,2,TM)<0) return;
  TIME_0=TM[0];
  TIME_1=TM[1];
Entonces trabajamos con las variablesTIEMPO_0 yTIEMPO_1 en lugar deTM[0] yTM[1].
 
Vitaly Muzichenko:

Array puede ser llenado en una nueva barra, tomará menos recursos. Si se trabaja con iLow[1] en varios lugares, por ejemplo, es conveniente escribirlo una vez en una variable, y leer la variable en lugar del array.

Supongamos que

Pero aún así, MT4 es mucho más rápido - estoy decepcionado.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Aleksey Vyazmikin, 2017.07.21 15:07

¿Por qué fantaseas? Entendí tu idea, y confirmé que funciona, y tendrá efecto si la solicitud se hace una vez y si se sabe cuántas barras se necesitan para que el EA funcione.

¿O tal vez sugirió utilizar la estructura de otra manera? Entonces, por favor, explíquelo, ¡pero no se ofenda!


Nada de fantasías. Si necesita obtener 2 o más parámetros de una vela, entonces usando las funciones de sus mensajes/preguntas tendremos que llamar a estas funciones por separado para cada parámetro de la vela. Eso es 2 o más veces para producir Copy***(), pero usando CopyRates() sólo necesita una llamada de Copy.

En cuanto al número a copiar, esa es otra cuestión. Tal vez debamos calcular primero la barra que contiene el valor del indicador requerido y luego copiarla. Si no recuerdo mal, estábamos hablando de una cantidad desconocida para copiar. ¿De qué tipo de fantasía estamos hablando?

En casos extremos, podemos copiar, por ejemplo, 10 compases y buscar entre ellos. Si no se encuentra, copiamos otros 10 compases. Copiar es una operación que consume mucho tiempo, es más barato copiar un array.

En general, hay muchas variaciones. No puedes escribir todo eso en la documentación y no será documentación en absoluto. Lo enseñan en las clases de programación. Pero, por desgracia, no todos los profesores son capaces de hacerlo y no todos los alumnos quieren entenderlo en las clases. Y el comienzo es en las clases de aritmética de 2º a 5º curso, cuando el profesor exige una explicación detallada del problema. Pero aquí los problemas son los mismos.

 
Alexey Viktorov:

No hay nada de lujo. Si necesita obtener 2 o más parámetros de una vela, entonces usando las funciones de sus mensajes/preguntas debe llamar a estas funciones por separado para cada parámetro de la vela. Eso es 2 o más veces para ejecutar Copy***(), pero usando CopyRates() sólo necesitará una llamada de Copy.

En cuanto al número a copiar, esa es otra cuestión. Tal vez, deberíamos calcular primero en qué barra está disponible el valor requerido del indicador, y luego copiarlo. Si no recuerdo mal, se habló de una cantidad desconocida para copiar. ¿De qué tipo de fantasía estamos hablando?

Y, como último recurso, podemos copiar, por ejemplo, 10 compases y buscar en ellos y, si no lo encontramos, copiamos otros 10 compases. Copiar es una operación bastante cara; sería más barato buscar en la matriz.

Hay muchas variantes en este caso. Todo esto no se puede escribir en la documentación; en realidad, ya no será documentación. Lo enseñan en las clases de programación. Pero, por desgracia, no todos los profesores saben cómo hacerlo y no todos los alumnos quieren entenderlo en las clases. Y el comienzo es en las clases de aritmética de 2º a 5º curso, cuando el profesor exige una explicación detallada del problema. Pero aquí los problemas son los mismos.

Sobre la fantasía - era una respuesta a tu afirmación "En lugar de tratar de entender lo que se dijo, para averiguar lo que se obtiene, haces algunas objeciones increíbles", y no al hecho de que la versión que ofreciste es del campo de la fantasía.

Entiendo perfectamente su concepto, y estaba incrustado en la respuesta a usted.

Sin embargo, no entiendo muy bien cómo propones trabajar con una cantidad desconocida de datos, ¿puedes darme un ejemplo en forma de código?


 

Por favor, ayude a auditar y optimizar el indicador usando este enlace https://www.mql5.com/ru/code/16805 - el problema es que el indicador empieza a ralentizarse mucho cuando aparece un gran número de barras - aparece al hacer pruebas.

Quiero saber cómo hacerlo funcionar para que no se calcule en cada tick, sino sólo en la apertura de la barra? El método del Asesor Experto no es adecuado - después del primer tick todos los valores desaparecen y sólo aparecen en la siguiente barra...

Donchian Channel MTF
Donchian Channel MTF
  • votos: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin:

Sobre la fantasía - era una respuesta a tu afirmación "En lugar de tratar de entender lo que se dijo, para averiguar lo que funcionaría, se lanzan algunas objeciones increíbles", y no que la opción que propones sea del reino de la fantasía.

Entiendo perfectamente su concepto, y estaba incrustado en la respuesta a usted.

Sin embargo, no entiendo muy bien cómo propones manejar una cantidad desconocida de datos, ¿puedes darme un ejemplo en forma de código?


La respuesta se dio antes...

Alexey Viktorov:

Como último recurso, puedes copiar, por ejemplo, 10 compases a la vez y buscarlo. Si no lo encuentras, copias otros 10 compases a la vez. La copia es una operación costosa, es más barato buscar en el array.

Pero es mejor que no intentemos obtener el máximo número de barras de la matriz, sino que intentemos hacerlo con una copia.

No voy a escribir un ejemplo de código. Un programador normal sólo necesita una pista. He aquí un ejemplo de algoritmo:

  1. Determine el número aproximado de barras en las que se cruza el canal. Que sean 15.
  2. Copiar los dos buffers del indicador.
  3. Copiar los valores de las barras usando CopyRates()
  4. En el bucle, empezamos a comparar los valores del límite superior del canal y las barras altas simultáneamente con la comparación de las barras bajas con el límite inferior del canal. Si se encuentra uno de estos cruces, el índice de la barra se almacena en una variable, y se continúa buscando el segundo cruce. Salimos del bucle cuando las dos variables de las barras de intersección tienen valores.

Así, es posible encontrar dos intersecciones en una copia y un ciclo, si es necesario. Incluso no es necesario en ArraySetAsSeries() porque al encontrar el cruce es posible y, en mi opinión, mejor recordar la hora de la barra, no su número. Aunque, conociendo la hora del bar, no hay dificultad para determinar su número.

Pregunta: ¿Qué es más rápido, un ciclo con la copia del buffer del indicador en 1 valor y la copia de la barra alta en 1 y la comparación de esos valores o una sola copia de una cierta cantidad y la comparación de los valores de las dos matrices entre sí?

 

Acabo de escribir esto ayer:

Tarea:

en cada tick obtener los elementos "InpCountCopy" open, high, low, close y time.

La puesta en práctica:

  1. bucle de "0" a "InpCountCopy-1" - el bucle obtiene una apertura, alta, baja, cierre y tiempo a la vez.
  2. En un momento dado obtenemos elementos "InpCountCopy" en la estructura MqlRates y luego hacemos un bucle a través de la estructura.

Características:

Puede elegir cómo comprobarlo: en OnTick o en OnTimer (1 segundo).

//+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameter
input int InpCountCopy=1000;
input bool OnTickOnTimer=false; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(OnTickOnTimer)
      EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start=GetMicrosecondCount();
   for(int i=0;i<InpCountCopy;i++) // in one operation we get one element.
     {
      double open=iOpen(i);
      double high=iHigh(i);
      double low=iLow(i);
      double close=iClose(i);
      datetime time=iTime(i);
     }
   ulong end=GetMicrosecondCount()-start;
   string text=(OnTickOnTimer)?"OnTimer":"OnTick";
   text=text+"\n"+"OHLC: "+IntegerToString(end);

//--- for one operation we get "InpCountCopy" elements.
   start=GetMicrosecondCount();
   MqlRates Rates[];
   if(!iRates(Rates,0,InpCountCopy))
      return;
   for(int i=0;i<InpCountCopy;i++)
     {
      double open=Rates[i].open;
      double high=Rates[i].high;
      double low=Rates[i].low;
      double close=Rates[i].close;
      datetime time=Rates[i].time;
     }
   end=GetMicrosecondCount()-start;
   text=text+"\n"+"Rates: "+IntegerToString(end);

   Comment(text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied==1)
      open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied==1)
      high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied==1)
      low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied==1)
      close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied==1)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates(MqlRates  &Rates[],const int index,int count,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   int copied=CopyRates(symbol,timeframe,index,count,Rates);
   if(copied!=count)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


Archivos adjuntos:
Razón de la queja: