velas transacciones tradingview ticks renco qué ninjatrader mt4 metatrader gráfico grafico graficas barras algorithm optimization paint

algorithm - transacciones - ticks tradingview



Algoritmo Tickmark para un eje de gráfico (5)

¿Cuál es tu lenguaje de desarrollo? Tengo un control gráfico en C ++ que resuelve este problema fácilmente usando una combinación de logaritmo, cellos, etc. Si quieres puedes explicar el código por ti.

Estoy buscando un algoritmo que coloque marcas en un eje, dado un rango para mostrar, un ancho para mostrarlo y una función para medir el ancho de una cuerda para una marca.

Por ejemplo, dado que necesito mostrar entre 1e-6 y 5e-6 y un ancho para mostrar en píxeles, el algoritmo determinaría que debo poner marcas (por ejemplo) en 1e-6, 2e-6, 3e-6 , 4e-6 y 5e-6. Dado un ancho menor, podría decidir que la ubicación óptima está solo en las posiciones pares, es decir, 2e-6 y 4e-6 (ya que poner más marcas haría que se superpongan).

Un algoritmo inteligente daría preferencia a los tickmarks en múltiplos de 10, 5 y 2. Además, un algoritmo inteligente sería simétrico en torno a cero.


He estado usando la biblioteca de gráficos jQuery flot . Es de código abierto y hace bastante bien la generación de ejes / tics. Sugeriría mirar su código y pellizcar algunas ideas desde allí.


Tome el segmento más largo de cero (o el gráfico completo, si el cero no está en el rango); por ejemplo, si tiene algo en el rango [-5, 1], tome [-5,0].

Calcula aproximadamente cuánto tiempo durará este segmento, en tics. Esto solo está dividiendo la longitud por el ancho de una marca. Entonces supongamos que el método dice que podemos poner 11 ticks de -5 a 0. Este es nuestro límite superior. Por el lado más corto, simplemente reflejaremos el resultado en el lado más largo.

Ahora intente poner tantos (hasta 11) ticks en, de manera que el marcador para cada tic en la forma i * 10 * 10 ^ n, i * 5 * 10 ^ n, i * 2 * 10 ^ n, donde n es un número entero, y yo el índice del tic. Ahora es un problema de optimización: queremos maximizar la cantidad de tics que podemos poner, al mismo tiempo que minimizamos la distancia entre el último tic y el final del resultado. Asigne un puntaje para obtener tantos ticks como podamos, menos que nuestro límite superior, y asigne un puntaje para obtener el último tick cercano a n - tendrá que experimentar aquí.

En el ejemplo anterior, pruebe n = 1. Obtenemos 1 tic (en i = 0). n = 2 nos da 1 tick, y estamos más lejos del límite inferior, por lo que sabemos que tenemos que ir hacia el otro lado. n = 0 nos da 6 tics, en cada punto de punto entero. n = -1 nos da 12 tics (0, -0.5, ..., -5.0). n = -2 nos da 24 tics, y así sucesivamente. El algoritmo de puntuación les dará a cada uno una puntuación; más alto significa un mejor método.

Haga esto de nuevo para i * 5 * 10 ^ n, e i * 2 * 10 ^ n, y tome el que tenga el mejor puntaje.

(como un algoritmo de puntuación de ejemplo, supongamos que el puntaje es la distancia al último tic multiplicado por el número máximo de ticks menos el número necesario. Esto probablemente será malo, pero servirá como un punto de partida decente).



Este algoritmo simple produce un intervalo que es múltiple de 1, 2 o 5 veces una potencia de 10. Y el rango del eje se divide en al menos 5 intervalos. El ejemplo de código está en lenguaje Java:

protected double calculateInterval(double range) { double x = Math.pow(10.0, Math.floor(Math.log10(range))); if (range / x >= 5) return x; else if (range / (x / 2.0) >= 5) return x / 2.0; else return x / 5.0; }

Esta es una alternativa, para un mínimo de 10 intervalos:

protected double calculateInterval(double range) { double x = Math.pow(10.0, Math.floor(Math.log10(range))); if (range / (x / 2.0) >= 10) return x / 2.0; else if (range / (x / 5.0) >= 10) return x / 5.0; else return x / 10.0; }