首页 > 解决方案 > Darwinex ZeroMQ & MT4 - 如何迭代 ZeroQM 返回值?(Python)

问题描述

我正在尝试在 Metatrader 4 和 Darwinex ZeroMQ (Python) 之间架起一座桥梁。我让连接 100% 正常工作 - 返回值。问题是值返回为“NoneType”,看起来像字典,但不可迭代。有人知道如何将信息分配给变量吗?我是 python 新手,我正在尝试创建一个小型机器人。

按照 Darwinex 文档的链接:https ://github.com/darwinex/dwx-zeromq-connector

请参阅下面我的 Python 代码和返回值:

from DWX_ZeroMQ_Connector_v2_0_1_RC8 import DWX_ZeroMQ_Connector

_zmq = DWX_ZeroMQ_Connector(_verbose=True)

_zmq._generate_default_order_dict()

_zmq._DWX_MTX_GET_ALL_OPEN_TRADES_()

_zmq._DWX_MTX_GET_ALL_OPEN_TRADES_().get('_trades')

按照下面 Jupiter notebook 上的截图,更容易看到结果:

在此处输入图像描述

标签: pythonpython-3.xmetatrader4metatrader5

解决方案



我使用自己的套接字进行通信。这里有一些编辑过的代码示例:

import zmq
import threading
import time
import ast


def fetch_to_db(data):
    try:
        if 'OPEN_TRADES' in data:
            res = ast.literal_eval(data)
            orders = res['_trades']
            for key,value in orders.items():
                #print(key)
                value['orderID'] = key
                print(value)
            print()
        else:
            print('FETCH ERROR')
    except Exception as e:
        print(e)

def get_open_trades(stop):
    try:
        while True:
            data = str('TRADE;GET_OPEN_TRADES')
            c = zmq.Context()
            s = c.socket(zmq.PUSH)
            s.connect('tcp://127.0.0.1:32768')
            s.send_string(data)
            s.send_string(data)
            time.sleep(1)
            if stop():
                s.close()
                break
    except Exception as e:
        print(e)

def receiver_sock(stop):
    try:
        c = zmq.Context()
        s = c.socket(zmq.PULL)
        s.setsockopt(zmq.RCVHWM, 1)
        s.connect('tcp://127.0.0.1:32769')
        while True:
            data = s.recv_string()
            fetch_to_db(data)
            time.sleep(0.00001)
            if stop():
                s.close()
                break
    except Exception as e:
        print(e)

def loop_s():
    try:
        stop_threads = False
        receiver_socket = threading.Thread(target = receiver_sock, args =(lambda : stop_threads, ))
        receiver_socket.setDaemon(True)
        receiver_socket.start()
        open_trades = threading.Thread(target = get_open_trades, args =(lambda : stop_threads, ))
        open_trades.setDaemon(True)
        open_trades.start()
    except Exception as e:
        print(e)


try:
    loop_s()
    while True: time.sleep(100)
except KeyboardInterrupt:
    print('CLOSING')
    processes = [get_open_trades,receiver_sock]
    for i in processes:
        stop_threads = True
        t1 = threading.Thread(target = i, args =(lambda : stop_threads, ))

fetch_to_db 函数为每个订单返回一个字典,包括 orderID

问候


推荐阅读