【问题标题】:How to avoid repeating code in a trade strategy that can go long and short如何避免在可以做多和做空的交易策略中重复代码
【发布时间】:2021-05-19 21:03:32
【问题描述】:

我有多种策略可以做多或做空赚钱。目前,我将长边与短边分开编码,但它们是彼此的镜子。一个基本示例可能是收盘价超过前一根蜡烛的高点/低点并朝该方向交易:

direction = 'none'
if last_candle['close'] > previous_candle['high']:
  direction = 'long'

if last_candle['close'] < previous_candle['low']:
  direction = 'short'

trade(direction)

你怎么能这样写,这样你只写一次逻辑?

【问题讨论】:

  • "this" if True else "that" 请参阅文档中的Conditional expressions
  • 这里有三个可能的结果('long'、'short'、什么都没有)。如果不进行 2 次比较,您就无法真正产生三个结果之一。
  • 对不起,我没有说清楚还有第三个选项什么都没有。我将更新伪代码。至于不进行 2 次比较,当然需要进行两次比较,但这是我所说的逻辑,而不是最终的“方向”。一种可能是粗略的做法是否定值(将图表倒置),然后翻转方向。所以它变成了这样: logic = ... if logic(original_data): direction = 'long' if logic(negated_data): direction = 'short' trade(direction) 这可能会起作用,但我觉得必须有更好的方式。

标签: python algorithmic-trading


【解决方案1】:

有一个内置库可以做到这一点 代码:

from bisect import bisect
def foo(close):
    previous_candle = {}
    previous_candle['high'] = 100
    previous_candle['low'] = 0 
    choices = ["short","none","long"]
    breakpoints = [previous_candle['low'],previous_candle['high']]
    
    return choices[bisect(breakpoints,close)]
    #return ["short","none","long"][bisect([previous_candle['low'],previous_candle['high']],close)] if you prefer oneliner

print(foo(-50))
print(foo(50))
print(foo(150))

结果:

short
none
long

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2023-01-14
    • 2021-03-18
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多