中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何實現日內高低點突破策略

發布時間:2022-01-15 15:19:37 來源:億速云 閱讀:228 作者:小新 欄目:互聯網科技

這篇文章將為大家詳細講解有關python如何實現日內高低點突破策略,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

什么是日內交易

日內交易的目的是以更小的損失,來獲取當天市場微小的價格波動所帶來的利潤。它是指開倉和平倉在同一天內或同一交易時間段內完成的交易方式,開倉和平倉可以是單次,也可以是多次,只要是開平倉在同一個交易日前結束就行。

理論上日內交易不承擔隔夜的跳空風險,是一種較完美的低風險交易策略,但實際上并非如此,雖然日內交易回避了跳空所帶來的風險,同時也錯失了跳空所帶來的利潤。但如果以正確的方式交易,通過配合不同的交易規則,日內交易往往也能產生豐厚的回報。

策略邏輯

我們知道判斷上漲趨勢最簡單的方法是,當前低點比前一個低點更高,當前高點也比前一個高點更高;同理下跌趨勢最簡單的方法是,當前低點比前一個低點更低,當前高點也比前一個高點更低。但如果僅僅以高低點的比較去判斷趨勢的漲跌,這未免太過簡陋,因為價格可能在一個點上來回跳動幾十次甚至上百次,從而導致交易過于頻繁。

所以我們需要設定一個價格區間來過濾這些日常雜波,來對簡單的高低點突破策略進行完善。我們可以根據歷史行情所出現的最高價和最低價,組成一個包含上軌和下軌的通道。根據順勢交易的原則,當價格突破上軌時多頭開倉,當價格突破下軌時空頭開倉。

  • 多頭開倉:當前無持倉,時間是在開盤與收盤前10分鐘之間,并且價格大于上軌

  • 空頭開倉:當前無持倉,時間是在開盤與收盤前10分鐘之間,并且價格小于下軌

  • 多頭平倉:當前持多單,價格小于下軌,或者時間大于14:50

  • 空頭平倉:當前持空單,價格大于上軌,或者時間大于14:50

有人統計過,大部分的窄幅止損都是無效的,小空間的止損會頻繁打臉,所以我們要做的就是設計一個寬幅止損:如果多頭開倉后,價格不升反跌,我們所要做的不是立即止損,而是等待觀望,直到價格跌破下軌才止損出局;空頭開倉后也是如此,當價格不跌反升,繼續等待價格是否會自我修正,直到跌破上軌才止損出局。

策略編寫

第1步:編寫策略框架
編寫策略就像蓋房子一樣,先把地基和框架搭建好,再往里面填充東西。我們這里用了兩個函數,一個是main主函數,另一個是onTick函數,程序會先從main函數執行代碼,在main函數中,我們用了一個無限循環模式,重復執行onTick函數。

# 策略主函數
def onTick():
    pass


# 程序入口
def main():
    while True:  # 進入無限循環模式
        onTick()  # 執行策略主函數
        Sleep(1000)  # 休眠1秒

第2步:導入time庫

# 導入庫
import time

因為日內策略在編寫的時候,要判斷當前的時間來控制開平倉邏輯,這個策略在設計的時候是:只能在9點30分之14點50分之間開倉,14點50分之后全部平倉,其余的時間都過濾掉了。所以就需要引入time時間庫。

第3步:設置全局變量

mp = 0  # 用于控制虛擬持倉
on_line = 0  # 上軌
under_line = 0  # 下軌

在全局變量中,mp主要用于控制虛擬持倉,判斷持倉一般分為兩種,一種是真實的賬戶持倉,另一種就是虛擬持倉,還有一種是真實持倉和虛擬持倉聯合判斷。實盤時我們只使用真實持倉就足夠了,但這里為了簡化策略,作為演示使用虛擬持倉。on_line和under_line分別記錄上軌和下軌。

第4步:處理時間

# 處理時間函數
def can_time(hour, minute):
    hour = str(hour)
    minute = str(minute)
    if len(minute) == 1:
        minute = "0" + minute
    return int(hour + minute)

