Ví dụ về bản vẽ MACD Python

Tác giả:Lydia., Tạo: 2022-12-01 16:54:01, Cập nhật: 2023-09-11 08:59:21

img

Trên thực tế, trước khi tạo mã ví dụ này, đã có một phiên bản JavaScript của ví dụ vẽ chỉ số MACD trên hình vuông chiến lược của Nền tảng giao dịch FMZ Quant:https://www.fmz.com/strategy/151972Tuy nhiên, theo nhu cầu của người dùng, chúng tôi vẫn viết một ví dụ về phiên bản Python, có thể được sử dụng như là mã tham chiếu trong các chiến lược phát triển thiết kế vẽ.

Mã rất đơn giản:

'''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)

ChartCfg từ điển cấu hình biểu đồ

CácChartCfgTừ điển biến lưu trữ thông tin cấu hình biểu đồ, chẳng hạn như: Có bao nhiêu đường trong biểu đồ này? (Ba đường chỉ số, DIF, DEA và MACD tương ứng) Có một đường K trong biểu đồ không? (type: candlestick đề cập đến kiểu được đặt là dữ liệu đường K) Giá trị MACD tương đối nhỏ. Nếu cặp giao dịch là BTC_USDT, khi vẽ, các chỉ số sẽ bị nén lại với nhau, điều này rất khó nhìn thấy, vì vậy biểu đồ cũng nên được cấu hình như hai trục Y. (Do đó, có hai cấu hình trục Y trong yAxis, một là trục chỉ số và một là trục đường K)

Dữ liệu tải

Trong chiến lược ví dụ này, chức năng chính bắt đầu khởi tạo biểu đồ, nó gọi chức năng Chart, và truyền cấu hình biểu đồ ChartCfg như một tham số để tạo ra đối tượng biểu đồ. Sau đó nó đi vào vòng lặp, lấy dữ liệu đường K liên tục, đánh giá rằng số lượng BAR trong dữ liệu đường K lớn hơn 50, và sau đó tính toán các chỉ số MACD (quá ít BAR không thể tính toán các chỉ số hiệu quả). Sau đó chúng ta có thể viết dữ liệu đường K và dữ liệu chỉ số vào biểu đồ. Chúng ta viết nó trong biểu đồ bằng cách sử dụng hàm cộng của đối tượng biểu đồ. Khi viết, nếu tham số cuối cùng -1 của hàm add được chỉ định, đó là giá trị để cập nhật điểm dữ liệu hiện tại. Nếu -1 không được chuyển, một điểm dữ liệu mới được thêm vào. Khi K-line BAR được tạo ra mới, một điểm dữ liệu mới được thêm vào. Khi K-line BAR không được tạo ra, BAR cuối cùng và chỉ số tương ứng được cập nhật. (Được xác định bằng cách so sánh dấu thời gian của K-line BAR)

Nó có thể được kiểm tra trực tiếp.

img

Nó cũng có thể chạy trên một robot thực sự:

img

Ví dụ địa chỉ chiến lược:https://www.fmz.com/strategy/187379

Nếu bạn có bất kỳ câu hỏi nào, xin vui lòng để lại tin nhắn.


Có liên quan

Thêm nữa