Si dices que es malo, dime cómo hacerlo bueno. ¿Mover los cálculos a OnInit?
Reprimenda justa )) Aquí, una variante del código que se publicó aquí:
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
if(prev_calculated == 0) {
limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
}
else limit = rates_total - prev_calculated + 1;
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
}
return(rates_total);
Intenta hacerlo así. No es necesario mover nada a OnInit.
No he publicado dicho código aquí, no es lo mío :)
Utilizo otras construcciones, más sencillas y claras.
Es mío, ¿cómo podría ser más sencillo? ))) (al menos, yo también tengo en mi plantilla el comentariolimit = rates_total - 1;//--- Primera llamada del indicador o cambio de timeframe o carga de datos del histórico) y mi estilo de formato - una llave cerca de for() {
Para aprender a escribir su propio indicador, tome la plantilla anterior y agregue al menos el precio de cierre y obtenga su primer indicador, luego aprenda a hacer el MAH a partir de este precio de cierre
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
Buffer[i] = close[i];
}
No es tu código. Fue publicado por algunos de mis colegas, pero no recuerdo quién y dónde. A este código me refería cuando escribí que no había que mover nada a OnInit pero no el código fuente. No fui muy claro.
¿Y qué construcción recomendaría? Esto parece ser muy simple.
Ah, ahí está el autor de la pieza )))) Por delante de mí. Por cierto, yo también utilizo este estilo de formato: con una llave de apertura en una línea.
Andrei Novichkov: Ah, aquí está el autor del fragmento )))) Por delante de mí. Por cierto, yo también utilizo este estilo de formato: con una llave de apertura en una línea.
Se ejecuta el asistente para crear un indicador, se seleccionan los tipos y el color de las líneas y se añaden las entradas, si es necesario
y eso es todo, el indicador está listo, entonces copiael cuerpo deOnCalculate() de la plantilla y escribe los cálculos ,
puede escribir su primer indicador en 1 minuto, el código "¡Hola palabra I indicador! - He mostrado :)
ZS: Por cierto, los indicadores se pueden transferir de MT4 a MT5 de esta forma, lo principal es configurar correctamente los buffers de los indicadores, en MT5 hay un deslizamiento en la indexación de los arrays bajo los buffers.... son sólo arrays con la indexación habitual de los arrays )))) .... antes era difícil acostumbrarse a la indexación de los buffers de los indicadores en MT4, ahora por el contrario es imposible acostumbrarse y cambiar a MT5 ))))
Este no es su código. Lo publicó uno de mis colegas, pero no recuerdo quién y dónde. Era a este código al que me refería cuando decía que no había que mover nada a OnInit pero no el código fuente. No fui muy claro.
¿Y qué construcción recomendaría? Este parece ser muy sencillo.
Ah, ahí está el autor de la pieza )))) Por delante de mí.
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
sí, ¿para qué sirve el código de la plantilla del indicador? ejecute el asistente para crear un indicador , elija los tipos y el color de las líneas y, si es necesario, agregue entradas
y eso es todo, el indicador está listo, luego copie el cuerpo de la plantilla OnCalculate()y escriba los cálculos,
puede escribir su primer indicador en 1 minuto, el código de arriba es "¡¡¡Hola, palabra I, indicador!!!" Yo mostré :)
PD: por cierto, de esta forma, los indicadores se pueden transferir de MT4 a MT5, lo principal es configurar correctamente los búferes de indicadores, en MT5 hay un horror que con las matrices de indexación para los búferes ... son solo matrices con la matriz habitual)))) indexación .. .. antes era difícil acostumbrarse a la indexación de los búferes de indicadores en MT4, ahora, por el contrario, es imposible acostumbrarse y cambiar a MT5))))
Nada complicado. Un ejemplo de un indicador multiplataforma (usa una clase), pero la plantilla se puede extraer: elimine la clase y todo lo superfluo que dará errores después de eso, la plantilla multiplataforma permanecerá.
Este indicador funcionará de la misma manera en ambas plataformas sin modificaciones, solo compilación con la extensión requerida. Tuve que dividir el código en dos partes: la clase y el indicador en sí (todo estaba en una sola lista)
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
¿Cómo crear una matriz de instancias de clase?
Hice ClassName* className[], luego ArrayResize en él, pero no me da acceso a los métodos
Tu clase, cuyas instancias quieres recoger en un array, debe heredar de CObject.
Y entonces es sencillo: crea una lista (array) de objetos CArrayObj, y añade tus objetos a ella.
Buscando las palabras "plantilla de indicadores" y tu nombre no se encuentra nada, y ya has escrito aquí sobre ese volumen de Guerra y Paz.
Me viene a la mente cualquier combinación de palabras del post.
Bueno, lo siento, sobre la plantilla de indicadores tal vez me confundí - la plantilla de arrastre fue publicada.
Pongámoslo así: cree una plantilla de indicador en el editor, añada el número necesario de variables de entrada y los búferes a dibujar.
A continuación, desglosa lo que tienes que hacer de la tarea específica.
Si dices que es malo, dime cómo hacerlo bueno. ¿Mover los cálculos a OnInit?
Reprimenda justa )) Aquí, una variante del código que se publicó aquí:
Intenta hacerlo así. No es necesario mover nada a OnInit.
Reprimenda justa )) Aquí, una variante del código que se publicó aquí:
Intenta hacerlo así. No es necesario mover nada a OnInit.
No he publicado dicho código aquí - no es lo mío :)
Utilizo otras construcciones, es más sencillo y claro.
En OnInit() debería ser transferido. ¿Por qué hay que asignar un array al buffer del indicador en cada tick?
No he publicado dicho código aquí, no es lo mío :)
Utilizo otras construcciones, más sencillas y claras.
Es mío, ¿cómo podría ser más sencillo? ))) (al menos, yo también tengo en mi plantilla el comentariolimit = rates_total - 1;//--- Primera llamada del indicador o cambio de timeframe o carga de datos del histórico) y mi estilo de formato - una llave cerca de for() {
Para aprender a escribir su propio indicador, tome la plantilla anterior y agregue al menos el precio de cierre y obtenga su primer indicador, luego aprenda a hacer el MAH a partir de este precio de cierre
No he publicado dicho código aquí - no es lo mío :)
Utilizo construcciones diferentes, más sencillas y claras.
No es necesario copiar nada en OnInit(). ¿Por qué querrías asignar un array al buffer del indicador en cada tick?
No es tu código. Fue publicado por algunos de mis colegas, pero no recuerdo quién y dónde. A este código me refería cuando escribí que no había que mover nada a OnInit pero no el código fuente. No fui muy claro.
¿Y qué construcción recomendaría? Esto parece ser muy simple.
Ah, ahí está el autor de la pieza )))) Por delante de mí. Por cierto, yo también utilizo este estilo de formato: con una llave de apertura en una línea.Ah, aquí está el autor del fragmento )))) Por delante de mí. Por cierto, yo también utilizo este estilo de formato: con una llave de apertura en una línea.
Se ejecuta el asistente para crear un indicador, se seleccionan los tipos y el color de las líneas y se añaden las entradas, si es necesario
y eso es todo, el indicador está listo, entonces copiael cuerpo deOnCalculate() de la plantilla y escribe los cálculos ,
puede escribir su primer indicador en 1 minuto, el código "¡Hola palabra I indicador! - He mostrado :)
ZS: Por cierto, los indicadores se pueden transferir de MT4 a MT5 de esta forma, lo principal es configurar correctamente los buffers de los indicadores, en MT5 hay un deslizamiento en la indexación de los arrays bajo los buffers.... son sólo arrays con la indexación habitual de los arrays )))) .... antes era difícil acostumbrarse a la indexación de los buffers de los indicadores en MT4, ahora por el contrario es imposible acostumbrarse y cambiar a MT5 ))))Este no es su código. Lo publicó uno de mis colegas, pero no recuerdo quién y dónde. Era a este código al que me refería cuando decía que no había que mover nada a OnInit pero no el código fuente. No fui muy claro.
¿Y qué construcción recomendaría? Este parece ser muy sencillo.
Ah, ahí está el autor de la pieza )))) Por delante de mí.sí, ¿para qué sirve el código de la plantilla del indicador? ejecute el asistente para crear un indicador , elija los tipos y el color de las líneas y, si es necesario, agregue entradas
y eso es todo, el indicador está listo, luego copie el cuerpo de la plantilla OnCalculate() y escriba los cálculos,
puede escribir su primer indicador en 1 minuto, el código de arriba es "¡¡¡Hola, palabra I, indicador!!!" Yo mostré :)
PD: por cierto, de esta forma, los indicadores se pueden transferir de MT4 a MT5, lo principal es configurar correctamente los búferes de indicadores, en MT5 hay un horror que con las matrices de indexación para los búferes ... son solo matrices con la matriz habitual)))) indexación .. .. antes era difícil acostumbrarse a la indexación de los búferes de indicadores en MT4, ahora, por el contrario, es imposible acostumbrarse y cambiar a MT5))))Nada complicado. Un ejemplo de un indicador multiplataforma (usa una clase), pero la plantilla se puede extraer: elimine la clase y todo lo superfluo que dará errores después de eso, la plantilla multiplataforma permanecerá.
Este indicador funcionará de la misma manera en ambas plataformas sin modificaciones, solo compilación con la extensión requerida. Tuve que dividir el código en dos partes: la clase y el indicador en sí (todo estaba en una sola lista)
Clase:
Indicador: