
De hecho, antes de hacer este código de muestra, encontré la estrategia de la plataforma de comercio cuantitativo de Inventor, Strategy Square: https://www.fmz.com/strategy/151972. Ya existe una versión en JavaScript del ejemplo de dibujo del indicador MACD. Sin embargo, en respuesta a la demanda de los usuarios, se escribe una versión Python del ejemplo para que sirva como código de referencia al desarrollar y diseñar estrategias.
El código es muy simple:
'''backtest
start: 2020-01-28 00:00:00
end: 2020-02-26 00:00:00
period: 1d
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"}]
'''
ChartCfg = {
'__isStock': True,
'title': {
'text': 'Python画图'
},
'yAxis': [{
'title': {'text': 'K线'},
'style': {'color': '#4572A7'},
'opposite': False
}, {
'title': {'text': '指标轴'},
'opposite': True
}],
'series': [{
'type': 'candlestick',
'name': '当前周期',
'id': 'primary',
'data': []
}, {
'type': 'line',
'id': 'dif',
'name': 'DIF',
"yAxis" : 1,
'data': []
}, {
'type': 'line',
'id': 'dea',
'name': 'DEA',
"yAxis" : 1,
'data': []
}, {
'type': 'line',
'id': 'macd',
'name': 'MACD',
"yAxis" : 1,
'data': []
}]
}
def main():
global ChartCfg
preTime = 0
chart = Chart(ChartCfg)
chart.reset()
while True:
while True:
r = _C(exchange.GetRecords)
if len(r) > 50:
break
# 计算指标
macd = TA.MACD(r)
LogStatus(_D(), len(r))
# 画图
for i in range(len(r)):
if r[i]["Time"] == preTime:
chart.add(0, [r[i]["Time"], r[i]["Open"], r[i]["High"], r[i]["Low"], r[i]["Close"]], -1)
chart.add(1, [r[i]["Time"], macd[0][i]], -1)
chart.add(2, [r[i]["Time"], macd[1][i]], -1)
chart.add(3, [r[i]["Time"], macd[2][i]], -1)
elif r[i]["Time"] > preTime:
chart.add(0, [r[i]["Time"], r[i]["Open"], r[i]["High"], r[i]["Low"], r[i]["Close"]])
chart.add(1, [r[i]["Time"], macd[0][i]])
chart.add(2, [r[i]["Time"], macd[1][i]])
chart.add(3, [r[i]["Time"], macd[2][i]])
preTime = r[i]["Time"]
Sleep(500)
esteChartCfgLa variable de diccionario almacena la información de configuración del gráfico, por ejemplo:
¿Cuántas líneas hay en este gráfico? (Tres líneas indicadoras, a saber: DIF, DEA, MACD)
¿Hay velas en este gráfico? (‘type’: ‘candlestick’ Este tipo significa configurarlo en datos de la línea K)
Los valores MACD son relativamente pequeños. Si el par de negociación es BTC_USDT, los indicadores se comprimirán entre sí al dibujar el gráfico, lo que resulta muy incómodo de leer. Por lo tanto, el gráfico debe configurarse con dos ejes Y. (Entonces, hay dos configuraciones del eje Y en ‘yAxis’, una es el eje del indicador y la otra es el eje de la línea K)
En esta estrategia de ejemplo, la función principal comienza a ejecutar la inicialización del gráfico, llama a la función Chart, pasa la configuración del gráfico ChartCfg como parámetro y genera un objeto de gráfico. Luego, entra en un bucle para obtener continuamente datos de la línea K. Mientras la cantidad de BAR de datos de la línea K sea mayor a 50, se puede calcular el indicador MACD (si hay muy pocas BAR, no se puede calcular ningún indicador efectivo) . Luego puedes escribir los datos de la línea K y los datos del indicador en el gráfico. Para escribir en un gráfico, utilice el método add del objeto de gráfico. Al escribir, si el último parámetro de la función de suma es -1, se actualizará el valor del punto de datos actual. Si no se pasa -1, se agregará un nuevo punto de datos. Cuando se genera una barra de línea K, se agrega un nuevo punto de datos. Cuando no se genera una barra de línea K, se actualizan la última barra y el indicador correspondiente. (A juzgar por la comparación de las marcas de tiempo de la línea K BAR)

También puedes ejecutarlo en tiempo real:

Ejemplo de dirección de política: https://www.fmz.com/strategy/187379
Si tiene alguna pregunta, gracias por dejar un mensaje.