¿Por qué te peleas? ¿Por qué no hacemos algo útil juntos?
Stanislav publicó un script fantásticamente útil en KB. Crea fácilmente archivos con archivos MQL y recursos.
Tengo un EA con cientos de archivos mqh. Usando el script ahora puedo transferir fácilmente mi EA al código fuente, controlar las versiones y compartir con otros.
This script allows you to assemble a zip-file of your MQL5-program with all dependencies automatically. The dependencies are: included source files via #include directive (both modes of absolute () and relative ("") references are supported); icons linked by #property icon directive; resources (images, sounds, and other types) embedded by...
Anton Shpilyuk:
2) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)
это так?
Sobre el tema de "obtener el índice de barras por tiempo copiado"
¡Horror, realmente lo es! La tarea consistía en obtener las barras del marco temporal M1 en el indicador, aunque el propio indicador funciona en el marco temporal M5.
1. tuvimos que inicializar el marco temporal deseado en OnCalculate() para cargarlo antes del inicio del indicador (después de la inicialización el FirstStartFlag = false;). Recuerda que en los indicadores, si no está cargado, dará -1 o no está completamente cargado, por lo que comprobamos cuánto está cargado, si no es suficiente, vamos al principio dereturn(0);
declarar la matriz MqlRates rates[]; al principio, dondecnt_bars*5; - recalcular el número de barras M5 en M1
//--- загрузка данных М1 таймфрейма для поминутной экспирации в оптимизаторе if(FirstStartFlag)
{
int count = cnt_bars*5;
int copied=CopyRates(_Symbol,PERIOD_M1,0,count,rates);
if(copied>0)
{
if(debug) Print("Скопировано баров: "+IntegerToString(copied)+", надо было "+IntegerToString(count));
if(copied<count)
{
Print("Не удалось получить достаточно исторических данных, ждем");
return(0);
}
}
else
{
Print("Не удалось получить исторические данные, ждем");
return(0);
}
ArraySetAsSeries(rates,true);
}
Después, actualizamos los datos históricos de M1 en el cuerpo de la función requerida cada vez que realizamos cálculos:
//--- загрузка актуальных данных М1 таймфрейма для поминутной экспирации в оптимизаторе int count = cnt_bars*5;
copied=CopyRates(_Symbol,PERIOD_M1,0,count,rates);
if(copied>0)
{
Print("cnt_Statist() Скопировано баров: "+IntegerToString(copied)+", надо было "+IntegerToString(count));
if(copied<count)
{
Print("cnt_Statist() Не удалось получить достаточно исторических данных");
}
}
else
{
Print("cnt_Statist() Не удалось получить исторические данные");
}
ArraySetAsSeries(rates,true);
Además, en el bucle de barras M5, hacemos un bucle incrustado de búsqueda del índice de la barra M1 correspondiente,siendo time[s] la barra M5 actual del marco temporal que se está procesando:
Y luego usamos este índice para encontrar los datos necesarios de la barra M1, en mi caso son rates[IndexRates-5].time y rates[IndexRates-k-4].close
Menos mal que este bucle anidado recorre las barras rápidamente, incluso en un historial de 90 días. Pero me gustaría poder buscar índices de barras en el array rates[].time como una búsqueda binaria utilizando la función ArrayBsearch
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Breve resumen del fallo: Cuando hay herencia de clases A <= B <= C <= D y se implementan dos funciones de sobrecarga, por ejemplo, una con el parámetro A* y otra con el parámetro B*, Cuando se pasa un objeto C* o D* a una función de este tipo, el MQL provoca un error de compilación "llamada ambigua a una función sobrecargada".
Pregunta: ¿Existe una solución más sensata para este error idiota que la presentada anteriormente?
Sergey Dzyublik: El MQL está desmoralizando poco a poco:
Breve resumen del fallo: Cuando hay herencia de clases A <= B <= C <= D y se implementan dos funciones, por ejemplo, una para A* y otra para B*, Al pasar un objeto C* o D* a una función de este tipo, el MQL provoca un error de compilación "llamada ambigua a una función sobrecargada".
Pregunta: ¿Existe una solución más sensata para este error idiota que la presentada anteriormente?
Pues bien, el STL no se transpone uno a uno. Hay que fijarse bien en los detalles. La forma más fácil es escribir toda la funcionalidad posible en los métodos abstractos de una clase base o interfaz, y en los descendientes - ya sea implementación o =delte. En este caso, es necesario pasar punteros o referencias del mismo tipo a los métodos de la clase base. Aunque hay un mal inevitable en la forma de una tabla virtual, pero es mejor arreglar la arquitectura de tal manera que no haya ramificaciones dinámicas_cast costosas en ninguna parte.
¿Por qué te peleas? ¿Por qué no hacemos algo útil juntos?
Stanislav publicó un script fantásticamente útil en KB. Crea fácilmente archivos con archivos MQL y recursos.
Tengo un EA con cientos de archivos mqh. Usando el script ahora puedo transferir fácilmente mi EA al código fuente, controlar las versiones y compartir con otros.
Gracias. Intentaré desglosarlo y comprobar las opciones con los eventos del gráfico.
Echa un vistazo al hilo, recientemente se trató el tema en detalle -https://www.mql5.com/ru/forum/327888
Anton Shpilyuk: 2) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы) это так?Sobre el tema de "obtener el índice de barras por tiempo copiado"
¡Horror, realmente lo es! La tarea consistía en obtener las barras del marco temporal M1 en el indicador, aunque el propio indicador funciona en el marco temporal M5.
1. tuvimos que inicializar el marco temporal deseado en OnCalculate() para cargarlo antes del inicio del indicador (después de la inicialización el FirstStartFlag = false;). Recuerda que en los indicadores, si no está cargado, dará -1 o no está completamente cargado, por lo que comprobamos cuánto está cargado, si no es suficiente, vamos al principio dereturn(0);
declarar la matriz MqlRates rates[]; al principio, dondecnt_bars*5; - recalcular el número de barras M5 en M1
Después, actualizamos los datos históricos de M1 en el cuerpo de la función requerida cada vez que realizamos cálculos:
Además, en el bucle de barras M5, hacemos un bucle incrustado de búsqueda del índice de la barra M1 correspondiente,siendo time[s] la barra M5 actual del marco temporal que se está procesando:
Y luego usamos este índice para encontrar los datos necesarios de la barra M1, en mi caso son rates[IndexRates-5].time y rates[IndexRates-k-4].close
Menos mal que este bucle anidado recorre las barras rápidamente, incluso en un historial de 90 días. Pero me gustaría poder buscar índices de barras en el array rates[].time como una búsqueda binaria utilizando la función ArrayBsearch
Breve resumen del fallo:
Cuando hay herencia de clases A <= B <= C <= D
y se implementan dos funciones de sobrecarga, por ejemplo, una con el parámetro A* y otra con el parámetro B*,
Cuando se pasa un objeto C* o D* a una función de este tipo, el MQL provoca un error de compilación "llamada ambigua a una función sobrecargada".
Pregunta: ¿Existe una solución más sensata para este error idiota que la presentada anteriormente?
Aquí vamos con más "Por qué MQL != C++"...
¿Por qué comentar algo si no se ha llegado al fondo del asunto?
¿Por qué comentar algo si no se ha llegado al fondo del asunto?
Porque hace tiempo que abrí un tema para esas aclaraciones (porque nadie como tú podría hacerlo por sí mismo).
¡Y luego que la diferencia de idiomas no tiene nada que ver con los errores o bugs!
El MQL está desmoralizando poco a poco:
Breve resumen del fallo:
Cuando hay herencia de clases A <= B <= C <= D
y se implementan dos funciones, por ejemplo, una para A* y otra para B*,
Al pasar un objeto C* o D* a una función de este tipo, el MQL provoca un error de compilación "llamada ambigua a una función sobrecargada".
Pregunta: ¿Existe una solución más sensata para este error idiota que la presentada anteriormente?
Pues bien, el STL no se transpone uno a uno. Hay que fijarse bien en los detalles. La forma más fácil es escribir toda la funcionalidad posible en los métodos abstractos de una clase base o interfaz, y en los descendientes - ya sea implementación o =delte. En este caso, es necesario pasar punteros o referencias del mismo tipo a los métodos de la clase base. Aunque hay un mal inevitable en la forma de una tabla virtual, pero es mejor arreglar la arquitectura de tal manera que no haya ramificaciones dinámicas_cast costosas en ninguna parte.