exchange.SetContractType("MA888")  # 訂閱期貨品種
bar_arr = exchange.GetRecords()  # 獲取K線數組 
time_new = bar_arr[len(bar_arr) - 1]['Time']  # 獲取當根K線的時間戳
time_local_new = time.localtime(time_new / 1000)  # 處理時間戳
hour_new = int(time.strftime("%H", time_local_new))  # 格式化時間戳,并獲取小時
minute_new = int(time.strftime("%M", time_local_new))  # 格式化時間戳,并獲取分鐘
day_new = int(time.strftime("%d", time_local_new))  # 格式化時間戳,并獲取日期
time_previous = bar_arr[len(bar_arr) - 2]['Time']  # 獲取上根K線的時間戳
time_local_previous = time.localtime(time_previous / 1000)  # 處理時間戳
day_previous = int(time.strftime("%d", time_local_previous))  # 格式化時間戳,并獲取日期

處理時間一共用于兩個地方:一個是判斷當前時間是否在我們規定的交易時間內,如果是在這個時間之內并且達到開倉條件就開倉,如果不是在這個時間之內并且當前有持倉就全部平倉;另一個是判斷當前K線是不是最新交易日的K線,如果當前K線是最新交易日的K線,就重置on_line和under_line的值。

第4步:計算高低點上下軌

global mp, on_line, under_line  # 引入全局變量
high = bar_arr[len(bar_arr) - 2]['High']  # 獲取上根K線的最高價
low = bar_arr[len(bar_arr) - 2]['Low']  # 獲取上根K線的最低價
if day_new != day_previous or len(bar_arr) == 1:  # 如果當前是第一個K線,或者是最新一根K線
    on_line = high * up # 重置上軌
    under_line = low * down  # 重置下軌
if can_time(hour_new, minute_new) < 930:  # 如果不是在規定交易的時間內
    if high > on_line:  # 如果上根K線最高價大于上軌
        on_line = high * up  # 重置上軌
    elif low < under_line:  # 如果上根K線最低價小于下軌
        under_line = low * down  # 重置上軌

計算高低點上下軌的邏輯其實非常簡單:如果當前是第一根K線,那么on_line和under_line的值分別是最高價和最低價,如果當前K線是最新交易日的K線,就重置on_line和under_line的值為最高價和最低價;一旦在規定的交易時間內,on_line和under_line的值就固定不變了,除非在這個時間之外并且如果上根K線最高價大于on_line就重置為最新的最高價;如果上根K線最低價小于under_line就重置為最新的最低價。

第5步:下單交易

close_new = bar_arr[len(bar_arr) - 1]['Close']  # 獲取最新價格(賣價),用于開平倉
if mp == 0 and 930 < can_time(hour_new, minute_new) < 1450:  # 如果當前無持倉,并且在規定的交易時間內
    if close_new > on_line:  # 如果價格大于上軌
        exchange.SetDirection("buy")  # 設置交易方向和類型
        exchange.Buy(close_new, 1)  # 開多單
        mp = 1  # 設置虛擬持倉的值,即有多單
    elif close_new < under_line:  # 如果價格小于下軌
        exchange.SetDirection("sell")  # 設置交易方向和類型
        exchange.Sell(close_new - 1, 1)  # 開空單
        mp = -1  # 設置虛擬持倉的值,即有空單

# 如果持多單,并且價格小于下軌或者非規定的交易時間
if mp > 0 and (close_new < under_line or can_time(hour_new, minute_new) > 1450):
    exchange.SetDirection("closebuy")  # 設置交易方向和類型
    exchange.Sell(close_new - 1, 1)  # 平多單
    mp = 0  # 設置虛擬持倉的值,即空倉

# 如果持空單,并且價格大于上軌或者非規定的交易時間
if mp < 0 and (high > on_line or can_time(hour_new, minute_new) > 1450):
    exchange.SetDirection("closesell")  # 設置交易方向和類型
    exchange.Buy(close_new, 1)  # 平空單
    mp = 0  # 設置虛擬持倉的值,即空倉

在下單交易之前,我們要先獲取當前最新價格,因為在下單時需要在函數中傳入下單價格。然后使用if語句,根據之前設計的交易邏輯,先是判斷當前的持倉狀態,然后再判斷當前時間狀態,以及最新價格與上下軌的相互位置關系,最后下單交易并重置虛擬持倉狀態。需要注意的是在期貨交易下單之前,先指定交易的方向類型,即:開多、開空、平多、平空。調用exchange.SetDirection()函數,分別傳入:“buy”、“sell”、“closebuy”、“closesell”。

完整策略

