2023年9月6日 星期三

![gh](https://raw.githubusercontent.com/tewei0328/picture-bed/main/2023/image.png) ```python data1 = tw_close.GetClose()[(tickLengh-leftLength-showLength):(tickLengh-leftLength)] data2 = tw_close.GetSMA(signal_SMA_Length)[(tickLengh-leftLength-showLength):(tickLengh-leftLength)] data3 = tw_close.GetMAX(signal_MAX_Length)[(tickLengh-leftLength-showLength):(tickLengh-leftLength)] #data3 data4 = tw_close.GetMIN(signal_MIN_Length)[(tickLengh-leftLength-showLength):(tickLengh-leftLength)] #data3 #signal = data1 >= data2 signal = tw_close.GetSignal()[(tickLengh-leftLength-showLength):(tickLengh-leftLength)] print("Show Tick總數: ", len(data1)) sym = 't' curve1 = p1.plot(data1) curve2 = p1.plot(data2, pen='r') curve3 = p1.plot(data3, pen='b')  #data3 curve4 = p1.plot(data4, pen='g')  #data3 curve5 = p2.plot(signal, pen =(0, 0, 200), symbolBrush =(0, 0, 200), symbolPen ='w', symbol ='t1', symbolSize = 14) #-------------------------------------------------------     if liveVer == 0:     ptr1 = tickLengh-leftLength+1 #History ver:為了取得顯示在Tick圖上的Tick之後的下一個Tick else:     ptr1=-1 # Live ver.:-1 #-------------------------------------------------------     def update1():     global data1, data2, data3, data4, signal, ptr1 #data3     data1[:-1] = data1[1:]  # 即資料左移                             #[:-1]意思是->取全部,除了最後一個 (即左移, 空出最後一個值)                             #[1:]意思是->取全部,除了第一個                             #[-1]意思是->取最後一個     data1[-1] = tw_close.GetClose()[ptr1]  #最近Tick值     data2[:-1] = data2[1:]  # 即資料左移     data2[-1] = tw_close.GetSMA(signal_SMA_Length)[ptr1]     data3[:-1] = data3[1:]  # 即資料左移 #data3     data3[-1] = tw_close.GetMAX(signal_MAX_Length)[ptr1] #data3     data4[:-1] = data4[1:]  # 即資料左移 #data3     data4[-1] = tw_close.GetMIN(signal_MIN_Length)[ptr1] #data3     signal[:-1] = signal[1:]  # shift data in the array one sample left     #--- 產生黃金交叉信號     #signal[-1] = (data1[-1] >= data2[-1]) and (data1[-2] < data2[-2])     #signal[-1] = (data1[-1] >= data2[-1])     signal[-1] = tw_close.GetSignal()[ptr1]     curve1.setData(data1)     curve2.setData(data2)     curve3.setData(data3) #data3     curve4.setData(data4) #data3     curve5.setData(signal) #data3     #-------------------------------------------------------         if liveVer == 0:         ptr1 += 1  #(history ver.: 執行)         #ptr1 += 1  #(live ver.: 不執行)         #print("ptr1=", ptr1) # update all plots def update():     update1()     #update2()     #update3() ```

google sheet-appscript-vba-1分K整理

/** @OnlyCurrentDoc */ function myFunction() {   var spreadsheet = SpreadsheetApp.getActive();   spreadsheet.getRange('F:G').activate();   spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());   spreadsheet.getRange('G:P').activate();   spreadsheet.setCurrentCell(spreadsheet.getRange('I1'));   spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());   spreadsheet.getRange('A1').activate();   spreadsheet.getCurrentCell().setValue('date');   spreadsheet.getRange('B1').activate();   spreadsheet.getCurrentCell().setValue('open');   spreadsheet.getRange('C1').activate();   spreadsheet.getCurrentCell().setValue('high');   spreadsheet.getRange('D1').activate();   spreadsheet.getCurrentCell().setValue('low');   spreadsheet.getRange('E1').activate();   spreadsheet.getCurrentCell().setValue('close');   spreadsheet.getRange('F1').activate();   spreadsheet.getCurrentCell().setValue('volume');   spreadsheet.getRange('F2').activate(); };

