Darwinex ZeroMQ和MT4-如何迭代ZeroQM返回的值? (Python)

问题描述 投票:0回答:1

我正在尝试在Metatrader 4和Darwinex ZeroMQ(Python)之间建立桥梁。我使连接100%正常工作-返回值。问题是值以'NoneType'的形式返回,看起来像一个字典,但是它是不可迭代的。 anybory知道如何将信息分配给变量吗?我是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笔记本的屏幕截图,更容易看到结果:

enter image description here

python python-3.x metatrader4 metatrader5
1个回答
0
投票

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

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的订单返回一个dict

问候

© www.soinside.com 2019 - 2024. All rights reserved.