
На самом деле, прежде чем создать этот пример кода, я нашел платформу количественной торговли Inventor Strategy Square: https://www.fmz.com/strategy/151972. Уже существует версия JavaScript примера отрисовки индикатора MACD. Однако в ответ на запросы пользователей была написана версия примера на языке Python, которая может служить справочным кодом при разработке и проектировании стратегий.
Код очень простой:
'''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)
этотChartCfgПеременная словаря хранит информацию о конфигурации диаграммы, например:
Сколько линий на этом графике? (Три индикаторные линии, а именно DIF, DEA, MACD)
Есть ли на этом графике свечи? («тип»: «свеча» означает установку в качестве данных свечи)
Значения MACD относительно небольшие. Если торговая пара BTC_USDT, то при построении графика индикаторы будут сжиматься, что очень неудобно для чтения. Поэтому график необходимо настроить с двумя осями Y. (Таким образом, в «yAxis» есть две конфигурации оси Y: одна — ось индикатора, а другая — ось K-линии)
В этом примере стратегии основная функция начинает выполнять инициализацию диаграммы, вызывает функцию Chart, передает конфигурацию диаграммы ChartCfg в качестве параметра и генерирует объект диаграммы chart. Затем он входит в цикл для непрерывного получения данных K-line. Пока количество BAR данных K-line больше 50, индикатор MACD может быть рассчитан (если BAR слишком мало, эффективный индикатор не может быть рассчитан) . Затем вы можете записать данные K-линии и данные индикатора в график. Чтобы записать данные в диаграмму, используйте метод add объекта диаграммы. При записи, если последний параметр функции сложения равен -1, значение текущей точки данных будет обновлено. Если -1 не передано, будет добавлена новая точка данных. При создании нового BAR-диапазона K-line добавляется новая точка данных. При создании нового BAR-диапазона K-line обновляется последний BAR и соответствующий индикатор. (Судя по сравнению временных меток K-line BAR)

Вы также можете запустить его в режиме реального времени:

Пример адреса политики: https://www.fmz.com/strategy/187379
Если у вас есть вопросы, спасибо, что оставили сообщение.