def GetKBar(Num,Prod,Kind,DN): # 取歷史報價 Data = GOrder.GetHistoryKBar(Num,Prod,Kind,DN) # 刪除換行符號並依逗號分隔 Data = [ i.strip('\n').split(',') for i in Data ] # 將資料改為Talib套件適用的格式 KBar = {} KBar['date'] = np.array([ i[0] for i in Data ]) KBar['open'] = np.array([ float(i[2]) for i in Data ]) KBar['high'] = np.array([ float(i[3]) for i in Data ]) KBar['low'] = np.array([ float(i[4]) for i in Data ]) KBar['close'] = np.array([ float(i[5]) for i in Data ]) KBar['volume'] = np.array([ int(i[6]) for i in Data ]) return KBar
# 載入必要模組 from haohaninfo import GOrder from order import Record import sys # 登入帳號密碼(讀者須修正該帳號密碼為自己的,否則無法執行策略) GOrder.Login('TestAccount','TestPasswd') # 建立部位管理物件 OrderRecord=Record() # 取得回測參數 StartDate=sys.argv[1] EndDate=sys.argv[2] # 每日進場標記、高低點判斷 LastOrderDay='' CeilPrice={} FloorPrice={} Spread={} MoveStopLoss=0.02 # 回測取報價物件 KBar=GOrder.GetTAKBar(StartDate,EndDate,'3008','Stock','1','1') # 開始回測 for n in range(0,len(KBar['time'])): # 將日期取出 Date=KBar['time'][n].strftime('%Y%m%d') # 如果無未平倉部位 並時間為指定的進場時間 則進場 if OrderRecord.GetOpenInterest()==0 : # 在9點15 判斷當日高低點 if KBar['time'][n].strftime('%H%M') <= "0916" :
# 載入必要模組 from haohaninfo import GOrder from order import Record import sys # 登入帳號密碼(讀者須修正該帳號密碼為自己的,否則無法執行策略) GOrder.Login('TestAccount', 'TestPasswd') # 建立部位管理物件 OrderRecord = Record() # 取得回測參數 StartDate = sys.argv[1] EndDate = sys.argv[2] # 每日進場標記、高低點判斷 LastOrderDay = '' CeilPrice = {} FloorPrice = {} Spread = {} StopLoss = 30 TakeProfit = 70 # 回測取報價物件 KBar = GOrder.GetTAKBar(StartDate, EndDate, 'TXF', 'Future', '1', '1') # 開始回測 for n in range(0, len(KBar['time'])): # 將日期取出 Date = KBar['time'][n].strftime('%Y%m%d') # 如果無未平倉部位 並時間為指定的進場時間 則進場 if OrderRecord.GetOpenInterest() == 0: # 在9點15 判斷當日高低點
# 載入必要模組 from haohaninfo import GOrder from chart import ChartKBar_MA import sys # 取得回測參數 Excgange = sys.argv[1] Product = sys.argv[2] StartDate = sys.argv[3] EndDate = sys.argv[4] Klen = sys.argv[5] LongPeriod = int(sys.argv[6]) ShortPeriod = int(sys.argv[7]) # 登入帳號密碼(讀者須修正該帳號密碼為自己的,否則無法執行策略) GOrder.Login('TestAccount', 'TestPasswd') # K線物件 KBar = GOrder.GetTAKBar(StartDate, EndDate, Product, Excgange, '0', Klen) # 繪製K線圖加上MA線圖 ChartKBar_MA(KBar, LongPeriod, ShortPeriod)
from haohaninfo import GOrder # 匯入模組 N = 10 # 設定MA期數 TotalProfit = [] # 用來記錄每筆損益 flag = 0 # 手中部位狀態,0代表空手,1代表持有多單,-1代表持有空單 Data = GOrder.GetHistoryKBar('100', '2330', 'Stock', '1') # 取歷史報價 Data = [i.strip('\n').split(',') for i in Data] # 利用列表推導式將資料轉為List格式 lastClose = None # 昨日收盤價 lastMA = None # 昨日MA值 for k in range(N, len(Data) - 1): price = [float(i[5]) for i in Data[k - N + 1:k + 1]] # 取近N日的收盤價 nextDate = Data[k + 1][0] # 隔日日期 nextOpen = float(Data[k + 1][2]) # 隔日開盤價 thisClose = float(Data[k][5]) # 當日收盤價 thisMA = sum(price) / N # 當日MA值 # 第一筆資料無法判斷是否交叉 if lastClose != None: # 收盤價由下往上穿越平均線 if lastClose <= lastMA and thisClose > thisMA: # 多單進場 if flag == 0: flag = 1 OrderDate = nextDate OrderPrice = nextOpen # 將空單平倉,並多單進場 elif flag == -1: # 先平倉,並記錄損益 CoverDate = nextDate CoverPrice = nextOpen
from haohaninfo import GOrder # 匯入模組 Broker = 'Simulator' # Yuanta(元大證券)、Capital(群益證券)、Capital_Future(群益期貨)、Kgi(凱基證券)、Kgi_Future(凱基期貨)、Simulator(虛擬期貨) Kind = 'match' # match(成交資訊)、commission(委託資訊)、updn5(上下五檔資訊) Prod = 'TXFJ9' # 商品代碼(GOrder內需先訂閱該商品) lastMinute = None # 存放上一筆資料的分鐘 Close = [] # 存放每分鐘的收盤價 N = 5 # 定義MA期數 # 串接GOrder即時報價 GO = GOrder.GOQuote() for i in GO.Describe(Broker, Kind, Prod): time = i[0] # 時間 minute = time[14:16] # 分鐘 price = float(i[2]) # 價格 if minute == lastMinute: # 同一分鐘 Close[-1] = price # 不斷更新最近一根K棒的收盤價 else: # 不同分鐘 Close.append(price) # 新增一根K棒的收盤價 if len(Close) >= N: # 陣列裡的收盤價數量足夠就可以開始計算MA指標 MA = sum(Close[-N:]) / N # 期數為N期的MA指標 print(i[0], MA) # 印出當前的時間及MA指標 lastMinute = minute # 記錄當前分鐘
from haohaninfo import GOrder # 匯入模組 Broker = 'Simulator' # Yuanta(元大證券)、Capital(群益證券)、Capital_Future(群益期貨)、Kgi(凱基證券)、Kgi_Future(凱基期貨)、Simulator(虛擬期貨) Kind = 'match' # match(成交資訊)、commission(委託資訊)、updn5(上下五檔資訊) Prod = 'TXFJ9' # 商品代碼(GOrder內需先訂閱該商品) lastTime = None # 存放上一筆資料的時間 Close = [] # 存放每分鐘的收盤價 MA_List = [] # 存放每分鐘的MA值 MA = None # 定義MA值 N = 5 # 定義MA期數 # 串接GOrder即時報價 GO = GOrder.GOQuote() for i in GO.Describe(Broker, Kind, Prod): time = i[0] # 時間 minute = time[14:16] # 分鐘 price = float(i[2]) # 價格 if time == lastTime: # 同一分鐘 Close[-1] = price # 不斷更新最近一根K棒的收盤價 else: # 不同分鐘 Close.append(price) # 新增一根K棒的收盤價 if len(Close) >= N: # 陣列裡的收盤價數量足夠就可以開始計算MA指標 MA = sum(Close[-N:]) / N # 期數為N期的MA指標 if time == lastTime: # 同一分鐘 MA_List[-1] = MA # 不斷更新最近一根K棒的MA值 else: # 不同分鐘 MA_List.append(MA) # 新增一根K棒的MA值
# Yuanta(元大證券)、Capital(群益證券)、Capital_Future(群益期貨)、Kgi(凱基證券)、Kgi_Future(凱基期貨)、Simulator(虛擬期貨) Broker = 'Masterlink_Future' PriceOffer = 'Simulator' # match(成交資訊)、commission(委託資訊)、updn5(上下五檔資訊) Kind = 'match' # 取即時報價的商品代碼(GOrder內需先訂閱該商品) Prod = 'TXFA0' # 取得當天日期 Date = datetime.datetime.now().strftime("%Y/%m/%d") # 定義報價指令的物件 GOQ = GOrder.GOQuote() # 定義下單指令的物件 GOC = GOrder.GOCommand() endTime = datetime.datetime.strptime('2020/1/3 16:33:10', '%Y/%m/%d %H:%M:%S') import tick2OHLC A = tick2OHLC.tick2OHLC() for row in GOQ.Describe(PriceOffer, Kind, Prod): time = datetime.datetime.strptime(row[0], '%Y/%m/%d %H:%M:%S.%f') price = float(row[2]) print(time, price) A.put(time, price) # if time >= endTime: # GOQ.EndDescribe()
from haohaninfo import GOrder import datetime from order_bigdata import OrderMKT BK = 'Simulator_Stock' STK = '3481' T1 = '1023' T2 = '1022' GOQ = GOrder.GOQuote() Index = 0 for row in GOQ.Subscribe(BK, 'match', STK): # ['2021/05/27 10:08:24.656481', '2615', '140.5', '10', '88258', '140', '140.5'] print(row) T = datetime.datetime.strptime(row[0], '%Y/%m/%d %H:%M:%S.%f') T0 = T.strftime('%H%M') if Index == 0: print(T0, T1) if T0 >= T1: Index = 1 OINFO = OrderMKT(BK, STK, 'B', '1') print('進場成功', OINFO) break
from haohaninfo import GOrder import GOrder_GetKBar, datetime # Yuanta(元大證券)、Capital(群益證券)、Capital_Future(群益期貨)、Kgi(凱基證券)、Kgi_Future(凱基期貨)、Simulator(虛擬期貨) Broker = 'Simulator' # match(成交資訊)、commission(委託資訊)、updn5(上下五檔資訊) Kind = 'match' # 取即時報價的商品代碼(GOrder內需先訂閱該商品) Prod = 'TXFH9' # 取得當天日期 Date = datetime.datetime.now().strftime("%Y/%m/%d") # 開始判斷時間 StartTime = datetime.datetime.strptime(Date + ' 09:00:00.00', '%Y/%m/%d %H:%M:%S.%f') # 定義報價指令的物件 a = GOrder.GOQuote() # 定義下單指令的物件 b = GOrder.GOCommand() # 定義K棒物件(1分K) KBar = GOrder_GetKBar.KBar(Date, 1) # 固定式停損點數 StopLoss = 20 # 定義WMA快線及慢線期數、 FastN = 5 SlowN = 10 # 定義兩次交叉需間隔的時間 M = 8 # 進場判斷 CrossTime = None Interval = datetime.timedelta(minutes=M)
# 該商品近10年的現金股利 Data3 = [ i[2] for i in Data2 ] # 若資料內有NA值則略過這檔股票 if 'NA' in Data3: continue # 將股利資訊從 字串型態 轉為 浮點位型態 Data4 = [ float(i) for i in Data3 ] # 近10年發放現金股利的次數 Num = len([ i for i in Data4 if float(i) > 0 ]) # 連續10年都有發放現金股利 if Num >= 10: # 每一年發放的現金股利都不低於前一年 Check = True for i in range(1,10): if Data3[i] < Data3[i-1]: Check = False break # 印出符合條件的股票代碼及近10年發放的現金股利 if Check == True: # 取該檔股票的歷史日K棒 (K棒數量,商品代碼,商品種類,日夜盤) KBar = GOrder.GetHistoryKBar('250', Prod, 'Stock', '1') # 目前無法取到上櫃股票的歷史資料 if KBar != ['']: Close = [ i.split(',') for i in KBar ] # 依照逗號分隔欄位 Close = [ float(i[5]) for i in Close ] # 取出收盤價 MA250 = round(sum(Close)/250,2) # 計算年均線(一年約250個交易日) TodayClose = Close[-1] # 最近一日的收盤價 # 收盤價 > 年均線 if TodayClose > MA250: print(Prod,'TodayClose:',TodayClose,'MA250:',MA250)
from haohaninfo import GOrder GOC = GOrder.GOCommand() def OrderMKT(broker, stock, bs, qty): OrderNo = GOC.Order(broker, stock, bs, "0", qty, "IOC", "MKT", "A") while True: OrderRS = GOC.GetAccount(broker, OrderNo) OrderInfo = OrderRS[0].split(',') print(OrderInfo) if OrderInfo[1] == '成交': return OrderInfo # OrderMKT('Simulator_Stock','2615','B','1') # OrderInfo=OrderMKT('Simulator_Stock','2014','B','1') # print('成交時間 %s 成交價 %s'%(OrderInfo[7],OrderInfo[4])) # ['S2021052600045,委託,3481,B,3.7,1000,ROD,2021/05/26 13:16:50,[email protected]'] # ['S2021052600046,成交,3481,B,21.6,1000,IOC,2021/05/26 13:17:19,[email protected]'] # 成交時間 44.05 成交價 2021/05/26 13:25:53 def GetPricebyTick(price, tick): StockPriceList = [] StockPriceList.extend([i / 100 for i in range(1, 1001, 1)]) StockPriceList.extend([i / 100 for i in range(1005, 5005, 5)]) StockPriceList.extend([i / 10 for i in range(501, 1001, 1)]) StockPriceList.extend([i / 10 for i in range(1005, 5005, 5)]) StockPriceList.extend([i for i in range(501, 1001, 1)])