2023年9月4日 星期一

【Python交易程式開發現場20】*畫1分K線(6) | numpy array, tuple的轉換問題 | 時間軸必須為數字的解決 | twCandleStick.py

1. numpy array, tuple的轉換問題 



Python中的list与NumPy中array的区别 及相互转换




python-基础语法-list、array、set、tuple转换




>>> a=numpy.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])

>>> tuple(a.reshape(1, -1)[0])
(1, 2, 3, 4, 5, 6)




class CandlestickItem(pg.GraphicsObject):
    def __init__(self, data):
        pg.GraphicsObject.__init__(self)
        self.data = data  ## data must have fields: time, open, close, min, max
        self.generatePicture()
   
    def generatePicture(self):
        ## pre-computing a QPicture object allows paint() to run much more quickly,
        ## rather than re-drawing the shapes every time.
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('w'))
        #w = (self.data[1][0] - self.data[0][0]) / 3.
        w = 0.333
        for (t, open, close, min, max) in self.data:
            p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
            if open > close:
                p.setBrush(pg.mkBrush('r'))
            else:
                p.setBrush(pg.mkBrush('g'))
            p.drawRect(QtCore.QRectF(t-w, open, w*2, close-open))
        p.end()


出現錯誤-> 發現程式中的時間 t必須為數字1, 2, 3, ...才能正常運作, 
所以使用range()來產生數字1,2,3,...


說明:range() 函數的回傳資料型態為 range,無法使用 print() 列印出其值,實務上會使用list() 函數將其轉換成串列(list)型態的資料

(1) range(n):表示產生 0 至 n-1 的數列

範例:產生0至10的數列

           >>> a=range(11)
           >>> type(a)
           <class 'range'>     #由range函數產生的資料型態為range
           >>> a=list(a)         #使用list()函數來轉換成串列型態
           >>> print(a)

           執行結果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(2) range(start,end):start為起始值,end為終止值,產生 start 至 end-1 的數列

範例:產生1至10的數列

           >>> a=list(range(1,11))
           >>> print(a)

          執行結果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]







## fields are (time, open, close, min, max).
N=50
#data_time_range = list(range(1,N+1))
data_time = list(tw_kbar1m.GetTime()[2:N])
data_time1=[i.strftime("%M:%S") for i in data_time]
data_time2 = tuple(data_time1)
data_time3 = tuple(range(3,N+1))

data_open = tuple(tw_kbar1m.GetOpen()[2:N])
data_close = tuple(tw_kbar1m.GetClose()[2:N])
data_low = tuple(tw_kbar1m.GetLow()[2:N])
data_high = tuple(tw_kbar1m.GetHigh()[2:N])

data1=[data_time3,data_open,data_close,data_low,data_high]
data2=list(zip(data_time3,data_open,data_close,data_low,data_high))







## fields are (time, open, close, min, max).
N1=300
N=600
#data_time_range = list(range(1,N+1))
data_time = list(tw_kbar1m.GetTime()[N1:N])
data_time1=[i.strftime("%M:%S") for i in data_time]
data_time2 = tuple(data_time1)
data_time3 = tuple(range(N1+1,N+1))

data_open = tuple(tw_kbar1m.GetOpen()[N1:N])
data_close = tuple(tw_kbar1m.GetClose()[N1:N])
data_low = tuple(tw_kbar1m.GetLow()[N1:N])
data_high = tuple(tw_kbar1m.GetHigh()[N1:N])

data1=[data_time3,data_open,data_close,data_low,data_high]
data2=list(zip(data_time3,data_open,data_close,data_low,data_high))






沒有留言:

張貼留言

prog-0318

test test1 Written with StackEdit .