En fait, avant d'écrire ce modèle de code, les inventeurs de la plate-forme de trading ont quantifié la stratégie de Square:https://www.fmz.com/strategy/151972Une version JavaScript de l'exemple MACD est déjà disponible. Cependant, les utilisateurs ont besoin d'écrire une version Python pour le code de référence lors de l'élaboration de l'exemple de conception.
Le code est très 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)
Celle-ci estChartCfg
Les variables du dictionnaire contiennent des informations de configuration du graphique, telles que:
Combien de lignes y a-t-il sur ce graphique? (les trois lignes sont DIF, DEA et MACD)
Y a-t-il des lignes K dans ce graphique?
Les valeurs MACD sont relativement petites, et si la paire de transactions est BTC_USDT, l'indicateur est comprimé lors de l'affichage, il est donc difficile de le voir, de sorte que le graphique doit également être configuré en 2 axes Y.
Dans cette stratégie de paradigme, la fonction main commence à initialement exécuter le graphique, appelle la fonction Chart, configure le graphique ChartCfg comme paramètre d'entrée, génère un objet de graphique Chart. Puis entre dans une boucle, récupère sans cesse des données de ligne K, juge que le nombre de lignes de données BAR est supérieur à 50 pour calculer l'indicateur MACD (BAR est trop faible pour calculer l'indicateur); puis on peut écrire les données de ligne K et les données d'indicateur dans le graphique. Écrire une méthode pour un graphique à l'aide d'un objet de tableau avec la fonction add. Lors de l'écriture, si le dernier paramètre de la fonction add est spécifié, -1, pour la valeur de la mise à jour du point de données actuel; si ce n'est pas le cas, -1, pour l'ajout d'un nouveau point de données. Lorsqu'un nouveau barrage K est généré, un nouveau point de données est ajouté, et lorsque le barrage K n'est pas généré, le dernier barrage et l'indicateur correspondant sont mis à jour.
Il est également possible d'utiliser le disque dur:
L'adresse de l'exemple stratégique:https://www.fmz.com/strategy/187379
Si vous avez des questions, merci de laisser un commentaire.