2021년 8월 18일 수요일

python calculate DMI(원본)

 






def cal_dmi(self,data, n=14,n_ADX=14):
i = 0
UpI = [0]
DoI = [0]

data["UpI"]=0
data["DoI"]=0

while i + 1 <= data.index[-1] :
UpMove = data.loc[i + 1, "high"] - data.loc[i, "high"]
DoMove = data.loc[i, "low"] - data.loc[i+1, "low"]
if UpMove > DoMove and UpMove > 0 :
UpD = UpMove
else :
UpD = 0
data["UpI"].iloc[i] = UpD
# UpI.append(UpD)

if DoMove > UpMove and DoMove > 0 :
DoD = DoMove
else :
DoD = 0

# DoI.append(DoD)
data["DoI"].iloc[i] = DoD
i = i + 1

i = 0
TR_l = [0]
data["TR_l"]=0
while i < data.index[-1]:
TR = max(data.loc[i + 1, 'high'], data.loc[i, 'y']) - min(data.loc[i + 1, 'low'], data.loc[i, 'y'])
# TR_l.append(TR)
data["TR_l"].iloc[i]=TR
i = i + 1


TR_s = pd.Series(TR_l)
# ATR = pd.Series(TR_s.ewm(span=n, min_periods=1).mean())
ATR = pd.Series(data["TR_l"].ewm(span=n, min_periods=1).mean())
# UpI = pd.Series(UpI)
# DoI = pd.Series(DoI)
# PosDI = pd.Series(UpI.ewm(span=n, min_periods=1).mean() / ATR)
# NegDI = pd.Series(DoI.ewm(span=n, min_periods=1).mean() / ATR)

PosDI = pd.Series(data["UpI"].ewm(span=n, min_periods=1).mean() / ATR)
NegDI = pd.Series(data["DoI"].ewm(span=n, min_periods=1).mean() / ATR)

ADX = pd.Series((abs(PosDI - NegDI) / (PosDI + NegDI)).ewm(span=n_ADX, min_periods=1).mean(), name='ADX_' + str(n) + '_' + str(n_ADX))
data["DIMinus"] =round(NegDI*100,2)
data["DIPlus"] = round(PosDI*100,2)
data["ADX"] =round(ADX*100,2)











######실시간용과 전체용

def 계산DMI(self,data, n=14,n_ADX=14):


data["UpI"]=0
data["DoI"]=0
data["TR_l"]=0

# first_index = 803

# print("111:[%s] 222:[%s]"%(data.index[-1],len(data)-1))

# i = first_index
i=0

while i + 1 <= len(data)-1:
# UpMove = data.loc[i+1 , "high"] - data.loc[i, "high"]
# DoMove = data.loc[i, "low"] - data.loc[i+1, "low"]
# print("i:[%s][%s]"%(i,data["ds"].iloc[i]))
UpMove = data["high"].iloc[i + 1] - data["high"].iloc[i]
DoMove = data["low"].iloc[i] - data["low"].iloc[i + 1]

if UpMove > DoMove and UpMove > 0 :
UpD = UpMove
else :
UpD = 0

data["UpI"].iloc[i+1] = UpD

if DoMove > UpMove and DoMove > 0 :
DoD = DoMove
else :
DoD = 0

data["DoI"].iloc[i+1] = DoD
i = i + 1

i = 0

while i < len(data)-1:
TR = max(data["high"].iloc[i + 1], data["y"].iloc[i]) - min(data["low"].iloc[i + 1], data["y"].iloc[i])
data["TR_l"].iloc[i+1]=TR
i = i + 1

ATR = pd.Series(data["TR_l"].ewm(span=n, min_periods=1).mean())
PosDI = pd.Series(data["UpI"].ewm(span=n, min_periods=1).mean() / ATR)
NegDI = pd.Series(data["DoI"].ewm(span=n, min_periods=1).mean() / ATR)
ADX = pd.Series((abs(PosDI - NegDI) / (PosDI + NegDI)).ewm(span=n_ADX, min_periods=1).mean(), name='ADX_' + str(n) + '_' + str(n_ADX))

data["DIMinus"] =round(NegDI*100,2)
data["DIPlus"] = round(PosDI*100,2)
data["ADX"] =round(ADX*100,2)












def 실시간dmi(self,code,n=14,n_ADX=14):


i = len(self.실시간차트용데이터[code])-5

while i + 1 <= len(self.실시간차트용데이터[code]) - 1:
UpMove = self.실시간차트용데이터[code]["high"].iloc[i + 1] - self.실시간차트용데이터[code]["high"].iloc[i]
DoMove = self.실시간차트용데이터[code]["low"].iloc[i] - self.실시간차트용데이터[code]["low"].iloc[i + 1]

if UpMove > DoMove and UpMove > 0:
UpD = UpMove
else:
UpD = 0

# self.실시간차트용데이터[code]["UpI"].iloc[i + 1] = UpD

if DoMove > UpMove and DoMove > 0:
DoD = DoMove
else:
DoD = 0

# self.실시간차트용데이터[code]["DoI"].iloc[i + 1] = DoD
##마지막값만 변경
if i+1 == len(self.실시간차트용데이터[code]) - 1:
print("여기안타나??? [%s %s ]"%(self.실시간차트용데이터[code]["ds"].iloc[i+1],i))
print("UpD:[%s]"%UpD)
print("Dod:[%s]"%DoD)
print("UpMove DoMove:[%s,%s]"%(UpMove,DoMove))
self.실시간차트용데이터[code]["UpI"].iloc[i+1] = UpD
self.실시간차트용데이터[code]["DoI"].iloc[i+1] = DoD

i = i + 1

i = len(self.실시간차트용데이터[code])-5

while i < len(self.실시간차트용데이터[code]) - 1:
TR = max(self.실시간차트용데이터[code]["high"].iloc[i + 1], self.실시간차트용데이터[code]["y"].iloc[i]) - min(self.실시간차트용데이터[code]["low"].iloc[i + 1], self.실시간차트용데이터[code]["y"].iloc[i])
if i==len(self.실시간차트용데이터[code])-2:
self.실시간차트용데이터[code]["TR_l"].iloc[i+1] = TR
i = i + 1

ATR = pd.Series(self.실시간차트용데이터[code]["TR_l"].ewm(span=n, min_periods=1).mean())
PosDI = pd.Series(self.실시간차트용데이터[code]["UpI"].ewm(span=n, min_periods=1).mean() / ATR)
NegDI = pd.Series(self.실시간차트용데이터[code]["DoI"].ewm(span=n, min_periods=1).mean() / ATR)
print("NegDI%s"%NegDI.tail(5))
print()
ADX = pd.Series((abs(PosDI - NegDI) / (PosDI + NegDI)).ewm(span=n_ADX, min_periods=1).mean(),
name='ADX_' + str(n) + '_' + str(n_ADX))

self.실시간차트용데이터[code]["DIMinus"].iloc[len(self.실시간차트용데이터[code]) - 1] = round(NegDI.iloc[len(NegDI) - 1] * 100, 2)
self.실시간차트용데이터[code]["DIPlus"].iloc[len(self.실시간차트용데이터[code]) - 1] = round(PosDI.iloc[len(PosDI) - 1] * 100, 2)
self.실시간차트용데이터[code]["ADX"].iloc[len(self.실시간차트용데이터[code]) - 1] = round(ADX.iloc[len(ADX) - 1] * 100, 2)

댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...