微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

缩短长 Python 指标

如何解决缩短长 Python 指标

这是我编写的代码,用于帮助我定义策略。它运行良好,但我觉得代码太长,我想知道是否有一种有效的方法可以对 for 循环执行相同的操作。 该代码搜索一组烛台,其实体包含在另一个先前的柱内。用我笨拙的方法,我只能设计最少 2 根蜡烛和最多 7 根蜡烛。是否可以使用 for 循环来获取尽可能多的满足此条件的蜡烛? 提前致谢。

def eATR(df1,n=14):
    """This calculates the Average True Range of of a dataframe of the open,high,low,and close data of an instrument"""

    df = df1[['Open','High','Low','Close',]]
    # True Range
    df['TR'] = 0
    for i in range(len(df)):
        try:
            df.iloc[i,4] = max(df.iat[i,1] - df.iat[i,2],abs(df.iat[i,1] - df.iat[i-1,3]),2] - df.iat[i-1,3]))
        except ValueError:
            pass

    # eATR
    
    df['eATR']= df['TR'].ewm(span=n,adjust=False).mean()
    df.drop(['TR'],axis = 1,inplace=True)     
    return df['eATR']

def contraction(data):
    df = data.copy()

    e_ATR = eATR(df)

    bodyHi = df[['Open','Close']].apply(max,axis=1)
    bodyLo = df[['Open','Close']].apply(min,axis=1)
    topWick = abs(df['High'] - bodyHi)
    botWick = abs(bodyLo - df['Low'])
    bodyLen = abs(bodyHi - bodyLo)
    canLen = df['High'] - df['Low']

    per = 1.5
    
    contraction = np.where((df['High'].shift(7) >= bodyHi.shift(6))
                          & (df['High'].shift(7) >= bodyHi.shift(5))
                          & (df['High'].shift(7) >= bodyHi.shift(4))
                          & (df['High'].shift(7) >= bodyHi.shift(3))
                          & (df['High'].shift(7) >= bodyHi.shift(2))
                          & (df['High'].shift(7) >= bodyHi.shift(1))
                          & (df['High'].shift(7) >= bodyHi.shift(0))
                          
                          & (df['Low'].shift(7) <= bodyLo.shift(6))
                          & (df['Low'].shift(7) <= bodyLo.shift(5))
                          & (df['Low'].shift(7) <= bodyLo.shift(4))
                          & (df['Low'].shift(7) <= bodyLo.shift(3))
                          & (df['Low'].shift(7) <= bodyLo.shift(2))
                          & (df['Low'].shift(7) <= bodyLo.shift(1))
                          & (df['Low'].shift(7) <= bodyLo.shift(0))
                          & (canLen.shift(0) <= canLen.shift(7) * per)
                          & (canLen.shift(1) <= canLen.shift(7) * per)
                          & (canLen.shift(2) <= canLen.shift(7) * per)
                          & (canLen.shift(3) <= canLen.shift(7) * per)
                          & (canLen.shift(4) <= canLen.shift(7) * per)
                          & (canLen.shift(5) <= canLen.shift(7) * per)
                          & (canLen.shift(6) <= canLen.shift(7) * per)
                          
                          | (df['High'].shift(6) >= bodyHi.shift(5))
                          & (df['High'].shift(6) >= bodyHi.shift(4))
                          & (df['High'].shift(6) >= bodyHi.shift(3))
                          & (df['High'].shift(6) >= bodyHi.shift(2))
                          & (df['High'].shift(6) >= bodyHi.shift(1))                        
                          & (df['High'].shift(6) >= bodyHi.shift(0))
                         
                          & (df['Low'].shift(6) <= bodyLo.shift(5))
                          & (df['Low'].shift(6) <= bodyLo.shift(4))
                          & (df['Low'].shift(6) <= bodyLo.shift(3))
                          & (df['Low'].shift(6) <= bodyLo.shift(2))
                          & (df['Low'].shift(6) <= bodyLo.shift(1))
                          & (df['Low'].shift(6) <= bodyLo.shift(0))
                          & (canLen.shift(0)  <= canLen.shift(6) * per)
                          & (canLen.shift(1)  <= canLen.shift(6) * per)
                          & (canLen.shift(2)  <= canLen.shift(6) * per)
                          & (canLen.shift(3)  <= canLen.shift(6) * per)
                          & (canLen.shift(4)  <= canLen.shift(6) * per)
                          & (canLen.shift(5)  <= canLen.shift(6) * per)
                         
                          | (df['High'].shift(5) >= bodyHi.shift(4))
                          & (df['High'].shift(5) >= bodyHi.shift(3))
                          & (df['High'].shift(5) >= bodyHi.shift(2))
                          & (df['High'].shift(5) >= bodyHi.shift(1))
                          & (df['High'].shift(5) >= bodyHi.shift(0))
                          & (df['Low'].shift(5) <= bodyLo.shift(4))
                          & (df['Low'].shift(5) <= bodyLo.shift(3))
                          & (df['Low'].shift(5) <= bodyLo.shift(2))
                          & (df['Low'].shift(5) <= bodyLo.shift(1))
                          & (df['Low'].shift(5) <= bodyLo.shift(0))                         
                          
                          & (canLen.shift(0) <= canLen.shift(5) * per)
                          & (canLen.shift(1) <= canLen.shift(5) * per)
                          & (canLen.shift(2) <= canLen.shift(5) * per)
                          & (canLen.shift(3) <= canLen.shift(5) * per)
                          & (canLen.shift(4) <= canLen.shift(5) * per)
                         
                          | (df['High'].shift(4) >= bodyHi.shift(3))
                          & (df['High'].shift(4) >= bodyHi.shift(2))
                          & (df['High'].shift(4) >= bodyHi.shift(1))
                          & (df['High'].shift(4)  >= bodyHi.shift(0))
                          & (df['Low'].shift(4) <= bodyLo.shift(3))
                          & (df['Low'].shift(4) <= bodyLo.shift(2))
                          & (df['Low'].shift(4) <= bodyLo.shift(1)) 
                          & (df['Low'].shift(4) <= bodyLo.shift(0))                    
                                                  
                          & (canLen.shift(0) <= canLen.shift(4) * per)
                          & (canLen.shift(1) <= canLen.shift(4) * per)
                          & (canLen.shift(2) <= canLen.shift(4) * per)
                          & (canLen.shift(3) <= canLen.shift(4) * per)
                          
                          | (df['High'].shift(3) >= bodyHi.shift(2))
                          & (df['High'].shift(3) >= bodyHi.shift(1))
                          & (df['High'].shift(3) >= bodyHi.shift(0))
                          & (df['Low'].shift(3) <= bodyLo.shift(2))
                          & (df['Low'].shift(3) <= bodyLo.shift(1)) 
                          & (df['Low'].shift(3) <= bodyLo.shift(0))                    
                                                  
                          & (canLen.shift(0) <= canLen.shift(3) * per)
                          & (canLen.shift(1) <= canLen.shift(3) * per)
                          & (canLen.shift(1) <= canLen.shift(3) * per)
                          
                          | (df['High'].shift(2) >= bodyHi.shift(1))
                          & (df['High'].shift(2) >= bodyHi.shift(0))
                          & (df['Low'].shift(2) <= bodyLo.shift(1)) 
                          & (df['Low'].shift(2) <= bodyLo.shift(0))                    
                                                  
                          & (canLen.shift(0) <= canLen.shift(2) * per)
                          & (canLen.shift(1) <= canLen.shift(2) * per),1,0)
    
     

 
    return contraction

当满足上述条件时,这是我的图表上以“burlywood”着色的输出

期待中的感谢!

chart

解决方法

虽然我不太明白你在做什么,但这里有一些我认为你正在尝试做的 Pythonic 伪代码:

def fits_in(a,b,per=1.5):
    return (a.hi <= b.hi) and (a.lo >= b.lo) and (a.size * per <= b.size)

def anyfit (candles):
    for i in range(1,len(candle_list)):
        for j in range(i):
            if fits_in(candles[i],candles[j]):
               return True
    return False

candle_list = []   # <- fill this list in from somewhere
 
print(anyfit(candle_list))
         

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。