samedi 5 mars 2016

Python: simplified the code , too many if,elif,else and for loop

The full code below is too long and complicated. I want to use a simple to rewrite the code in such a way so that it is easier to understand and maintain and extendibles. I still have many technical indicators to combine with this MACD indicator. Now the structure of the code is like below:

for A
  if 1
    for a
    for b
    if A1
      if a
      if b
      if c
      if d
    else
      if a1
      if b1
      if c1
      if d1
  if 2
    for a
    for b
    if A1
      if a
      if b
      if c
      if d
    else
      if a1
      if b1
      if c1
      if d1
  if 3
    for a
    for b
    if A1
      if a
      if b
      if c
      if d
    else
      if a1
      if b1
      if c1
      if d1

Full code as below:

import urllib,time,datetime,os
import csv
import pandas as pd
import numpy as np
import talib as ta

now = datetime.datetime.now()
KLSElist = open('KLSE1.csv')
KLSEReader = csv.reader(KLSElist)
KLSEData = list(KLSEReader)
KLSElen = len(KLSEData)
for x in range (1,len(KLSEData),1):
    data = pd.read_csv(KLSEData [x][0]+".csv", index_col='Stock', usecols =[0,6,7])
    date =  pd.read_csv(KLSEData [x][0]+".csv", index_col='Stock', usecols =[0,1])
    dt = np.array(date['Date'])
    high =  pd.read_csv(KLSEData [x][0]+".csv", index_col='Stock', usecols =[0,4])
    h = np.array(high['High'])
    low =  pd.read_csv(KLSEData [x][0]+".csv", index_col='Stock', usecols =[0,5])
    l = np.array(low['Low'])
    close =  pd.read_csv(KLSEData [x][0]+".csv", index_col='Stock', usecols =[0,6])
    c = np.array(close['Close'])
    vol = pd.read_csv(KLSEData [x][0]+".csv", index_col='Stock', usecols =[0,7])
    v = np.array(vol['Volume'])
    MACD = ta.MACD(c)
    a=np.where(MACD[2]>0.)[0]
    b=np.where(MACD[2]<0.)[0]
    lena=len(a)
    lenb=len(b)
    num0=np.array([1])
    num=np.array([1])
    num1=[]
    num2=[]
    print KLSEData [x]

    if lena>90 and lenb>90:
        for z in range (-1,-90,-1):#for MACD hist above  0
            if(np.diff(a)[z]>1):
                num=a[z]
                num1.append(num)
                print num1
        if len(num1)<1:
            num1[0]=0
        for y in range (-1,-90,-1):#for MACD hist below  0
            #if(b[x]-b[x-1]>1):
            if(np.diff(b)[y]>1):
                num0=b[y]
                num2.append(num0)
                print num2
        if len(num2)<1:
            num2[0]=0
        if num1[0]>num2[0] and len(num1)>1:
            num3=ta.MININDEX(MACD[2][(num1[0]-20):(num1[0]+1)],timeperiod=21)
            num4=ta.MININDEX(MACD[2][(num1[1]-20):(num1[1]+1)],timeperiod=21)
            if (MACD[2][num1[0]-20+num3[20]]>MACD[0][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]>c[num1[1]-20+num4[20]]):
               print "continue uptrend"
               print dt[num1[0]],dt[num1[1]]
               df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" continue uptrend "]})
            elif (MACD[2][num1[0]-20+num3[20]]>MACD[0][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]<c[num1[1]-20+num4[20]]):
               print" bullish divergence"
               print dt[num1[0]],dt[num1[1]]
               df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bullish divergence "]})
            elif (MACD[2][num1[0]-20+num3[20]]<MACD[2][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]>c[num1[1]-20+num4[20]]):
               print" bearish divergence*2"
               print dt[num1[0]],dt[num1[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bearish divergence*2 "]})
            elif (MACD[2][num1[0]-20+num3[20]]<MACD[2][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]<c[num1[1]-20+num4[20]]):
               print" out from downtrend"
               print dt[num1[0]],dt[num1[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" out from downtrend "]})
            else:
               print "sideway"
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" sideway "]})
        elif num1[0]<num2[0]and len(num2)>1:
            num3=ta.MAXINDEX(MACD[2][(num2[0]-20):num2[0]+1],timeperiod=21)
            num4=ta.MAXINDEX(MACD[2][(num2[1]-20):num2[1]+1],timeperiod=21)
            if (MACD[2][num2[0]-20+num3[20]]>MACD[0][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]>c[num2[1]-20+num4[20]]):
               print "out from uptrend"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" out from uptrend "]})
            elif (MACD[2][num2[0]-20+num3[20]]>MACD[0][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]<c[num2[1]-20+num4[20]]):
               print" bullish divergence*2"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bullish divergence*2 "]})
            elif (MACD[2][num2[0]-20+num3[20]]<MACD[2][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]>c[num2[1]-20+num4[20]]):
               print" bearish divergence"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bearish divergence "]})
            elif (MACD[2][num2[0]-20+num3[20]]<MACD[2][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]<c[num2[1]-20+num4[20]]):
               print" continue downtrend"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" continue downtrend "]})
            else:
               print "sideway"
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" sideway "]})
            #for y in range (num1-len(MACD[0]),-30,-1):
                #if (a[y]-a[y-1]>1):
                    #num2=[]
                    #num2=a[y]
    elif lena<90 and lenb>90:
        for z in range (-1,-(lena),-1):#for MACD hist above  0
        #if(a[x]-a[x-1]>1):
            if(np.diff(a)[z]>1):
                num=a[z]
                num1.append(num)
                print num1
        if len(num1)<1:
            num1[0]=0
        for y in range (-1,-90,-1):#for MACD hist below  0
            #if(b[x]-b[x-1]>1):
            if(np.diff(b)[y]>1):
                num0=b[y]
                num2.append(num0)
                print num2
        if len(num2)<1:
            num2[0]=0
        if num1[0]>num2[0] and len(num1)>1:
            num3=ta.MININDEX(MACD[2][(num1[0]-20):(num1[0]+1)],timeperiod=21)
            num4=ta.MININDEX(MACD[2][(num1[1]-20):(num1[1]+1)],timeperiod=21)
            if (MACD[2][num1[0]-20+num3[20]]>MACD[0][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]>c[num1[1]-20+num4[20]]):
               print "continue uptrend"
               print dt[num1[0]],dt[num1[1]]
               df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" continue uptrend "]})
            elif (MACD[2][num1[0]-20+num3[20]]>MACD[0][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]<c[num1[1]-20+num4[20]]):
               print" bullish divergence"
               print dt[num1[0]],dt[num1[1]]
               df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bullish divergence "]})
            elif (MACD[2][num1[0]-20+num3[20]]<MACD[2][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]>c[num1[1]-20+num4[20]]):
               print" bearish divergence*2"
               print dt[num1[0]],dt[num1[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bearish divergence*2 "]})
            elif (MACD[2][num1[0]-20+num3[20]]<MACD[2][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]<c[num1[1]-20+num4[20]]):
               print" out from downtrend"
               print dt[num1[0]],dt[num1[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" out from downtrend "]})
            else:
               print "sideway"
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" sideway "]})
        elif num1[0]<num2[0]and len(num2)>1:
            num3=ta.MAXINDEX(MACD[2][(num2[0]-20):num2[0]+1],timeperiod=21)
            num4=ta.MAXINDEX(MACD[2][(num2[1]-20):num2[1]+1],timeperiod=21)
            if (MACD[2][num2[0]-20+num3[20]]>MACD[0][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]>c[num2[1]-20+num4[20]]):
               print "out from uptrend"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" out from uptrend "]})
            elif (MACD[2][num2[0]-20+num3[20]]>MACD[0][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]<c[num2[1]-20+num4[20]]):
               print" bullish divergence*2"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bullish divergence*2 "]})
            elif (MACD[2][num2[0]-20+num3[20]]<MACD[2][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]>c[num2[1]-20+num4[20]]):
               print" bearish divergence"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bearish divergence "]})
            elif (MACD[2][num2[0]-20+num3[20]]<MACD[2][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]<c[num2[1]-20+num4[20]]):
               print" continue downtrend"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" continue downtrend "]})
            else:
               print "sideway"
    elif lena>90 and lenb<90:
        for z in range (-1,-90,-1):#for MACD hist above  0
        #if(a[x]-a[x-1]>1):
            if(np.diff(a)[z]>1):
                num=a[z]
                num1.append(num)
                print num1
        if len(num1)<1:
            num1[0]=0
        for y in range (-1,-(lenb),-1):#for MACD hist below  0
            #if(b[x]-b[x-1]>1):
            if(np.diff(b)[y]>1):
                num0=b[y]
                num2.append(num0)
                print num2
        if len(num2)<1:
            num2[0]=0
        if num1[0]>num2[0] and len(num1)>1:
            num3=ta.MININDEX(MACD[2][(num1[0]-20):(num1[0]+1)],timeperiod=21)
            num4=ta.MININDEX(MACD[2][(num1[1]-20):(num1[1]+1)],timeperiod=21)
            if (MACD[2][num1[0]-20+num3[20]]>MACD[0][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]>c[num1[1]-20+num4[20]]):
               print "continue uptrend"
               print dt[num1[0]],dt[num1[1]]
               df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" continue uptrend "]})
            elif (MACD[2][num1[0]-20+num3[20]]>MACD[0][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]<c[num1[1]-20+num4[20]]):
               print" bullish divergence"
               print dt[num1[0]],dt[num1[1]]
               df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bullish divergence "]})
            elif (MACD[2][num1[0]-20+num3[20]]<MACD[2][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]>c[num1[1]-20+num4[20]]):
               print" bearish divergence*2"
               print dt[num1[0]],dt[num1[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bearish divergence*2 "]})
            elif (MACD[2][num1[0]-20+num3[20]]<MACD[2][num1[1]-20+num4[20]])and (c[num1[0]-20+num3[20]]<c[num1[1]-20+num4[20]]):
               print" out from downtrend"
               print dt[num1[0]],dt[num1[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" out from downtrend "]})
            else:
               print "sideway"
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" sideway "]})
        elif num1[0]<num2[0]and len(num2)>1:
            num3=ta.MAXINDEX(MACD[2][(num2[0]-20):num2[0]+1],timeperiod=21)
            num4=ta.MAXINDEX(MACD[2][(num2[1]-20):num2[1]+1],timeperiod=21)
            if (MACD[2][num2[0]-20+num3[20]]>MACD[0][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]>c[num2[1]-20+num4[20]]):
               print "out from uptrend"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" out from uptrend "]})
            elif (MACD[2][num2[0]-20+num3[20]]>MACD[0][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]<c[num2[1]-20+num4[20]]):
               print" bullish divergence*2"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bullish divergence*2 "]})
            elif (MACD[2][num2[0]-20+num3[20]]<MACD[2][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]>c[num2[1]-20+num4[20]]):
               print" bearish divergence"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" bearish divergence "]})
            elif (MACD[2][num2[0]-20+num3[20]]<MACD[2][num2[1]-20+num4[20]])and (c[num2[0]-20+num3[20]]<c[num2[1]-20+num4[20]]):
               print" continue downtrend"
               print dt[num2[0]],dt[num2[1]]
               #df1=pd.DataFrame({'Stock':[KLSEData [x][0]],'MACD':[" continue downtrend "]})
            else:
               print "sideway"
        else:
            print "no trend"


#df=pd.merge(df1,df2, on='Stock', how='inner',left_index=True,right_index=True)
df1.to_csv('stockMACD'+now.strftime("%Y-%m-%d")+".csv", header=False, mode = 'a')
    #ta.MIN(MACD[2][(num1[0]-20):num1[0]+1],timeperiod=2)

Aucun commentaire:

Enregistrer un commentaire