Indicadores: Mejor volumen - página 2

oomeysh #:
He aplicado este indicador en mt5, pero no aparece nada... arriba
Vaya a los ajustes de entrada del indicador y cambie el - Tipo de Volumen Utilizado de Volumen Real a Volumen Tick.

Se lo pasé a Claude Sonnet 5.5 y me dijo:

Lo bueno

  • La disposición de los búferes es correcta: 3 búferes para 2 gráficos (datos del histograma + índice de colores, más la línea MA).
  • La lista de colores coincide con la paleta clásica de Better Volume. Los índices del 0 al 5 coinciden con los comentarios.
  • Las comprobaciones de igualdad como IntTimesRange == IntMaxTimesRange son seguras en este caso. El máximo de la ventana se calcula con la misma expresión, por lo que los valores de tipo double coinciden exactamente cuando la barra actual es la máxima.
  • El recálculo a partir de prev_calculated - 1 actualiza correctamente la barra en formación.

Errores, empezando por los más graves

1. Bloqueo por valor fuera de rango en historiales cortos (líneas 63-69). El límite de «
» solo se restringe en la primera llamada. Supongamos que un gráfico semanal o mensual tiene 50 barras y «minbars» es 100. La primera llamada omite el bucle y devuelve `rates_total`. En el siguiente tick, `prev_calculated` es 50, por lo que el límite es 49. El bucle de la media móvil lee entonces `n = -1` y el indicador se bloquea con el mensaje«array fuera de rango». Solución:

mql5

if(rates_total <= minbars) return(0); limit = (prev_calculated == 0) ? minbars : MathMax(prev_calculated - 1, minbars);

2. El «Climax Churn» (magenta) se pierde en las barras bajistas (líneas 116-121).
El bloque «Climax Sell» se ejecuta después de «Climax Churn» y lo sobrescribe. Por lo tanto, una barra que sea a la vez un clímax de rango de volumen y una barra de «churn» solo se muestra en magenta si ha cerrado por encima del punto medio. Si ha cerrado por debajo, se muestra en blanco. La prioridad prevista es que el «climax churn» tenga prioridad sobre todo lo demás.

3. La «comprobación adicional de fluctuación» nunca puede activarse (líneas 123-125).
IntCandleRange > IntMiddlePrice * 2 se expande a máximo - mínimo > máximo + mínimo, lo cual solo es cierto si mínimo < 0. Para cualquier instrumento normal, esa condición es código muerto. Probablemente la intención era una comparación con un rango medio o similar, por lo que hay que redefinirla en lugar de limitarse a corregirla.

4. El valor fijo 20 ignora InpLookBack (línea 105).
Todo lo demás utiliza InpLookBack, pero la prueba de bajo volumen utiliza i - 19, 20. Cualquier valor distinto de 20 hace que las clases sean inconsistentes. Si InpLookBack se establece por encima de 20, la detección de bajo volumen sigue analizando solo 20 barras.

5. Los datos de volumen cero provocan señales falsas, y el valor por defecto es una trampa.

  • El valor por defecto es VOLUME_REAL, que es 0 en la mayoría de los símbolos de divisas y CFD.
  • Con un volumen totalmente nulo, IntTimesRange (0) == IntMaxTimesRange (0) e IntDividedRange (0) == IntMaxDividedRange (0) son ambas verdaderas. El gráfico se llena de colores de «clímax» y «agitación de clímax».
  • Protege los indicadores con > 0 y establece el valor por defecto en VOLUME_TICK.

6. No hay validación de entradas en OnInit.
InpMAPeriod <= 0 provoca una división por cero. InpLookBack <= 0 rompe la lógica de la ventana. Devuelve INIT_PARAMETERS_INCORRECT en estos casos.

Puntos menores

  • NormalizeDouble(..., 0) redondea la media móvil (MA) a un entero, lo que distorsiona la línea en los símbolos de bajo volumen. No es necesario.
  • Las barras anteriores a las «minbars» nunca se escriben, y PLOT_DRAW_BEGIN no está activado. Actívalo e inicializa los búferes para que las primeras barras no muestren datos erróneos.
  • La media móvil puede comenzar en MAPeriod - 1, no en MAPeriod. Utilizar una suma acumulada en lugar de volver a sumar 100 barras por barra también sería más rápido.
  • Las expresiones ternarias repetidas «InpVolumeType == VOLUME_TICK ? ... : ...» quedarían más limpias si se agruparan en una pequeña función auxiliar.


    Se adjunta la versión corregida por Claude y traducida al inglés. (Haz clic en «ir a la discusión» para ver el archivo)
Archivos adjuntos: