SuperTrend V.1 - Sistema de líneas de tendencia súper

El autor:La homilía, Creado: 2020-04-20 22:10:36, Actualizado: 2023-10-08 19:57:57

img

Primero, el origen de la historia

Mi buen amigo Vago ha observado este indicador durante mucho tiempo y me lo recomendó antes del Año Nuevo para discutir si se puede convertir en una cuantificación. La pena es que el procrastinador haya cometido un error y haya tardado hasta ahora en ayudarlo a cumplir su deseo, en realidad, recientemente la comprensión de los algoritmos se ha disparado. Espere algún día escribir un traductor de pines. Todo en python. Para no decir más tonterías, vamos a dar un vistazo a la línea de supertendencia de esta leyenda.

2o, Introducción al sistema

CMC Markets es una nueva generación de sistema de negociación inteligente.En este artículo se describe el sistema.img

En la nueva generación de sistemas de negociación inteligentes en CMC Markets, se puede usar el ajuste de la línea de tendencia supertrend en los indicadores técnicos. Como se muestra en el gráfico, se puede ajustar el color de la broma y el detalle grueso de acuerdo con sus preferencias de señales de subida, señales de caída. Entonces, ¿qué es un indicador de supertrend? Antes de entender la fórmula del indicador de supertrend, es necesario entender el ATR, ya que el supertrend utiliza el valor del ATR para calcular el valor del indicador.

Los principales algoritmos se muestran a continuación en un gráfico.img

En términos generales, la descripción principal es el canal HL2 (k línea media de precios) multiplicado por n veces ATR. Sin embargo, el artículo es más sencillo. No hay algoritmos detallados. Luego pensé en la comunidad más popular, Tradingview. No es de extrañar.img

En el gráfico, parece que coincide con la tendencia; pero lamentablemente es sólo una señal de alerta de Alert.

3. Aprender código fuente

Si el código no es demasiado largo, vamos a traducirlo y probarlo.imgEl código completo de pine está aquí.

Cuatro, el cambio de código.

Aquí en FMZ hemos creado una nueva estrategia llamada SuperTrade.img

Y luego vamos a poner dos parámetros Factor, Pd.img

Para simplificar mejor el código y hacer que sea más fácil de entender, usamos el paquete de extensión de datos avanzado de Python.los pandas

Al mediodía le pregunté a la maestra si FMZ apoyaba la biblioteca. El profesor de Dream Dream es realmente muy bueno.

1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. Configurar un ciclo de doTicker para detectar una vez durante 15 minutos.Se ejecuta el código en ciclos de 15 minutos Luego escribimos las principales estrategias en doTicker.

import pandas as pd
import time

def main():
    exchange.SetContractType("quarter")
    preTime = 0
    Log(exchange.GetAccount())
    while True:
        records = exchange.GetRecords(PERIOD_M15)
        if records and records[-2].Time > preTime:
            preTime = records[-2].Time
            doTicker(records[:-1])
        Sleep(1000 *60)
        

4. vamos a obtener el OHCLV de la línea k, así que usamos GetRecords 5. importamos los datos que hemos recuperado en pandas M15 = pd.DataFrame (records) M15.columns = [Ángulo de tiempo, Ángulo abierto, Ángulo alto, Ángulo bajo, Ángulo cercano, Ángulo de volumen, Ángulo de interés abierto]En realidad, es cambiar las primeras letras de "open", "high", "low", "close" a letras pequeñas, lo que facilita la escritura de código más tarde sin escribir en mayúscula o en mayúscula.

def doTicker(records):
    M15 = pd.DataFrame(records)
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  

7. Añadir una columna a la colección de datos hl2 hl2= ((high+low) /2)

#HL2
M15['hl2']=(M15['high']+M15['low'])/2

8.接着我们来计算ATRComo el cálculo de ATR tiene que importar una longitud de variable, su valor de toma es Pd

A continuación, revisamos el manual de la lengua macedonia y los pasos del algoritmo para obtener la media de amplitud real de la oscilación ATR: TR: MAX (MAX), ABS (REF), CLOSE, 1) (HIGH) y ABS (REF) (CLOSE, 1) (LOW); ATR: RMA (TR,N)

El valor de TR es el mayor de los tres valores de diferencia. 1, el rango de fluctuación entre el precio más alto y el precio más bajo del día de negociación actual 2, el rango de oscilación entre el precio de cierre del día anterior y el precio más alto del mismo día REF ((CLOSE, 1) - HIGH) 3, el margen de oscilación entre el precio de cierre del día anterior y el precio más bajo del día anterior REF ((CLOSE, 1) - LOW) Así que TR: MAX (MAX) (HIGH-LOW), ABS (REF) (CLOSE, 1) (HIGH)), ABS (REF) (CLOSE, 1) (LOW));

En el cálculo de Python

M15['prev_close']=M15['close'].shift(1)

Para obtener los datos de la línea anterior, primero hay que establecer un prev_close, es decir, mover 1 a la derecha de la cuadrícula para crear un nuevo parámetro

ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]

A continuación, se define una variable intermedia que registra el conjunto de los 3 valores de comparación de TR.

M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)

En el conjunto de datos que definimos, una nueva columna se llama TR, y la toma de TR es la máxima de los valores absolutos de las variables intermedias, usando las funciones abs ()) y max ().

    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()

Por último, vamos a calcular el valor de ATR, ATR: RMA ((TR,N), según el cual el algoritmo de RMA es en realidad un algoritmo EMA con una variación de valor fijo. N es la variable que importamos, donde el parámetro predeterminado de ATR es 14; aquí importamos el decimal de alpha = length.

===

Luego se calcula el ema con el algoritmo ewm.El proceso completo de cálculo del ATR es el siguiente:

    #ATR(PD)
    length=Pd
    M15['prev_close']=M15['close'].shift(1)
    ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
    M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()

9 Computación inicial de Up y Dn

    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])