# 回測配置
'''backtest
start: 2015-02-22 00:00:00
end: 2019-10-17 00:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''

# 導入庫
import time


# 定義全局變量
mp = 0  # 用于控制虛擬持倉
on_line = 0  # 上軌
under_line = 0  # 下軌


def onTick():
    # 處理時間函數
    def can_time(hour, minute):
        hour = str(hour)
        minute = str(minute)
        if len(minute) == 1:
            minute = "0" + minute
        return int(hour + minute)
    
    exchange.SetContractType("MA888")  # 訂閱期貨品種
    bar_arr = exchange.GetRecords()  # 獲取K線數組 
    time_new = bar_arr[len(bar_arr) - 1]['Time']  # 獲取當根K線的時間戳
    time_local_new = time.localtime(time_new / 1000)  # 處理時間戳
    hour_new = int(time.strftime("%H", time_local_new))  # 格式化時間戳,并獲取小時
    minute_new = int(time.strftime("%M", time_local_new))  # 格式化時間戳,并獲取分鐘
    day_new = int(time.strftime("%d", time_local_new))  # 格式化時間戳,并獲取日期
    time_previous = bar_arr[len(bar_arr) - 2]['Time']  # 獲取上根K線的時間戳
    time_local_previous = time.localtime(time_previous / 1000)  # 處理時間戳
    day_previous = int(time.strftime("%d", time_local_previous))  # 格式化時間戳,并獲取日期
    
    global mp, on_line, under_line  # 引入全局變量
    high = bar_arr[len(bar_arr) - 2]['High']  # 獲取上根K線的最高價
    low = bar_arr[len(bar_arr) - 2]['Low']  # 獲取上根K線的最低價
    if day_new != day_previous or len(bar_arr) == 1:  # 如果當前是第一個K線,或者是最新一根K線
        on_line = high * up # 重置上軌
        under_line = low * down  # 重置下軌
    if can_time(hour_new, minute_new) < 930:  # 如果不是在規定交易的時間內
        if high > on_line:  # 如果上根K線最高價大于上軌
            on_line = high * up  # 重置上軌
        elif low < under_line:  # 如果上根K線最低價小于下軌
            under_line = low * down  # 重置上軌
    
    close_new = bar_arr[len(bar_arr) - 1]['Close']  # 獲取最新價格(賣價),用于開平倉
    if mp == 0 and 930 < can_time(hour_new, minute_new) < 1450:  # 如果當前無持倉,并且在規定的交易時間內
        if close_new > on_line:  # 如果價格大于上軌
            exchange.SetDirection("buy")  # 設置交易方向和類型
            exchange.Buy(close_new, 1)  # 開多單
            mp = 1  # 設置虛擬持倉的值,即有多單
        elif close_new < under_line:  # 如果價格小于下軌
            exchange.SetDirection("sell")  # 設置交易方向和類型
            exchange.Sell(close_new - 1, 1)  # 開空單
            mp = -1  # 設置虛擬持倉的值,即有空單
    
    # 如果持多單,并且價格小于下軌或者非規定的交易時間
    if mp > 0 and (close_new < under_line or can_time(hour_new, minute_new) > 1450):
        exchange.SetDirection("closebuy")  # 設置交易方向和類型
        exchange.Sell(close_new - 1, 1)  # 平多單
        mp = 0  # 設置虛擬持倉的值,即空倉
    
    # 如果持空單,并且價格大于上軌或者非規定的交易時間
    if mp < 0 and (high > on_line or can_time(hour_new, minute_new) > 1450):
        exchange.SetDirection("closesell")  # 設置交易方向和類型
        exchange.Buy(close_new, 1)  # 平空單
        mp = 0  # 設置虛擬持倉的值,即空倉

        
# 程序入口      
def main():
    while True:
        onTick()
        Sleep(1000)  #休眠1秒

關于“python如何實現日內高低點突破策略”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中宁县| 蓝田县| 云林县| 普陀区| 新密市| 东阳市| 辽阳市| 朝阳区| 错那县| 南康市| 额济纳旗| 青铜峡市| 义马市| 固阳县| 天等县| 西盟| 广东省| 乃东县| 潢川县| 四子王旗| 菏泽市| 马山县| 榕江县| 五指山市| 海伦市| 亳州市| 阜城县| 高安市| 淮阳县| 广德县| 阿拉善盟| 云和县| 尼勒克县| 安泽县| 固原市| 微山县| 雅江县| 临漳县| 昌乐县| 乌兰县| 贵港市|