如何定時關機Win10系統?
·首先打開控制面板選擇"管理工具"。
·然后在左側的任務計劃程序庫中右鍵點擊中間的空白處選擇"新建任務"。
·接下來新建任務窗口出現輸入名稱和描述,例如"每天晚上22點關機"。
·在觸發器窗口中選擇每天,根據您的需要輸入at22:00Shutdown-s,意思是"在每天晚上22點執行關機操作"。
·最后點擊"保存"按鈕即可。
·保存后您可以在任務計劃程序庫中看到新建的任務,您只需在任務計劃程序庫中選擇需要關機的任務,然后按照提示執行關機操作即可。
希望這個視頻對您有所幫助!
1.關于 python 如何安裝,b 站已經有了很多詳細的視頻教程,這里便不再贅述,需要注意的是,xtquant 要求 python 的版本在 py3.6 - py3.12 之間。(太舊或者太新都不行)
2.在使用 xtdc 前,我們需要將 xtquant 包安裝到我們的 python 環境中,目前 xtquant 包可以通過在 cmd 中執行 pip install xtquant 進行安裝,或通過迅投官網下載。xtquant 下載鏈接
3.如果你是通過官網下載 xtquant,那么下載完成后,需要將壓縮包解壓縮到本地的 python 目錄下的 .\Lib\site-packages 文件,通過 pip 指令不需要這步操作
在 python 環境中執行以下語句,如果不報錯,則表示安裝成功。
from xtquant import xtdatacenter as xtdc
1.個人 token 在用戶中心的個人設置頁面下能看到,直接進行復制就行
2.token 僅支持 VIP 及以上的用戶權限進行獲取,目前新用戶注冊有 14 天 VIP 試用
3.請妥善保管好自己的個人 token,默認情況下,VIP 僅允許單點登錄,有需要多點登錄的可以聯系官方進行申請
#主程序代碼#主程序代碼#主程序代碼from xtquant import xtdatacenter as xtdcfrom xtquant import xtdata# 設置tokenxtdc.set_token("你的token")# 開啟K線全推xtdc.set_kline_mirror_enabled(True)# 設置start_local_service為False,使xtdc監聽的端口為我們自己指定的端口xtdc.init(start_local_service=False)# 指定xtdc使用 58601端口xtdc.listen(port=58601)# 使主程序一直運行,不添加這句的話程序會直接完成運行并退出xtdata.run()
# 子程序代碼# 子程序代碼# 子程序代碼from xtquant import xtdata# 鏈接到主程序獲取數據,鏈接的端口需要一致xtdata.connect(port = 58601)# 取一個tick看看,程序是否正常鏈接了print(xtdata.get_full_tick(["000001.SZ"]))
import pandas as pdfrom xtquant import xtdatafrom tqdm import tqdm import refrom myfunc import get_all_symbol_dict,send_feishu_msg # myfunc可以在github上搜索xt/qmt找到,上不去的也可以加論壇圈子或者官方群找我import sysimport jsonimport requests# 鏈接到主程序獲取數據,鏈接的端口需要一致xtdata.connect(port = 58601)# 指定VIP服務器進行鏈接info={'ip': 'vipsxmd1.thinktrader.net', 'port': 55310, 'username': '', 'pwd': ''}qs = xtdata.QuoteServer(info)qs.connect()# 更新基礎信息print("開始下載板塊數據")xtdata.download_sector_data() ## 更新板塊信息print("板塊數據下載完成")# 設置需要下載的周期# period_list = ["1d","1m"] # 周期參考官方文檔http://dict.thinktrader.net/nativeApi/xtdata.html?id=7zqjlm#%E4%B8%8B%E8%BD%BD%E5%8E%86%E5%8F%B2%E8%A1%8C%E6%83%85%E6%95%B0%E6%8D%AEperiod_list = ["1d"] # 周期參考官方文檔# 獲取要下載的標的列表stock_list = xtdata.get_stock_list_in_sector("滬深京A股") ## 獲取股票列表ls = ['上期所', '中金所', '大商所', '廣期所', '鄭商所'] ## 期貨交易所future_option_list = [] # 板塊里沒有區分期權和期貨,需要手動篩選過濾下for i in ls: future_option_list += xtdata.get_stock_list_in_sector(i)future_list = get_all_symbol_code(future_option_list) # 篩選出所有的期貨標的# 調用函數進行下載,并使用tqdm庫顯示進度條print("開始下載行情數據")for period in period_list: for i in tqdm(stock_list): xtdata.download_history_data(i,period,incrementally=True) # incrementally 參數是增量下載選項,新版本xtquant 才有的,如果這里報錯了,更新xtquant包 print(f"周期{period}股票數據下載完成") for i in tqdm(future_list): xtdata.download_history_data(i,period,incrementally=True) print(f"周期{period}期貨數據下載完成")# 創建一個回調函數用來看財務數據的下載進度def on_progress(data): print(data)print("開始下載財務數據")xtdata.download_financial_data2(stock_list,callback=on_progress)print("財務數據下載完成")sys.exit() # 一切結束后,退出程序# 這部分以后再出教程# url = "f"# send_feishu_msg(url,"收盤作業完成,程序正常退出")
任務計劃是啥呢?簡單說就是 windows 自帶的一個能夠自動執行特定任務或程序的功能,我們可以利用這個功能,實現在無人值守的情況下自動運行指定的 py 腳本,實現每日自動更新下載當日數據的功能。
Step1. 打開 windows 任務計劃管理器
Step2.點擊創建基本任務,并輸入任務名稱,點擊下一步。
Step3. 為需要自動啟動的腳本添加一個啟動任務,啟動的頻率和時間根據自己需要選擇,注意!??!主連接程序必須在子程序之前啟動,建議兩個程序啟動間隔 1 分鐘。
Step4. 【程序或腳本】處填 python.exe 或者 py.exe Step5. 【添加參數】處填 py 腳本的文件名。Step6. 【起始于】處填 py 腳本代碼的目錄。
最后添加一個任務,用于停止所有腳本進程,對于無人值守的情況來說非常有必要,在交易日切換后重啟并重新進行服務器鏈接可以避免出現不可知的錯誤。
Step7.基本步驟和上邊一致,最后的[程序或腳本]處填 taskkill, [添加參數]處填 /IM python.exe
本策略是通過 token 連接方式獲取高級行情數據,并通過 miniqmt 進行實際下單交易,止盈止損管理
標的池選擇:上證 50
買入條件:當股票 1h 周期出現 ma 金叉,且 1d 周期出現 macd 位于 0 軸之上的情況,觸發買入條件
賣出條件:當持倉的股票盈利超過設定幅度,或虧損超過設定幅度時,觸發賣出條件
# 股票池:50etf標的池# 策略:雙均線策略# 止盈止損:比例止盈止損import pandas as pdimport numpy as npimport timeimport datetimefrom xtquant import xtdata,xttrader,xtconstantfrom xtquant.xttype import StockAccount## 策略所用的指標def ema(df:pd.DataFrame,N): return df.ewm(span=N, adjust=False).mean() def MACD(close:pd.DataFrame, short = 12, long = 26, M = 9): DIF = ema(close,short) - ema(close,long) DEA = ema(DIF,M) return DIF.round(3), DEA.round(3)def CROSSUP(a, b): """ 向上穿越: 表當a從下方向上穿過b, 成立返回1, 否則返回0 Args: a (pandas.Series): 數據序列1 b (pandas.Series): 數據序列2 Returns: pandas.Series: 上穿標志序列 """ crossup_data = pd.Series(np.where((a > b) & (a.shift(1) <= b.shift(1)), 1, 0)) return crossup_data# 初始化部分### 這塊有很多可以自己優化的點,比如一些固定的東西可以直接寫成配置文件,自己再把整個初始化的部分封裝成一個函數,避免重復寫xtdata.connect(port=58601) # 連接主程序開放的數據端口,以獲取歷史數據和實時數據account = StockAccount("55001435","STOCK") # 設置交易賬戶,這個賬戶必須在你界面的能看到,且能手動下單的xt_trade = xttrader.XtQuantTrader(r"C:\Program Files\國金證券QMT交易端\userdata_mini",int(time.time())) # 連接miniqmt,如果是連接投研的話,目錄是..\userdataclass Mycallback(xttrader.XtQuantTraderCallback): # 繼承XtQuantTraderCallback類,覆蓋定義自己的回調函數,這個類是開源的,不懂的可以點進去自己看 # 這個策略其實用不上回調,這里只寫一個演示用法 def on_stock_order(self, order): """ 委托回報推送 :param order: XtOrder對象 :return: """ print(datetime.datetime.now(), '委托回調', order.order_remark) def on_stock_trade(self, trade): """ 成交變動推送 :param trade: XtTrade對象 :return: """ print(datetime.datetime.now(), '成交回調', trade.order_remark)callback = Mycallback()xt_trade.register_callback(callback) # 注冊回調信息xt_trade.start() # 啟動交易線程connect_result = xt_trade.connect() # 連接賬戶準備交易subscribe_result = xt_trade.subscribe(account) # 訂閱接受賬戶的回調信息,沒這一步的話收不到if connect_result != 0: raise KeyboardInterrupt("連接交易失敗,請查看https://dict.thinktrader.net/nativeApi/question_function.html?id=7zqjlm按步驟進行排查")# 設置參數strategyName = "雙均線_MACD_大小周期共振策略" # 設置策略名稱stock_list = xtdata.get_stock_list_in_sector("上證50") # 設置股票交易列表period1 = "1d" # 大數據周期period2 = "1h" # 小數據周期line_1 = 10 # 短周期line_2 = 20 # 長周期macd_n1,macd_n2,macd_M = 12, 26, 9 # MACD指標參數take_profit_ratio = 10 # 止盈比例,單位%stop_loss_ratio = 5 # 止損比例,單位%# 初始化持倉容器holdings = {}# 信號計算def strategyFunc(data): # 獲取行情數據 kline_1d:pd.DataFrame = xtdata.get_market_data_ex([],stock_list,period=period1,count=40) kline_1h:pd.DataFrame = xtdata.get_market_data_ex([],stock_list,period=period2,count=300) # 獲取賬戶持倉數據 for obj in xt_trade.query_stock_positions(account): stock_code = obj.stock_code if stock_code not in stock_list: continue holdings[stock_code] = { "volume":obj.volume, # 持倉量 "can_use_volume":obj.volume, # 可用量 "open_price":obj.open_price, # 持倉均價 "market_value":obj.market_value # 市值 } print(holdings) tick = xtdata.get_full_tick(list(holdings.keys()) + stock_list) # print(data) for stock in stock_list: data1 = kline_1h[stock] # 取這個標的的1h數據 data2 = kline_1d[stock] # 取這個標的的1d數據 ## 計算均線 ma1 = data1["close"].rolling(line_1).mean() # 計算短周期均線 ma2 = data1["close"].rolling(line_2).mean() # 計算長周期均線 signal = CROSSUP(ma1,ma2) # 計算金叉信號序列 ## 計算MACD dif,dea = MACD(data2["close"]) diff = dif - dea # print(signal,diff) # 如果MACD是金叉狀態,即DIFF在0軸之上,且1小時均線金叉,則觸發買入信號 # print(stock,signal.iloc[-1] , diff.iloc[-1]) if signal.iloc[-1] and diff.iloc[-1] > 0: # 判斷是否有持倉,已經有持倉就不開倉了 if stock in holdings: continue else: # 按最新價買入標的1手,實際交易中還要考慮買入但未成交的情況下,怎么防止超單 xt_trade.order_stock_async(account, stock, xtconstant.STOCK_BUY, 100, xtconstant.LATEST_PRICE, 0, strategyName, 'order_test') # 止盈止損部分 for stock in holdings: _d = holdings[stock] cost = _d["open_price"] * _d["volume"] # 計算成本 profit = _d["market_value"] - cost # 計算盈利金額 # 如果虧損超過了設定的幅度 if (cost / _d["market_value"] - 1) * 100 < - stop_loss_ratio and _d["volume"] > 0: # 賣出所有持倉 xt_trade.order_stock_async(account, stock, xtconstant.STOCK_SELL, _d["volume"], xtconstant.LATEST_PRICE, 0, strategyName, 'stop_loss_ratio') # 如果盈利超過了指定的幅度 if (cost / _d["market_value"] - 1) * 100 > take_profit_ratio and _d["volume"] > 0: # 賣出所有持倉 xt_trade.order_stock_async(account, stock, xtconstant.STOCK_SELL, _d["volume"], xtconstant.LATEST_PRICE, 0, strategyName, 'take_profit_ratio')# 行情數據訂閱for i in stock_list: xtdata.subscribe_quote(i,period=period1,count=-1) xtdata.subscribe_quote(i,period=period2,count=-1)xtdata.subscribe_quote("000300.SH",period="tick",callback=strategyFunc) # 訂閱主圖tick,并用主圖tick來驅動策略信號計算,來實現類似與內置python中handlebar的機制# 非VIP用戶受訂閱數量限制,最大只能訂閱300次,本策略目前只用了101次xtdata.run()
在第四章中,我們從服務器已經下載了所需要的 板塊數據,財務數據,K線數據,接下來我們來通過 token 實現一個簡單的雙均線策略,并輸出信號,策略代碼:
from xtquant import xtdataimport pandas as pdimport numpy as npimport jsonimport osfrom myfunc import CROSSUPxtdata.connect(port=58601)strategyName = "雙均線策略" # 設置策略名稱pos_file_path = r"E:\token教學\posititon" # 持倉文件路徑,用于被交易端讀取strategy_pos_file = os.path.join(pos_file_path,strategyName + ".json")try: with open(strategy_pos_file,"r") as f: strategy_pos = json.load(f)except FileNotFoundError: strategy_pos = {} # 如果文件沒有找到,就說明沒有持倉# stock_list = xtdata.get_stock_list_in_sector("滬深300")[:50] # 設定股票池,演示從滬深300取50只計算stock_list = ["000001.SZ","301158.SZ"] # 本來想用五十只測,誰想到A股爛到500只都沒有金叉...period = "1d" # 數據周期line_1 = 10 # 短周期line_2 = 20 # 長周期def call_back(data:dict): _list = list(data.keys()) stock = _list[0] kline:pd.DataFrame = xtdata.get_market_data_ex([],_list,period=period,count=max(line_1,line_2)+1)[stock] close = kline["close"] ma1 = close.rolling(line_1).mean() ma2 = close.rolling(line_2).mean() signal = CROSSUP(ma1,ma2) # 計算金叉信號 position = strategy_pos.get(stock,0) # 讀取本地持倉緩存,如果沒有這個標的,則認為沒有持倉 if signal.iloc[-1] and position == 0: # 如果金叉了,并且沒有持倉 strategy_pos[stock] = 100 # 則記錄這個標的應該要買入100股 with open(strategy_pos_file,"w") as f: json.dump(strategy_pos,f) # 把這條記錄寫入信號文件,交給策略交易端下單for i in stock_list: xtdata.subscribe_quote(i,period=period,count=-1,callback=call_back)xtdata.run()
運行上段代碼可以發現,當交易信號觸發后,我們設置的策略持倉路徑下生成了一個 雙均線策略.json 文件,這個文件的內容就是我們目前的理論持倉。
之后我們會需要一個交易端來完成真正的下單操作,并完成策略隔離。
歡迎和我一起加入 QMT 實戰交流社群,交流群內有許多做量化交易的高手和大佬,具有良好的分享和互助氛圍。