●FB https://www.facebook.com/groups/248705245950294 ●YT https://www.youtube.com/channel/UCTcXwTLJM62hYzCAQ6fA5tg ●FB粉絲團: https://m.facebook.com/00bnf/ ●東京交易故事(電子書/影音): 東京交易故事1-BNF交易手法解說1 東京交易故事2-BNF交易手法解說2 東京交易故事3-BNF交易手法解說3 東京交易故事4-日本股神CIS-1 東京交易故事5-日本股神CIS-6 東京交易故事6-BNF自己流1-3 東京交易故事7-秒速億元男的哲學1 東京交易故事8-秒速億元男的交易手法和BNF的交易哲學 東京交易故事9-TW自己流1 東京交易故事10-秒速億元男的交易手法2 東京交易故事11-TW自己流2(選擇權的波動交易策略) 東京交易故事12-TW自己流3(綜合實戰策略: 選擇權+現貨對沖) 合図【あいず】信號,暗號 #cis #股神 #BNF #逆勢接刀 #短線交易 #日本股神bnf研究會
2023年9月6日 星期三

```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]]

twGlobal.py

twIndicator.py


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的区别 及相互转换
>>> 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]
(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))
訂閱:
文章 (Atom)
prog-0318
test test1 Written with StackEdit .
-
程式執行時遇到了: ModuleNotFoundError: No module named ‘comtypes.gen.SKCOMLib’ 1. 參考網路解答1:(失敗收場) 問題:ModuleNotFoundError: No module named ‘comtypes.g...
-
群益API: m_nCode回報錯誤代碼2017之處理 class MyMainWindow ( QMainWindow , Ui_Form ): def __init__ ( self , parent = None ): super ( ...
-
結論: 1. 用dict建dataframe時, 要設index df = pd . DataFrame ( dictRepStock , index = [ 0 ]) 2. 於pandas加一筆data要用concat, df_RepStock = pd . conc...