Na verdade, antes de fazer este exemplo de código, já existe uma versão JavaScript do exemplo de desenho do indicador MACD no quadrado de estratégia da plataforma de negociação FMZ Quant:https://www.fmz.com/strategy/151972No entanto, de acordo com as necessidades do usuário, ainda escrevemos um exemplo de versão Python, que pode ser usado como código de referência no desenho de design de desenvolvimento de estratégia.
O código é muito simples:
'''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 drawing'
},
'yAxis': [{
'title': {'text': 'K-line'},
'style': {'color': '#4572A7'},
'opposite': False
}, {
'title': {'text': 'index axis'},
'opposite': True
}],
'series': [{
'type': 'candlestick',
'name': 'current period',
'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
# calculate the indicator
macd = TA.MACD(r)
LogStatus(_D(), len(r))
# drawing
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)
OChartCfg
O dicionário de variáveis armazena informações sobre a configuração do gráfico, tais como:
Quantas linhas existem neste gráfico? (Três linhas de indicadores, DIF, DEA e MACD, respectivamente)
Existe uma linha K no gráfico? (
Nesta estratégia de exemplo, a função principal começa a inicializar o gráfico, chama a função Chart e passa a configuração do gráfico ChartCfg como um parâmetro para gerar um objeto de gráfico. Em seguida, entra em um loop, obtém dados de linha K constantemente, julga que o número de BAR nos dados de linha K é maior que 50, e depois calcula indicadores MACD (muito poucos BAR não podem calcular indicadores eficazes). Nós escrevemos no gráfico usando a função de adição do objeto gráfico. Ao escrever, se o último parâmetro -1 da função de adição for especificado, é o valor para atualizar o ponto de dados atual. Quando o BAR da linha K é recém-gerado, um novo ponto de dados é adicionado. Quando o BAR da linha K não é gerado, o último BAR e o indicador correspondente são atualizados. (Determinado comparando os carimbos de tempo do BAR da linha K)
Também pode ser executado em um robô real:
Endereço de exemplo de estratégia:https://www.fmz.com/strategy/187379
Se tiver alguma pergunta, por favor deixe uma mensagem.