我正在尝试在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笔记本的屏幕截图,更容易看到结果:
我使用自己的套接字进行通信。这里是一些经过编辑的代码示例:
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
问候