2023年9月5日 星期二

【Python交易程式開發現場59】*產生交易訊號 (17) | 將交易訊號送至下單函數 | 交易訊號下單在OnNotify()

# 【交易程式架構】 1. 視窗物件區,view鈕,槽函數 【V】 2. (tw函數1) 呼叫API函數區,tw呼叫類函數(連線,查報價,下單,查倉位)【III.1】 3. (tw函數2) API事件回傳用,tw回傳處理類函數(顯示回傳訊息,存Tick值,畫Tick圖,計算指標,產生訊號,自動下單)【III.2】 4. API事件回傳區 5. 外部py函數檔(將.py整個檔視為一個副程式, 用import .py載入, 如: 畫Tick圖) --- I. Qt 自訂Signal/Slot 類別 II - 群益API物件 & 公用變數 & 工具函數 III. 群益API 事件所對應之相關tw函數 (於V.槽函數所會用到的子工具函數區) IV - 群益API事件 V - View | 主視窗類別 | 按鈕送出訊號所對應之槽函數 ![[Pasted image 20230905115301.png]] ![[Pasted image 20230905125605.png]] ![gh](https://raw.githubusercontent.com/tewei0328/picture-bed/main/2023/1693898435000jframr.png) twGlobal.py ![gh](https://raw.githubusercontent.com/tewei0328/picture-bed/main/2023/1693898899000b7n4fx.png) twIndicator.py ![gh](https://raw.githubusercontent.com/tewei0328/picture-bed/main/2023/1693924139000c06cv7.png) ![gh](https://raw.githubusercontent.com/tewei0328/picture-bed/main/2023/1693924178000un1lce.png)

test

markdown #test

2023年9月4日 星期一

【Python交易程式開發現場41】*產生交易訊號 (4) | 用pyqtgraph畫動態均線圖 (twMASignal.py)

 


import matplotlib as mpl
import matplotlib.pyplot as plt
from time import perf_counter
import numpy as np
import pyqtgraph as pg
import pickle

from twIndicator import twClosePriceModel
import twGlobal
tw_close = twGlobal.twClose             #Ticks報價
tw_kbar1m = twGlobal.twKBar1M

with open('twclose.pickle', 'rb') as f:
    tw_close = pickle.load(f)           #Ticks報價


win = pg.GraphicsLayoutWidget(show=True)
win.setWindowTitle('pyqtgraph example: Scrolling Plots')

p1 = win.addPlot()


showLength = 100   # Tick圖總長度
leftLength = 500   # 動態看最後leftLength筆Ticks
tickLengh = len(tw_close.GetClose())  #取得之所有Tick數目
print("Tick總數: ", tickLengh)

# data1為顯示在Tick圖上之所有data
data1 = tw_close.GetClose()[(tickLengh-leftLength-showLength):(tickLengh-leftLength)]
data2 = tw_close.GetSMA()[(tickLengh-leftLength-showLength):(tickLengh-leftLength)]
print("Show Tick總數: ", len(data1))


curve1 = p1.plot(data1)
curve2 = p1.plot(data2)

ptr1 = tickLengh-leftLength+1 #為了取得顯示在Tick圖上的Tick之後的下一個Tick


def update1():
    global data1, data2, ptr1
    data1[:-1] = data1[1:]  # shift data in the array one sample left
                            #[:-1]意思是->取全部,除了最後一個
                            #[1:]意思是->取全部,除了第一個
                            #[-1]意思是->取最後一個
                            # (see also: np.roll)
    #data1[-1] = np.random.normal()
    data1[-1] = tw_close.GetClose()[ptr1]
    curve1.setData(data1)

    data2[:-1] = data2[1:]  # shift data in the array one sample left
    data2[-1] = tw_close.GetSMA()[ptr1]
    curve2.setData(data2)
    ptr1 += 1
    print("ptr1=", ptr1)


   
# update all plots
def update():
    update1()


timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)


if __name__ == '__main__':
    pg.exec()










【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 .