DMI(+DI,-DI,ADX),python代碼(未完善)

我在网上查了好久都没有找到容易理解的DMI(动向指数)代码,所以自己写了一个,但绘制出来的图与东方财富显示的有些不同。我查了很久也没发现 bug,先放在这里,日后有机会再修改。

    def DMI(self):
        self.data['yclose'] = self.data['Close'].shift(1)
        self.data['yopen'] = self.data['Open'].shift(1)
        self.data['yhigh'] = self.data['High'].shift(1)
        self.data['ylow'] = self.data['Low'].shift(1)
        TR=[]
        pdi=[]
        ndi=[]

        for index,row in self.data.iterrows():
            listt = [self.data.loc[index,'Close'], self.data.loc[index,'Open'],
            self.data.loc[index,'High'], self.data.loc[index,'Low']]
            listy=[self.data.loc[index,'yclose'], self.data.loc[index,'yopen'], 
            self.data.loc[index,'yhigh'], self.data.loc[index,'ylow']]
            DM_p, DM_n = 0, 0
            if self.data.loc[index,'Close']==self.data.loc[index, 'Limit_up']:
                DM_p = self.data.loc[index, 'Close'] - max(listy)
            if self.data.loc[index, 'Close'] == self.data.loc[index, 'Limit_down']:
                DM_p = min(listy)-self.data.loc[index, 'Close']
            if max(listt)>max(listy)and min(listt)>min(listy):
                DM_p=max(listt)-max(listy)
            if max(listt)<max(listy)and min(listt)<min(listy):
                DM_n=abs(min(listt)-min(listy))
            if max(listt)<max(listy)and min(listt)>min(listy):
                DM_p, DM_n = 0, 0

            else:
                if max(listt) - max(listy) == min(listy) - min(listt):
                    DM_p, DM_n = 0, 0
                if max(listt)-max(listy)> min(listy)-min(listt):
                    DM_p=max(listt)-max(listy)
                else:
                    DM_n=min(listy)-min(listt)
            DM_p, DM_n = abs(DM_p),abs(DM_n)
            # TR
            a = abs(max(listt) - min(listt))
            b = abs(max(listt) - self.data.loc[index,'yclose'])
            c = abs(min(listt) -self.data.loc[index,'yclose'])
            TR_list = [a, b, c]
            tr = max(TR_list)
            TR.append(tr)
            pdi.append((DM_p / tr)*100)
            ndi.append((DM_n / tr)*100)

        add = pd.DataFrame({'TR': TR,'+DI': pdi,'-DI': ndi})
        # 合并时将 add DataFrame 的索引设置为一个新的列,以备后续合并
        self.data.reset_index(inplace=True)
        add['Date']=self.data['Date']
        # 将合并后的 DataFrame 的索引设置为 'add' DataFrame 的索引列(原先的索引)
        self.data = pd.merge(self.data, add, on='Date', how='right')
        self.data.set_index('Date', inplace=True)


        self.data["+DI13"]=self.data['+DI'].ewm(span=13, adjust=False).mean()
        self.data["-DI13"] = self.data['-DI'].ewm(span=13, adjust=False).mean()
        DX=[]
        for index, row in self.data.iterrows():
            dx= abs(((self.data.loc[index,"+DI13"] - self.data.loc[index,"-DI13"]) / 
            (self.data.loc[index,"+DI13"] + self.data.loc[index,"-DI13"])) * 100)
            DX.append(dx)
        add=pd.DataFrame({'DX': DX})
        self.data.reset_index(inplace=True)
        add['Date']=self.data['Date']
        # 将合并后的 DataFrame 的索引设置为 'add' DataFrame 的索引列(原先的索引)
        self.data = pd.merge(self.data, add, on='Date', how='right')
        self.data.set_index('Date', inplace=True)
        self.data["ADX"] = self.data['DX'].ewm(span=13, adjust=False).mean()
        return self.data

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值