Up=hl2 - ((Factor * atr) Dn = hl2 + (factor * atr) ¿No es muy sencillo?

A continuación se muestran los fragmentos de código básico de las 15 a 21 líneas del televisor.

TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? green : red

El mensaje principal de este pasaje es expresar: Si se encuentra en la fase de crecimiento, la tendencia de tendencia (línea inferior) = max (Up, TrendUp[1]) Si se encuentra en la fase bajista, la línea superior Tendencia Baja = min (Dn, Tendencia Baja[1])Es decir, en una tendencia, el valor de ATR ha estado usando una técnica similar a la estrategia de robar a Brin. El otro lado del canal se estrecha constantemente.

En este caso, TrendUp y TrendDown requieren una auto-repetencia de cada cálculo. Es decir, que cada paso debe ser calculado por uno mismo. Por lo tanto, hay que hacer un recorrido circular en el conjunto de datos.

En este caso, el conjunto de datos tiene que tener nuevos campos: TrendUp, TrendDown, Trend, linecolor, y un valor inicial. A continuación, usa la sintaxis fillna ((0) para rellenar el resultado de los cálculos anteriores con datos con valores en blanco.

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

Habilitar un bucle de for Utilizando el tercero de Python en el ciclo

    for x in range(len(M15)):

Computación de TendUpTrendUp = MAX ((Up,TrendUp[-1]) si está cerca [-1]>TrendUp[-1] else Up Lo que significa más o menos es que si el último close> el último TrendUp, el mayor valor entre el último TrendUp y el último TrendUp, no se establece el valor de Up y se pasa al actual TrendUp.

        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]

Así que la analogía es calcular el TrendDown.TrendDown=min ((Dn, TrendDown[-1]) si está cerca[-1]

        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]

Aquí abajo está la bandera para calcular la dirección de control, y he simplificado el código falso.Tendencia= 1 si (cerrar > Tendencia Baja[-1]) de lo contrario (x) x = -1 si (cerca< Tendencia hacia arriba[-1]) de lo contrario Tendencia[-1]

Lo que significa es que si el precio de cierre > el último TrendDown toma 1 ((ver más) no se establece toma x Si el precio de cierre < un TrendUp anterior, se toma -1 ((vacío) no se establece toma una Tendencia (es decir, no cambia) La traducción al lenguaje de imágenes es romper la bandera de conversión de trayectoria superior, ver más, romper la bandera de conversión de trayectoria inferior, mirar hacia abajo, el resto del tiempo no cambia.

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]

Calculación de Tsl y LinecolorTsl= rendUp si (Trend==1) else Tendencia hacia abajo Tsl se utiliza para representar el valor de la SuperTrend en la imagen. Esto significa que se marca la trayectoria en el gráfico cuando se ve más y se marca la trayectoria en el gráfico cuando se ve menos. linecolor= green if (Trend==1) else red El significado de linecolor es que si se lee más, se marca con una línea verde, si se ve en blanco, se marca en blanco (principalmente para el uso de Tradingview Display)

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else  'red'

Las líneas 23-30 de código son principalmente gráficos de tramas, pero no se detallan aquí.

Por último, hay dos líneas de código para el control de la señal de compra y venta.En Tradingview, su significado es que se da una señal después de invertir la bandera. Convierte las declaraciones condicionales en python. Si la última bandera de tendencia pasa de -1 a 1 significa que se rompe la resistencia superior. Si la última bandera de tendencia pasa de 1 a -1 significa que se rompe el soporte hacia abajo.

    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
        Log('SuperTrend V.1 Alert Long',"Create Order Buy)
    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long',"Create Order Sell)

El código completo de este apartado es el siguiente:

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)
    
    for x in range(len(M15)):
        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
        M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else  'red'
        
    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
        Log('SuperTrend V.1 Alert Long',"Create Order Buy)
        Log('Tsl=',Tsl)
    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long',"Create Order Sell)
        Log('Tsl=',Tsl)

img img

Cinco, todo el código.

He modificado la estructura del código en su conjunto. El gobierno de los Estados Unidos ha anunciado el lanzamiento de una nueva estrategia para la creación de puestos de trabajo. Aquí está el código completo.

'''backtest
start: 2019-05-01 00:00:00
end: 2020-04-21 00:00:00
period: 15m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
'''

import pandas as pd
import time

def main():
    exchange.SetContractType("quarter")
    preTime = 0
    Log(exchange.GetAccount())
    while True:
        records = exchange.GetRecords(PERIOD_M15)
        if records and records[-2].Time > preTime:
            preTime = records[-2].Time
            doTicker(records[:-1])
        Sleep(1000 *60)

       
def doTicker(records):
    #Log('onTick',exchange.GetTicker())
    M15 = pd.DataFrame(records)

    #Factor=3
    #Pd=7
    
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  
    
    #HL2
    M15['hl2']=(M15['high']+M15['low'])/2

    #ATR(PD)
    length=Pd
    M15['prev_close']=M15['close'].shift(1)
    ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
    M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()


    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])
    
    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

    for x in range(len(M15)):
        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
        M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'Long' if ( M15['Trend'].values[x]==1) else  'Short'
 

    linecolor=M15['linecolor'].values[-2]
    close=M15['close'].values[-2]
    Tsl=M15['Tsl'].values[-2] 


    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):

        Log('SuperTrend V.1 Alert Long','Create Order Buy')
        Log('Tsl=',Tsl)
        position = exchange.GetPosition()
        if len(position) > 0:
            Amount=position[0]["Amount"]
            exchange.SetDirection("closesell")
            exchange.Buy(_C(exchange.GetTicker).Sell*1.01, Amount);
        
        exchange.SetDirection("buy")
        exchange.Buy(_C(exchange.GetTicker).Sell*1.01, vol);

    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long','Create Order Sell')
        Log('Tsl=',Tsl)
        position = exchange.GetPosition()
        if len(position) > 0:
            Amount=position[0]["Amount"]
            exchange.SetDirection("closebuy")
            exchange.Sell(_C(exchange.GetTicker).Buy*0.99,Amount);
        exchange.SetDirection("sell")
        exchange.Sell(_C(exchange.GetTicker).Buy*0.99, vol*2);

La estrategia pública está conectada a https://www.fmz.com/strategy/200625

Seis, revisión y resumen

Se recogen datos de casi un año para su reevaluación. Utiliza el contrato trimestral de 15 minutos de ciclo de okx. Los parámetros establecidos son: El factor es 3. Pd es igual a 45. Vol = 100 (se pueden solicitar 100 por vez) Los ingresos anuales obtenidos, alrededor del 33%. En general, el retiro no es grande. La caída del 312 fue la que causó el mayor impacto en el sistema. Si no hay 312, las ganancias deberían ser mucho mejores.

img

Se escribe al final.

SuperTrend es un sistema de trading muy bueno.

El principio principal del sistema SuperTrend es la estrategia de ruptura del canal ATR (similar al canal de Kent) Sin embargo, su cambio se debe principalmente al uso de la estrategia de reducción de los ladrones, o el principio de Dongjian inverso. Los medios de comunicación locales han estado haciendo uso de los canales hacia arriba y hacia abajo para reducir el tráfico. Para lograr una operación de giro de ruptura de canal.

Así que en TradingView, he trazado el up dn TrendUp TrendDn separadamente. Esto nos ayuda a entender mejor la estrategia.En un instante.img

También hay una versión de js en github. La dirección eshttps://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

Finalmente fui a buscar la versión original. Se publicó el 29 de mayo de 2013. El autor es Rajandran R. El código de C++ fue publicado en el foro Mt4https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4Ahora que entiendo más o menos lo que significa C++, tengo la oportunidad de volver a escribir otra.

Espero que todos puedan aprender de esto. No es fácil.


Relacionados

Más.

- ¿ Qué pasa?¡YYDS! ¿Qué quieres decir?

¿Qué es eso?Si se utiliza directamente esta estrategia en el comercio de la bolsa de valores de acuerdo con la necesidad de conectar a la bolsa, el pequeño blanco uno no va a Python, no se entiende

los guardias de seguridadAquí hay mucho espacio para ajustar los parámetros si la ola 312 no se alimenta, ya que la supertrend es principalmente para tomar la lista de tendencias, y el 312 no debe perderse.

No hay duda.¿Qué tal si los resultados de las pruebas de retroevaluación no son tan buenos, y no se sabe cómo los otros optimizan?

¿Qué es eso?Sí, lo hice, gracias por su contribución.

¿Qué es eso?Si no se puede usar, muestra esto:Traceback (most recent call last): File "", line 1473, in Run File "", line 8, in ImportError: No module named pandas

¿Qué es esto?El traductor de pine, esperando

el tiempoLa cultura de la falta de respeto sólo dice una cosa: ¡Bobos!

- ¿ Qué quieres decir?Y luego, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy, el día de hoy.

Kmeans (siglo medio)Si el código del motor de repetición es de código abierto, quiero implementar una repetición y luego usar svm para encontrar los mejores parámetros.

¿Qué quieres decir?Este sistema parece haber sido una estrategia de futuros de los diez mejores rendimientos.

Nube ligeraHola, PD es el valor de longitud de ATR, ¿verdad?

Un sueño pequeño.Y ahora.

OvalsEsperamos esperar, Pine realmente no entiende mucho, y hay pocas lecciones.

La homilíaEsto significa que falta el paquete de pandas, tu sistema puede necesitar Pip para instalar pandas

¿ Qué está pasando?¿Cómo se maneja esto? Muchas gracias.

La homilíaAh, gracias jefe.

Un sueño pequeño.Un momento, abierto.

hombre solitario¡Pide la versión de JS!

La homilíaEn el blog, el blogger de la red social Twitter, Yuki Tanaka, explica que el proyecto tiene un plan de desarrollo.

Nube ligera¡Muy bien, gracias! También se retiró mq4, gracias.

La homilíaSí, muy bien.

La homilía¡Gloria a Él!

Un sueño pequeño.Por casualidad, también escribí una versión en JS.

La homilíaMuchas gracias, maestra Dream.