python 用while输出数字金字塔_用Python实现一个Dual Thrust数字货币量化交易策略
Dual Thrust交易算法介紹
Dual Thrust交易算法是由Michael Chalek開發的著名量化交易策略。它通常用于期貨,外匯和股票市場。Dual Thrust的概念屬于典型的突破交易系統,其運用“雙推力”系統根據歷史價格構建更新的回溯期,這在理論上使其在任何給定時期內更加穩定。
在這篇文章中,我們給出了此策略的詳細邏輯細節,并展示了如何在發明者量化平臺上實現此算法。首先,我們要選擇所交易標的的歷史價格,該范圍基于最近N天的收盤價,最高價和最低價計算。當市場從開盤價移動一定范圍時,執行開倉。
我們在常見的兩個市場狀態下用單個交易對測試了此策略,即趨勢市場和震蕩市場。結果表明,這種動量交易系統在趨勢市場中運行得更好,在波動較大的市場中會觸發一些無效買賣信號。在區間市場下,我們可以調整參數以獲得更好的回報。作為個別參照交易標的的比較,我們還測試了國內商品期貨市商。結果表明該策略好于平均表現。
DT策略原理
它的邏輯原型是常見的日內交易策略。開盤區間突破策略基于今天的開盤價加上或減去昨天幅度的一定百分比來確定上下軌。當價格突破上方軌道時,它會開倉買入,當它突破下方軌道時,它會開倉做空。
策略原理
- 在收盤后,計算兩個價值:最高價 - 收盤價,收盤價 - 最低價。然后取這兩個值中較大的值,將該值乘以0.7。讓我們稱之為值K,K值我們稱為觸發值。
- 第二日開市后,記錄開盤價,然后在價格超過(開盤價+觸發價值)時立即買入,或在價格低于(開盤價 - 觸發價值)時賣空。
- 此策略沒有明顯的止損。這個系統是一個反向系統,也就是說,如果在價格超過(開盤價+觸發值)時有一個空頭倉位訂單,那么它將發送兩個買單(一個關閉錯誤的倉位,另一個打開正確方向的倉位)。出于同樣的原因,如果有一個多頭倉位價格低于(開盤價-觸發價值),那么它將發送兩個賣單。
DT策略的數學表達式
范圍=最大值(HH-LC,HC-LL)
多頭信號的計算方法是
cap = open + K1 × Rangecap = open + K1 × Range
空頭短信號的計算方法是
floor = open – K2 × Rangefloor = open – K2 × Range
其中K1和K2是參數。當K1大于K2時,觸發多頭信號,反之亦然。為了演示,我們選擇K1 = K2 = 0.5。在實際交易中,我們仍然可以使用歷史數據來優化這些參數或根據市場趨勢調整參數。如果您看漲市場,K1應小于K2,如果您看跌市場,則K1應大于K2。
該系統是一個反轉系統,因此如果投資者在價格突破上軌時持有空頭倉位,則在開多倉前要先平掉空頭倉位。如果投資者在價格突破下軌時持有多頭倉位,則在開新的空頭倉位之前應先平掉多頭倉位。
DT策略的改進:
在范圍設置中,引入前N天的四個價格點(高,開,低,收),使得一定時期內的范圍相對穩定,可應用于日線趨勢跟蹤。
此策略的開多和空的觸發條件,考慮不對稱幅度,多空交易可參考范圍應該選擇不同數量的周期,也可以通過參數K1和K2來確定。當K1K2時,空頭信號相對容易被觸發。
因此,在使用此策略時,一方面可以參考歷史數據回測的最佳參數。另一方面,您可以根據自己對后勢的判斷或其他主要周期技術指標分階段調整K1和K2。
這是一種等待信號,進入市場,套利,然后離開市場的典型交易方式,但效果非常出色。
在發明者量化平臺部署DT策略
我們打開,FMZ.COM, 登陸賬戶,點擊控制中心,部署托管者和機器人。
關于如何部署托管者和機器人,請參考我之前的文章:https://www.fmz.com/bbs-topic/4140
想購買自己云計算服務器部署托管者的讀者,可以參考這篇文章:https://www.fmz.com/bbs-topic/2848
接下來,我們點擊左側欄目當中的策略庫,點擊新建策略
在編寫策略頁面右上角記得選擇編程語言為Python,如圖:
接下來我們把Python代碼寫入代碼編輯頁面中,下面的代碼,有著非常詳細的逐行注釋,各位讀者可以慢慢理解和體會。
我們就用OKCoin期貨來測試這個策略:
import time # 這里需要引入python自帶的時間庫,后邊的程序會用到class Error_noSupport(BaseException): # 我們定義一個名為ChartCfg的全局class,用來初始化策略圖表設置。對象有很多關于圖表功能的屬性。圖表庫為:HighCharts def __init__(self): # log出提示信息 Log("只支持OKCoin期貨!#FF0000")class Error_AtBeginHasPosition(BaseException): def __init__(self): Log("啟動時有期貨持倉! #FF0000")ChartCfg = { '__isStock': True, # 該屬性用于控制是否顯示為單獨控制數據序列(可以在圖表上取消單獨一個數據序列的顯示),如果指定__isStock: false, 則顯示為普通圖表 'title': { # title為圖表的主要標題 'text': 'Dual Thrust 上下軌圖' # title的一個屬性text為標題的文本,這里設置為'Dual Thrust 上下軌圖'該文本就會顯示在標題位置 }, 'yAxis': { # 圖表坐標Y軸的相關設置 'plotLines': [{ # Y軸上的水平線(和Y軸垂直),該屬性的值是一個數組,即多條水平線的設置 'value': 0, # 水平線在Y軸上的坐標值 'color': 'red', # 水平線的顏色 'width': 2, # 水平線的線寬 'label': { # 水平線上的標簽 'text': '上軌', # 標簽的文本 'align': 'center' # 標簽的顯示位置,這里設置為居中(即 :'center') }, }, { # 第二條水平線([{...},{...}]數組中的第二個元素) 'value': 0, # 水平線在Y軸上的坐標值 'color': 'green', # 水平線的顏色 'width': 2, # 水平線的線寬 'label': { # 標簽 'text': '下軌', 'align': 'center' }, }] }, 'series': [{ # 數據序列,即用來在圖表上顯示數據線、K線、標記等等內容的數據。也是一個數組第一個索引為0。 'type': 'candlestick', # 索引為0數據序列的類型:'candlestick' 表示為K線圖 'name': '當前周期', # 數據序列的名稱 'id': 'primary', # 數據序列的ID,用于下一個數據序列相關設置。 'data': [] # 數據序列的數組,用于儲存具體的K線數據 }, { 'type': 'flags', # 數據序列,類型:'flags',在圖表上顯示標簽,表示做多和做空。索引為1。 'onSeries': 'primary', # 這個屬性表示標簽顯示在id為'primary'上。 'data': [] # 保存標簽數據的數組。 }] }STATE_IDLE = 0 # 狀態常量,表示空閑STATE_LONG = 1 # 狀態常量,表示持多倉STATE_SHORT = 2 # 狀態常量,表示持空倉State = STATE_IDLE # 表示當前程序狀態 ,初始賦值為空閑LastBarTime = 0 # K線最后一柱的時間戳(單位為毫秒,1000毫秒等于1秒,時間戳是1970年1月1日到現在時刻的毫秒數是一個很大的正整數)UpTrack = 0 # 上軌值BottomTrack = 0 # 下軌值chart = None # 用于接受Chart這個API函數返回的圖表控制對象。用該對象(chart)可以調用其成員函數向圖表內寫入數據。InitAccount = None # 初始賬戶情況LastAccount = None # 最新賬戶情況Counter = { # 計數器,用于記錄盈虧次數 'w': 0, # 贏次數 'l': 0 # 虧次數}def GetPosition(posType): # 定義一個函數,用來存儲賬戶持倉信息 positions = exchange.GetPosition() # exchange.GetPosition()是發明者量化的官方API,關于它的用法,請參考我的官方API文檔:https://www.fmz.com/api return [{'Price': position['Price'], 'Amount': position['Amount']} for position in positions if position['Type'] == posType] # 返回各種持倉信息def CancelPendingOrders(): # 定義一個函數,專門用來撤單 while True: # 循環檢查 orders = exchange.GetOrders() # 如果有持倉 [exchange.CancelOrder(order['Id']) for order in orders if not Sleep(500)] # 撤單語句 if len(orders) == 0: # 邏輯判斷 break def Trade(currentState,nextState): # 定義一個函數,用來判斷下單邏輯 global InitAccount,LastAccount,OpenPrice,ClosePrice # 定義全局作用域 ticker = _C(exchange.GetTicker) # 關于_C的用法,請參考:https://www.fmz.com/api slidePrice = 1 # 定義滑點值 pfn = exchange.Buy if nextState == STATE_LONG else exchange.Sell # 買賣判斷邏輯 if currentState != STATE_IDLE: # 循環開始 Log(_C(exchange.GetPosition)) # 日志信息 exchange.SetDirection("closebuy" if currentState == STATE_LONG else "closesell") # 調整下單方向,特別是下過單后 while True: ID = pfn( (ticker['Last'] - slidePrice) if currentState == STATE_LONG else (ticker['Last'] + slidePrice), AmountOP) # 限價單,ID = pfn(-1, AmountOP)為市價單,ID = pfn(AmountOP)為市價單 Sleep(Interval) # 休息一陣,防止API訪問頻率過快,賬戶被封。 Log(exchange.GetOrder(ID)) # Log信息 ClosePrice = (exchange.GetOrder(ID))['AvgPrice'] # 設置收盤價 CancelPendingOrders() # 調用撤單函數 if len(GetPosition(PD_LONG if currentState == STATE_LONG else PD_SHORT)) == 0: # 撤單邏輯 break account = exchange.GetAccount() # 獲取賬戶信息 if account['Stocks'] > LastAccount['Stocks']: # 如果當前賬戶幣值大于之前賬戶幣值 Counter['w'] += 1 # 盈虧計數器中,盈利次數加一 else: Counter['l'] += 1 # 否者虧損次數加一 Log(account) # log信息 LogProfit((account['Stocks'] - InitAccount['Stocks']),"收益率:總結
以上是生活随笔為你收集整理的python 用while输出数字金字塔_用Python实现一个Dual Thrust数字货币量化交易策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀怎么修改自定义铭文(《王者》在线
- 下一篇: python脚本语言采用声音作为手段_L