下面的功能是交易系统的一部分。它的目的是根据position_size
参数的值,为出价(购买)报价和询问(出售)报价分配数量(订单大小)。
这个交易系统在任何一个方向上都不能超过100的仓位限制,因此我们的订单数量与current position
的绝对值相结合时,不应超过100。
然而,有一个警告。偶尔,由于无法控制的外部原因,一个出价或要求(买卖订单)将执行两次,然后它的价格可以重新调整。
因此,这个函数返回的任何bid_volume
或ask_volume
最多只需要100 - position_size
值的一半,以便解释偶尔的双重执行。
这就是为什么在任何一步如果-否则块以下,加倍的ask_volume
或bid_volume
加current_position
将不会超过100。
def adjust_volume(position_size):
# Long.
if position_size > 0:
if position_size < 45:
bid_volume = 45 - position_size
ask_volume = 50
elif position_size >= 45 and position_size < 65:
bid_volume = 65 - position_size
ask_volume = 50
elif position_size >= 65 and position_size < 82:
bid_volume = 82 - position_size
ask_volume = 50
elif position_size >= 82 and position_size < 100:
bid_volume = 91 - position_size
ask_volume = 85
# Short.
elif position_size < 0:
abs_position_size = abs(position_size)
if position_size > -45:
bid_volume = 10
ask_volume = 45 - abs_position_size
elif position_size <= -45 and position_size > -65:
bid_volume = 50
ask_volume = 65 - abs_position_size
elif position_size <= -65 and position_size > -82:
bid_volume = 50
ask_volume = 82 - abs_position_size
elif position_size <= -82 and position_size > -100:
bid_volume = 75
ask_volume = 85 - abs_position_size
elif position_size == 0:
bid_volume = 30
ask_volume = 30
return position_size, bid_volume, ask_volume
position_size, bid_volume, ask_volume = adjust_volume(-76)
print("bid_volume:", bid_volume)
print("ask_volume:", ask_volume)
发布于 2020-03-16 17:42:39
adjust_volume(0)
目前的成果是:
UnboundLocalError:赋值前引用的局部变量“bid_volume”
由于if position_size == 0:
当前在elif position_size < 0:
语句中缩进,因此无法访问。(这可能是将代码复制到问题帖子时格式错误的结果。)
一些体积计算结果为负体积。(adjust_volume(99)
给bid_volume == -8
,adjust_volume(-99)
给ask_volume == -14
,这看起来是无效的结果。)
如果adjust_volume()
被赋予一个参数>= 100或<= -100,那么它在UnboundLocalError
中也会失败。应该检查限制并提高一个ValueError
。
这个交易系统在任何一个方向上都不能超过100的仓位限制,因此我们的订单数量与
current position
的绝对值相结合时,不应超过100。
100不超过100,所以原来的实现可能也应该允许+100
和-100
。但这些目前导致了UnboundLocalError
。
我不得不说,这种情况使我的大脑受伤:
elif position_size <= -65 and position_size > -82:
我花了几分钟才解开距离,我不得不三次检查是否正确。将更清楚地表示为:
elif -82 < position_size and position_size <= -65:
或者使用链接比较操作:
elif -82 < position_size <= -65:
你有9个范围:
与使用一棵if
-elif
-else
语句树来定位正确的范围不同,您可以通过bisect
列表-81, -64, -44, 0, 1, 45, 65, 82
来确定正确的范围桶。
注:当position_size
从负值到正值时,负桶限增加了1,以说明是否包括下限或上限的差异。
from bisect import bisect
POSITION = (-81, -64, -44, 0, 1, 45, 65, 82,)
BID_ASK = (
(75, 85), # -100 < pos <= -82
(50, 82), # -82 < pos <= -65
(50, 65), # -65 < pos <= -45
(10, 45), # -45 < pos < 0
(30, 30), # 0 <= pos <= 0
(45, 50), # 0 < pos < 45
(65, 50), # 45 <= pos < 65
(82, 50), # 65 <= pos < 82
(91, 85), # 82 <= pos < 100
)
def adjust_volume(position_size):
if not(-100 < position_size < 100):
raise ValueError("position size out of range")
bucket = bisect(POSITION, position_size)
bid_volume, ask_volume = BID_ASK[bucket]
if position >= 0:
bid_volume -= position_size
else:
ask_volume -= abs(position_size)
return position_size, bid_volume, ask_volume
https://codereview.stackexchange.com/questions/238998
复制相似问题