Errores, fallos, preguntas - página 1936

 
Aleksey Vyazmikin:

Todavía no está listo para mostrar el código debido a

Pero listo para mostrar los resultados de los perfiles de MT5 - como entiendo las funciones de comercio están fuera de la cuestión.



Para el entorno OHLC utilizo las siguientes funciones

¿Quizás estoy haciendo algo mal?

Desgraciadamente, lo estás haciendo mal.

En lugar de escribir un código MQL5 nativo y eficiente, se utiliza un emulador MQL4 terriblemente ineficiente que ralentiza la operación decenas de veces.

Lo malo es que ni siquiera sabes lo que estás haciendo, ya que estás haciendo preguntas sobre la velocidad.
 
Aleksey Vyazmikin:

el resultado es el siguiente código

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • votos: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

Gracias - He visto esta biblioteca - la descripción era confusa


Lamayor parte del tiempo se emplea en la fase de inicialización. A no ser que tenga previsto acceder a los datos de las series temporales varias veces -más de unos cuantos miles de veces durante la formación de las barras-, debería considerar métodos alternativos.

Mi Asesor Experto sólo funciona en la apertura de la barra - ¿crees que tiene sentido probarlo?
 
Renat Fatkhullin:

Desgraciadamente, lo estás haciendo mal.

En lugar de escribir un código MQL5 nativo y eficiente se utiliza un emulador MQL4 terriblemente ineficiente, que ralentiza la operación decenas de veces.

Lo malo es que ni siquiera entiendes lo que haces, ya que preguntas por la velocidad.

Por supuesto, estaba buscando una solución - cómo reemplazar las funciones de MQL4 con MQL5, en particular refiriéndose a las series de tiempo, y vi que este es uno de los problemas encontrados por la mayoría de la gente que se mueve a MQL5.

En consecuencia, encontré la solución en el mismo sitio web, donde uno de los artículos recomendaba mi método.

Personalmente, no entiendo la razón para excluir una función buena y práctica del lenguaje.

Así que mi pregunta es, ¿cuál es la forma correcta de recibir información, y cómo se pueden aprovechar las ventajas de MQL5?

 
Aleksey Vyazmikin:

Así que mi pregunta es: ¿cómo organizar correctamente la recepción de datos para sentir las ventajas de MQL5?

Utilizar las funciones nativas y más productivas de MQL5, y no aferrarse al código de MQL4. Cualquier convertidor/divisor MQL4 -> MQL5 tiene un rendimiento decenas de veces más lento, ya que intenta emular las microfunciones de acceso directo de MQL4 a través de las operaciones masivas de MQL5. Y la emulación se hace completamente sin optimización ni caché.

En la raíz del uso de una función concreta (un trozo de código, incluido el código de otras personas), debe haber una comprensión de lo que se hace exactamente. De lo contrario, se obtiene "¡acabo de utilizar el código de otra persona y la velocidad ha bajado! No se puede obtener un buen resultado sin entender la herramienta y lo que se hace con ella.


Además de "cómo hacerlo bien", debo aclarar que la tarea de "aprender a programar" es extremadamente difícil, en cuanto se supera el nivel más básico de operar (ni siquiera de entender, sino de operar) con un lenguaje. Así que no veo otra forma de aprender más que leyendo montones de artículos, documentación, código ya hecho en la biblioteca y la práctica obligatoria durante varios años.
 
Renat Fatkhullin:

Utilice las funciones nativas y más productivas del lenguaje MQL5 y no se aferre al código MQL4.

En la raíz del uso de una función particular (un trozo de código, incluyendo el código de otras personas) debe haber una comprensión de lo que se está haciendo. De lo contrario, obtendrás "Acabo de utilizar el código de otra persona, mira: ¡la velocidad ha bajado! Sin entender la herramienta y lo que se hace con ella, no se puede obtener un buen resultado.


Además de "cómo hacerlo bien", debo aclarar que la tarea de "aprender a programar" es extremadamente difícil, una vez que se supera el nivel más básico de operar (ni siquiera entender, sino operar) con el lenguaje. Por eso no veo otra forma de aprender que leer artículos, documentación, código listo en la biblioteca y practicar durante varios años.

Renat, ¿has mirado el código base? Tengo un código con funciones exactamente adaptadas del lenguaje MQL4.

Te pido específicamente que escribas cómo conseguir la información correcta sobre el medio ambiente - referirte a libros abstractos no es productivo y sólo refuerza mi idea (probablemente errónea) de que esto es sólo una excusa que no puedes comprobar.

Decir que soy tan tonto que no entiendo el significado de una función, que es copiar información en un array, es decir que la documentación que acompaña al lenguaje de programación es escasa. No entiendo el beneficio de este copiado de un array a otro y por qué una función que obtiene información de un array según sea necesario es un código terrible.

 
Aleksey Vyazmikin:

Por supuesto, estaba buscando una solución: cómo sustituir las funciones de MQL4 por las de MQL5, sobre todo en lo que se refiere a las series temporales, y vi que éste era uno de los problemas con los que se encontraba la mayoría de la gente que se pasaba a MQL5.

En consecuencia, encontré la solución en el mismo sitio web, donde uno de los artículos recomendaba mi método.

Personalmente, no entiendo la razón para excluir una función buena y práctica del lenguaje.

Por eso te pregunto, ¿cuál es la forma correcta de recibir información para que sienta las ventajas de MQL5?

¿Quizás he buscado mal? Aquí tienes todo lo que necesitas en lugar de todo este código en una sola copia

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

Errores, fallos, preguntas

Aleksey Vyazmikin, 2017.07.21 01:20

Gracias, lo he corregido.

Como resultado, el código es el siguiente

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

El tiempo en el probador ha aumentado, ya estoy cansado de esperar :)

Para utilizarlo, sólo hay que entender cuál es la estructura

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

¿Tal vez no estaba buscando lo suficiente? Aquí, en una sola copia tienes todo lo que necesitas en lugar de todo este código

Para utilizarlo, sólo hay que entender cuál es la estructura



Nos pasa lo mismo, de hecho...

La variante que sugieres se adapta a ifle:

- El cálculo se realiza sólo en la apertura de un bar.

- Se sabe de antemano cuántas barras se necesitan

Tengo bucles en mi código, la cantidad de cálculo puede ser desconocida de antemano.

Y, ¿qué sentido tiene copiar la información de, digamos, 300 barras cada vez que la abrimos, si sería más razonable añadir simplemente información sobre una nueva barra?

 
Lo siento, pero no tengo tiempo para ocuparme de enseñar programación a todos los principiantes. Sobre todo cuando ves que la persona ni siquiera ha pasado por lo básico para entender la programación y pregunta cosas triviales.


Pero te mostraré la dirección:

  1. Documentación de MQL5
  2. Base de código
  3. Artículos
  4. Foro (no en plan "escribe para mí, ¿por qué no me enseñas y haces mi trabajo?")
  5. Autónomos (pueden escribirlo correctamente aquí)
  6. Trabajo independiente con un análisis reflexivo de "¿por qué esta envoltura debe ralentizar y desperdiciar recursos, tal vez reescribir de manera óptima?"
  7. Utilizar un perfilador que muestre el consumo real de recursos en cada línea de código
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

No tengo ningún deseo de comunicarme de esta manera. En lugar de tratar de entender lo que se dice, de averiguar lo que va a pasar, se lanzan algunas objeciones increíbles.