Python中如何实现自动化交易,一单成交后其他单作废?
想做一个自动化下单的工具,请教如何实现一单成交,其他单都作废?需要不断的 while ( 1 )?
有什么比较好的逻辑结构吗?谢谢。目前用的 easytrader。
Python中如何实现自动化交易,一单成交后其他单作废?
在 callback 里撤销其他单就好了吧
import threading
import time
from queue import Queue
import random
class AutoTradeSystem:
def __init__(self):
self.order_queue = Queue()
self.active_order = None
self.order_lock = threading.Lock()
self.is_running = True
def place_order(self, order_id, symbol, price, quantity):
"""模拟下单函数"""
with self.order_lock:
if self.active_order is None:
self.active_order = {
'id': order_id,
'symbol': symbol,
'price': price,
'quantity': quantity,
'status': 'pending'
}
print(f"订单 {order_id} 已提交: {symbol}@{price} x{quantity}")
return True
else:
print(f"订单 {order_id} 被拒绝: 已有活跃订单 {self.active_order['id']}")
return False
def check_order_status(self):
"""模拟检查订单状态"""
if self.active_order and self.active_order['status'] == 'pending':
# 模拟50%的成交概率
if random.random() > 0.5:
self.active_order['status'] = 'filled'
print(f"订单 {self.active_order['id']} 已成交!")
return True
return False
def cancel_all_pending(self):
"""取消所有挂单"""
with self.order_lock:
if self.active_order and self.active_order['status'] == 'pending':
print(f"取消订单 {self.active_order['id']}")
self.active_order = None
def trading_strategy(self):
"""交易策略线程"""
order_counter = 1
while self.is_running:
# 生成模拟交易信号
symbol = "BTC/USDT"
price = round(50000 + random.uniform(-100, 100), 2)
quantity = random.randint(1, 10)
# 尝试下单
success = self.place_order(f"ORD{order_counter}", symbol, price, quantity)
if success:
order_counter += 1
# 等待订单状态更新
for _ in range(10): # 最多检查10次
if self.check_order_status():
break
time.sleep(0.1)
# 如果订单成交,取消其他挂单
if self.active_order and self.active_order['status'] == 'filled':
self.cancel_all_pending()
self.active_order = None
time.sleep(1) # 策略执行间隔
def run(self):
"""启动交易系统"""
print("启动自动化交易系统...")
strategy_thread = threading.Thread(target=self.trading_strategy)
strategy_thread.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
self.is_running = False
print("\n停止交易系统")
# 使用示例
if __name__ == "__main__":
trader = AutoTradeSystem()
trader.run()
核心思路是用一个active_order变量跟踪当前活跃订单,配合线程锁保证状态一致性。下单前检查是否有活跃订单,有则拒绝新单;订单成交后立即清空active_order状态。这样确保同一时间只有一个有效订单。
简单说就是用一个标志位控制订单状态流转。
user.buy(‘603225’, price=38.50, amount=int(user.balance[‘可用金额’]/38.50))#新凤鸣
好像 easytrade 只能现价买入,price 貌似不起作用啊
callback ?我想知道这个循环怎么写才比较好呢? while ( 1 )一直轮训行情?然后下单?
还是有其他的好办法呢
貌似现在还不用这么复杂。不太会用,衰。。。
while ( 1 ):
if:
elseif:
写上好多个,还真觉得很 low
如果 if…else 过多可以进行递归啊
哪个交易所?直接看订单状态就好了
a 股啊。while(1):
print(time.localtime())
if(quotation.real(‘603619’)[‘603619’][‘now’] ==42):
print(“中曼石油”)
user.buy(‘603619’, 42.00, int(user.balance[‘可用金额’]/42)) #中曼石油
break
elif (quotation.real(‘603225’)[‘603225’][‘now’]==38.50):
user.buy(‘603225’, 38.50, int(user.balance[‘可用金额’]/38.50)) #新凤鸣
break
elif (quotation.real(‘603579’)[‘603579’][‘now’]==68.50):
user.buy(‘603579’, 68.50, int(user.balance[‘可用金额’]/68.50)) #荣泰健康
break
elif (quotation.real(‘603039’)[‘603039’][‘now’]==67.60):
user.buy(‘603039’, 67.60, int(user.balance[‘可用金额’]/67.60)) #泛微网络
break
elif (quotation.real(‘603260’)[‘603260’][‘now’]==59.60):
user.buy(‘603260’, 59.60, int(user.balance[‘可用金额’]/59.60)) #合盛硅业
break
elif (quotation.real(‘600585’)[‘600585’][‘now’]==32.50):
user.buy(‘600585’, 32.50, int(user.balance[‘可用金额’]/32.50)) #海螺水泥
break
elif (quotation.real(‘601100’)[‘601100’][‘now’]==31.50):
user.buy(‘601100’, 31.50, int(user.balance[‘可用金额’]/31.50)) #恒立液压
break
elif (quotation.real(‘600031’)[‘600031’][‘now’]==9.15):
user.buy(‘600031’, 9.15, int(user.balance[‘可用金额’]/9.15)) #三一重工
break
elif (quotation.real(‘600802’)[‘600802’][‘now’]==8.20):
user.buy(‘600802’, 8.20, int(user.balance[‘可用金额’]/8.20)) #福建水泥
break
elif (quotation.real(‘603607’)[‘603607’][‘now’]==41.70):
user.buy(‘603607’, 41.70, int(user.balance[‘可用金额’]/41.7)) #京华激光
break
elif (quotation.real(‘603882’)[‘603882’][‘now’]==33):
user.buy(‘603882’, 33.00, int(user.balance[‘可用金额’]/33)) #金域医学
break
elif (quotation.real(‘600203’)[‘600203’][‘now’]==9.4):
user.buy(‘600203’, 9.40, int(user.balance[‘可用金额’]/9.4)) #福日电子
break
这样看起来非常 low,而且不好维护。
你这个问题重心应该是购买状态,如何实时检查购买状态
至于其中一个条件成立,用 any()就好了
我是 easytrader 的作者,没想到能看到有人在 v 站发 easytrader 的相关问题。
easytrader 目前是支持限价单的,暂不支持市价,准备最近实现下。
你可以批量挂单,然后通过检测可撤单列表。如果有股票成交的话,就会从可撤单列表中消失,然后你用撤单函数把其他单都撤销掉就可以了。
顺便在这里求个工作,Python / Golang 后端岗位, 熟悉后端相关技术栈,联系邮件 longlyshidenggui#谷歌邮箱.com 。github https://github.com/shidenggui
世界好小 原来 easytrader 的作者 除了逛 jisilu 也逛 v2 的啊
Base 哪里?
如此之近。
不过貌似华泰证券的就不能正确下单,会提示下单的金额不对,比如。4.99 会变成 4.999999 之类。貌似也不能做到限价下单。不知道应该怎么做。
另外我想如果 easyquotation 能获取 a 股,应该也能获取美股吧。新浪好像是相通的接口
额。。。。不能锁表么
use。buy 的话,按照道理是限定价格,但是实盘貌似是市价下单,但是单价上会变成超出两位小数,必须人工干预。就不能自动了。
主要是出现在单价会变成超出两位的🌲,不知道这个怎么处理。
你这个我遇到过 华泰的客户端 要把自动填写价格去掉(客户端设置) 不然会在自动填写价格的后面填上你的委托价格。。。。比如华泰自动搞了个卖一的价格 1.99 然后你委托了 1.88 结果就是出来一个 1.99188 就报错了。。不知道你能看明白不
网络有延时,这个功能如果在客户端实现,不能保证 100%正确,在极端行情下,有可能导致重大损失。
原来是自动化填单的动作慢了,这样理解对吗?
aalen.nku gmail 一起交流下?
目前自动下单还有什么好办法呢
恩 具体里面怎么搞成替换还是 append 我也不清楚 没研究过 pywin 大佬写好了我就现成了。。把自动填写委托价格取消选择了就行了。
同问现在有什么其他好办法么?除了那种要不少钱的。。。。。小钱瞎玩 不值当
感谢大神。我把这条看成银河客户端的了。
客户端自动下单不难,但是客户端自动撤单不是 100%可靠的,因为有网络延时存在,当客户端发出撤单指令的一瞬间,也许已经在交易所的主机上成交了。
客户端自动下单,我知道的方法有三种:1. 根据通信协议编程实现; 2. 在 windows 系统上,写个程序通过 windows 消息模拟键盘鼠标操作来控制交易软件; 3. 直接使用交易所提供的下单接口
没看懂这个题目, 这个逻辑不是很清楚吗,题目已经把逻辑描述清楚了呀。

