簡介
aiomql
套件是一個先進的演算法交易框架,它增強並擴展了 MetaTrader5 Python 整合程式庫 (metatrader5
) 的功能。其目的是簡化建立自訂交易機器人的過程,同時提供一套豐富的工具和抽象,專門用於演算法交易。 aiomql
框架的設計理念是靈活性和適應性,它可以滿足各種用戶的需求,從尋求 MetaTrader5 Python 整合的輕量級非同步替代方案的用戶,到構建複雜的多策略交易機器人的開發人員。
需求
本教學介紹了 aiomql
框架的第四版,它在速度、效率和設計方面比之前的版本有了顯著的改進。此版本的一個重要亮點是包含了一個強大的回測功能,讓使用者在即時部署之前使用歷史資料測試交易策略。
雖然熟悉 aiomql
框架的早期版本可以增強您的理解,但這並不是先決條件。本教程旨在即使是從未使用過該框架的初學者也能輕鬆理解。但是,要充分理解和應用所涵蓋的概念,需要具備 Python 的工作知識和對演算法交易的基本理解。
雖然本文主要作為框架的介紹而不是逐步教程,但它確實包含需要 Python 3.11 的程式碼片段。如果您在 NumPy 中遇到相容性問題,您可以使用以下命令安裝受支援的版本來解決這些問題:
<code class="language-bash">pip install aiomql pip uninstall numpy pip install 'numpy<v2></v2></code>
aiomql
框架分為三個主要子包(core、contrib 和 lib),以及一個頂層模組 utils.py
,該模組提供整個框架中使用的實用程式函數。為了方便起見,所有類別、函數、常數和其他元件都可以直接從頂部存取。
如前所述,aiomql
函式庫是 metatrader5
套件的非同步對應版本。此功能是透過 MetaTrader 類別實現的,它是框架的一個基本元件。該類別複製了 metatrader5
庫的功能,將其函數、常數和專用類型作為方法和屬性提供。
metatrader5
套件中的函數作為 MetaTrader 類別中的非同步實例方法訪問,保留其原始名稱。這種設計確保了熟悉原始庫的用戶可以無縫集成,同時利用非同步程式設計的優勢。
MetaTrader 類別設計為非同步上下文管理器,簡化了 MetaTrader 終端的管理。進入上下文後,它會自動初始化終端並執行登入操作。退出時,即使發生錯誤,它也能確保資源的正確清理和斷開連接。這種結構提供了一種簡潔且有效率的生命週期管理方法,使其特別適合非同步工作流程。
這些函數的非非同步版本仍然可以訪問,但前面帶有下劃線 (_) 前綴,表示它們可以被視為私有方法。
MetaBackTester 是 MetaTrader 的子類,專門用於回測。它使用 BackTestEngine 實例,可以在初始化期間提供該實例,也可以從配置中檢索該實例。當 config.mode
設定為「backtest」時,此類會自動取代依賴終端連接的應用程式中的 MetaTrader,從而確保回測功能的無縫整合。
Base
和_Base
類別是構成框架中其他類別的基礎組件,提供基本實用程序,例如資料驗證、序列化以及根據系統是處於即時交易還是回測模式,無縫存取MetaTrader 或MetaBackTester實例。雖然這些類別很少直接使用,但它們透過作為更專業功能的支柱來確保整個系統的穩定性和可靠性。
Base 類別提供強大的資料處理功能,重點是驗證和序列化。在實例化期間,只能為在類別主體中明確註解或從父類別繼承的屬性賦值,並且這些值必須嚴格符合其定義的類型,從而確保結構化和類型安全的資料管理。
exclude
(set): 在存取屬性或產生物件的字典表示時要排除的屬性名稱集合。 include
(set): 要明確包含的屬性名稱集合。如果同時提供這兩個集合,則此集合會覆蓋 exclude
集合。 dict
: 一個屬性,它將所有屬性作為字典返回,應用在 exclude
和 include
集合中指定的過濾器。 set_attributes(**kwargs)
: 一個動態設定實例屬性的方法。它會驗證輸入並確保它們具有正確的類型。 get_dict(exclude: set = None, include: set = None)
: 一個將實例的屬性作為字典傳回的方法,允許指定 exclude
和 include
過濾器。如果同時提供這兩個參數,則 include
參數優先於 exclude
參數。 此類是 Base
的子類,具有專門用於連接到終端的其他屬性和功能。
config
: 表示設定實例。此屬性包含類別運行所需的所有必要的配置設定。 mt5
(MetaTrader | MetaBackTester): 提供 MetaTrader 或 MetaBackTester 實例,由 config
物件的 mode
屬性決定。實例的類型取決於系統是處於即時交易模式 (MetaTrader) 還是回測模式 (MetaBackTester)。 MetaTrader5 函式庫將其大量的常量組織成專門的枚舉,從而提高了開發人員的清晰度和功能性。這些枚舉表示各種交易操作、訂單類型、時間範圍等等,透過將相關的常數分組到直觀的類別下,簡化了它們的使用。每個枚舉都提供屬性,並在適用的情況下提供其他方法或屬性,從而實現轉換、反向或派生值等功能。這種組織減少了錯誤,提高了程式碼可讀性,並使常量更容易管理,尤其是在複雜的交易應用程式中。
例如 TradeAction
、OrderFilling
和 TimeFrame
等枚舉將常數封裝為整數值,同時提供 Python 風格的字串表示,以提高可用性。某些枚舉(如 TimeFrame
)包含高級方法,用於將秒轉換為預先定義的時間間隔或存取所有可能的值。透過有系統地組織這些常數,MetaTrader5 庫確保了更有效率且更易於開發人員使用的體驗,簡化了與交易作業和平台資料的互動。
models 模組提供了一組組織良好的資料處理類,這些類別建構在 MetaTrader5 庫的結構之上。所有類別都繼承自 Base 類,該類別添加了資料驗證、序列化和過濾等功能,以簡化其使用。這些類別表示各種與交易相關的實體,例如 OrderSendResult
、SymbolInfo
和 TradeRequest
,讓開發人員有效地與 MetaTrader5 的交易環境互動。
每個類別都封裝了與其對應的交易實體相關的特定屬性和特性,確保了健全且結構化的資料管理。例如,SymbolInfo
提供有關金融工具的詳細信息,而 TradeRequest
允許創建和提交交易操作。這種模組化設計增強了可讀性,簡化了複雜的交易工作流程,並確保了開發人員在其應用程式中利用 MetaTrader5 時的資料一致性和易用性。
TaskQueue 類別使用 asyncio.PriorityQueue
實例有效地管理機器人或回測器的後台任務,以進行並發執行。它在後台持續運行,允許與其他組件(例如使用它來記錄交易後執行資料的 Trader 類別)無縫整合。任務透過 add
方法新增至佇列中,但必須先將其封裝在 QueueItem
中,其中包含任務元數據,例如參數、優先順序和完成要求。
透過可設定的工作人員數量、逾時設定和任務優先級,TaskQueue 確保了強大的任務管理和錯誤處理。它支援有限或無限執行模式,並且可以根據優先順序在終止之前優雅地清理剩餘的任務。這種設計透過非同步卸載和管理後台操作來增強工作流程,確保複雜交易或測試環境的平穩和可靠的功能。
Account
類別是一個單例,用於管理經紀商帳戶詳細信息,確保在應用程式的生命週期中只存在一個實例。它繼承自 Base
和 _AccountInfo
,為存取特定於帳戶的資訊提供了結構化且用戶友好的介面。這種體系結構確保了一致性並防止了重複實例,從而將帳戶管理集中在應用程式中。
作為 AsyncContextManager,Account
類別透過自動化初始化和清理過程來簡化資源管理。進入其上下文時,它會初始化 MetaTrader 終端並登入指定的帳戶。退出時,它會確保正確關閉和清理資源。這種簡化的方法增強了資源處理的可靠性,使帳戶管理更直觀,並減少了交易作業過程中出現錯誤的可能性。
connected
(bool): 指示登入是否成功以及與終端機的連線是否處於作用中狀態。如果帳戶已連接,則傳回 True。 refresh()
: 透過從終端檢索最新的帳戶詳細資訊來更新帳戶實例,確保帳戶資料保持最新。 RAM
類別負責在交易活動期間管理風險評估和風險管理。它具有 risk_to_reward
、fixed_amount
、min_amount
、max_amount
和 risk
等屬性,允許交易者有效地定義和控制其風險敞口。這些屬性提供了設定每筆交易風險參數、最低和最高風險金額以及風險回報率的靈活性。
該類包括諸如get_amount
之類的方法,該方法根據可用保證金和風險百分比計算每筆交易的風險金額,以及check_losing_positions
和check_open_positions
,確保虧損或持倉數量保持在預先定義的限制內。透過整合這些功能,RAM 類別提供了一種全面的風險管理方法,增強了決策能力並促進了更安全的交易實踐。
risk
(float): 每筆交易的風險資本百分比,表示為整數(例如,1 表示 1%)。預設為 1。 risk_to_reward
(float): 風險報酬率,表示潛在風險與報酬之間的關係。預設為 2。 fixed_amount
(float): 每筆交易的固定風險金額,如果設置,則會覆蓋基於百分比的計算。 get_amount()
: 根據配置的屬性(例如風險、fixed_amount
、min_amount
和 max_amount
)計算並傳回每筆交易的風險金額。 RAM
類別最好在 Trader 類別中使用,可以在下單前使用它。
Candle
和 Candles
類別是用於管理從終端檢索的價格柱的自訂工具。 Candle
類別封裝單一價格柱的數據,確保每個實例中都存在必填屬性,例如開盤價、最高價、最低價和收盤價 (OHLC)。它支援 Python 協議,包括哈希、迭代和比較,同時提供 keys()
和 values()
等方法來管理屬性。此外,它還動態添加在實例化期間傳遞的屬性,允許靈活的自訂。
Candles
類別充當多個 Candle 物件的容器,這些物件按時間順序排列。它使用 pandas DataFrame
來儲存和管理其數據,從而與 pandas-ta 等工具無縫集成,以進行高級技術分析。透過支援各種 Python 協定(例如切片和迭代)並透過時間範圍等專用屬性擴展功能,此類作為開發交易策略的強大基礎。它的多功能性確保在複雜分析工作流程中經常使用。
time
(int): 蠟燭週期開始時間。 open
(float): 蠟燭的開盤價。 high
(float): 蠟燭週期內達到的最高價。 low
(float): 蠟燭週期內達到的最低價。 close
(float): 蠟燭的收盤價。 tick_volume
(float): 蠟燭週期內的 Tick 量。 real_volume
(float): 蠟燭週期內的實際交易量。 spread
(float): 蠟燭週期內的價差。 Index
(int): 一個自訂屬性,指示蠟燭在序列中的位置。 set_attributes(**kwargs)
: 從提供的關鍵字參數動態設定蠟燭實例的屬性。 is_bullish()
:如果蠟燭是看漲的(收盤價大於或等於開盤價),則返回 True,否則返回 False。 is_bearish()
:如果蠟燭是看跌的(收盤價小於開盤價),則傳回 True,否則回傳 False。 dict(exclude: set = None, include: set = None)
: 傳回蠟燭屬性的字典,可以選擇使用 exclude
或 include
集合過濾屬性。 Index
(Series[int]): 包含物件中所有蠟燭索引的 pandas Series。 time
(Series[int]): 包含物件中所有蠟燭時間的 pandas Series。 open
(Series[float]): 包含物件中所有蠟燭開盤價的 pandas Series。 high
(Series[float]): 包含物件中所有蠟燭最高價的 pandas Series。 low
(Series[float]): 包含物件中所有蠟燭最低價的 pandas Series。 close
(Series[float]): 包含物件中所有蠟燭收盤價的 pandas Series。 tick_volume
(Series[float]): 包含物件中所有蠟燭 Tick 量的 pandas Series。 real_volume
(Series[float]): 包含物件中所有蠟燭實際交易量的 pandas Series。 spread
(Series[float]): 包含物件中所有蠟燭價差的 pandas Series。 Candle
(Type[Candle]): 用來表示物件內單一蠟燭的類別。 timeframe
(TimeFrame): 蠟燭的時間範圍,根據其時間戳記計算得出。 data
(DataFrame): 包含物件中所有蠟燭基礎資料的 pandas DataFrame。 rename(inplace=True, **kwargs)
: 重新命名基礎 DataFrame 的欄位。 ta
: 透過 data
屬性直接對蠟燭執行技術分析,從而存取 pandas-ta 庫。 ta_lib
: 提供對 ta 庫的訪問,用於額外的技術分析,將其用於需要您將 Series 或 DataFrame 物件作為參數傳遞的函數。 columns
: 傳回基礎 DataFrame 的列名。Ticks
和 Tick
類別旨在管理來自交易終端的 Tick 數據,類似於 Candle
類別。 Tick
類別表示單一 Tick,其屬性包括 bid、ask、last price 和 volume,確保每個實例都封裝單一 Tick 事件的必要資料。它支援動態屬性管理並提供類似字典的訪問,使其能夠在不同的上下文中適應和易於操作。
Ticks
類別充當多個 Tick 物件的容器,將資料儲存在 pandas DataFrame
中,以便有效地進行操作和分析。它支援迭代、切片和各種數據操作,從而與 pandas-ta 等工具無縫集成,以進行技術分析。此類對於在交易系統中處理大量 Tick 資料至關重要,它為即時或歷史資料分析提供了強大的結構。
_Symbol_
類別提供了一個強大的結構來封裝金融工具的數據,支援啟動交易之前所需的計算和操作。作為 _Base
和 SymbolInfo
的子類,它整合了廣泛的屬性和方法來有效地處理金融工具。此類可以針對來自不同經紀商的不同工具進行定制,確保跨交易平台的適應性。
透過用於存取當前 Tick 資料、管理市場深度和執行貨幣轉換的實用程式方法,Symbol
類別簡化了複雜的交易任務。它提供了初始化符號、驗證交易量和檢索歷史匯率或 Tick 的功能,使其成為開發交易策略的重要組成部分。它的設計確保開發人員可以擴展和自訂其行為以滿足特定的交易要求。
Symbol
類別是一個功能豐富的類別。出於本文介紹的目的,我只觸及一些您最有可能使用的重要內容。 tick
和 account
是 Symbol
類別的唯一屬性,與在 SymbolInfo
父類別中定義的屬性不同。
tick
(Tick): 表示金融工具的當前價格 Tick,提供即時市場數據。 account
(Account): 與符號關聯的目前交易帳戶的實例。 __init__(*, name: str, **kwargs)
: 初始化符號實例。 name
屬性是必需的,並且必須與終端中經紀商指定的符號名稱相符。 initialize()
: 透過從終端檢索最新的價格 Tick 和詳細資訊來填充符號實例。如果成功,則 select
屬性設為 True,並且所有屬性都將填入伺服器資料。 convert_currency(*, amount: float, from_currency: str, to_currency: str)
: 將指定金額從一種貨幣轉換為另一種貨幣。 amount_in_quote_currency(*, amount: float)
: 如果帳戶貨幣與報價貨幣不同,則將金額從帳戶貨幣轉換為報價貨幣。此方法對於執行風險管理計算特別有用。 info_tick
: 檢索金融工具的當前價格 Tick。 symbol_select(enable: bool = True)
: 將符號加入 MarketWatch 視窗或從中移除。 check_volume(volume: float)
: 驗證指定的交易量是否在允許的限制內,並在必要時進行調整。 round_off_volume(volume: float, round_down: bool = False)
: 將交易量四捨五入到最近的有效步長。 compute_volume
: 計算交易的適當交易量。 copy_rates_from_pos(timeframe, start_position=0, count=500)
: 從特定索引開始取得柱線。 copy_rates_from(timeframe, date_from, count=500)
: 從指定的日期開始檢索歷史匯率(柱線)。 copy_ticks_from(date_from, count=100, flags=CopyTicks.ALL)
: 從指定的日期開始取得 Tick 資料。 Symbol
類別是一個多功能且功能豐富的工具,旨在管理金融工具,提供檢索和轉換資料的必要方法。雖然本介紹重點介紹了初始化、貨幣轉換和檢索最新 Tick 資料等關鍵功能,但在未來的討論中將探討其許多其他功能。這包括將其整合到演算法交易系統中,展示其對各種用例的適應性。
一個值得注意的貢獻是 ForexSymbol
類,它是 Symbol
類的專門擴展,專為外匯交易而設計。此子類別旨在處理貨幣對交易的獨特要求,進一步證明了 Symbol
類別在不同交易場景中的靈活性和自訂潛力。
Order
類別透過組合相關的屬性和方法來簡化交易訂單的管理,從而更容易檢查、驗證和發送訂單。作為 _Base
和 TradeRequest
的子類,它繼承了強大的功能,同時提供了額外的便利。透過為 action
、type_time
和 type_filling
等屬性設定合理的預設值,它最大限度地減少了實例化期間重複程式碼,確保了交易操作的效率和清晰度。
此類簡化了核心任務,例如檢索掛單、檢查資金充足性以及計算保證金、利潤和損失。 send()
和 check()
等方法的整合確保了啟動和驗證交易操作的無縫工作流程,而 calc_margin()
和 calc_profit()
等實用程式有助於交易前分析。它的設計使其成為高效實施演算法交易策略的重要工具。
__init__
: 使用必須是有效 TradeRequest
屬性的關鍵字參數來初始化訂單實例。 action
的預設值為 DEAL
,type_time
的預設值為 DAY
,type_filling
的預設值為 FOK
,儘管可以在實例化期間自訂它們。 check(**kwargs)
: 在下單前驗證訂單。提供的任何關鍵字參數都將更新請求物件。 send
: 將訂單傳送到終端以執行。 calc_margin
: 計算進行交易所需的保證金。 calc_profit
: 計算交易的潛在利潤。 calc_loss
: 計算交易的潛在損失。 request
: 此屬性將交易請求物件傳回為字典。 Trader
類別充當用於管理交易下單的實用程式豐富的抽象基底類別。它提供了創建和管理各種訂單類型的基礎方法,同時處理關鍵流程,例如交易的驗證、發送和記錄。此類需要在其子類別中實作 place_trade
方法,以確保靈活地適應特定的交易策略。
關鍵功能包括基於點或點數設定止損和止盈水平的方法、創建帶有或不帶有止損水平的訂單以及計算交易的適當數量的方法。該類別與已正確初始化的 Symbol 實例和可選的 RAM
實例整合以進行風險評估,從而實現無縫的交易管理。它還支援交易結果記錄,方便追蹤和分析已執行的交易。
modify_order(**kwargs)
: 使用提供的關鍵字參數修改訂單屬性。 modify_ram(**kwargs)
: 使用提供的關鍵字參數更新 RAM(風險評估和管理)實例屬性。 check_order
: 在下單前驗證訂單,確保它符合必要的條件。 send_order
: 將訂單發送給經紀商以執行。 record_trade(*, result: OrderSendResult, parameters: dict = None, name: str = "")
: 將交易詳細資料記錄到 CSV 或 JSON 檔案中,並將任務委託給 config.task_queue
實例。包括交易結果和策略參數(如果提供)。 contrib
包附帶兩個簡單的交易者,ScalpTrader
和 SimpleTrader
,其中 ScalpTrader
如下圖所示。
Session
和 Sessions
類別提供了一個強大的框架來管理和執行交易時間。 Session
表示一個在 UTC 中定義的時間段,具有開始時間和結束時間,可以指定為整數或 datetime.time
物件。這些會話可以觸發預先定義的操作,例如關閉所有交易或僅關閉盈利/虧損的部位,或使用者指定的自訂操作。這允許策略在特定時期內對交易活動進行精確控制。
Sessions
類別將多個 Session
實例分組到一個排序的集合中,從而可以輕鬆管理重疊或連續的交易時期。它充當非同步上下文管理器,持續監控當前時間以確定活動會話。如果沒有活動會話,則 Sessions
實例會暫停交易操作,直到下一個排程的會話開始,確保遵守指定的交易視窗。
透過整合這些類,交易策略可以輕鬆地結合基於時間的規則,從而提高其精度和可靠性。此功能在需要嚴格遵守交易時間(例如外匯或股票市場交易)或在需要操作與預定義時間間隔對齊的自動化系統中特別有用。
start
(datetime.time): 會話在 UTC 的開始時間。 end
(datetime.time): 會話在 UTC 的結束時間。 on_start
(str): 指定在會話開始時要執行的操作,例如 "close_all"
、"close_win"
、"close_loss"
或自訂操作。 on_end
(str): 指定會話結束時要執行的操作,類似 on_start
。 custom_start
(Callable): 會話開始時要執行的可選自訂函數。 custom_end
(Callable): 會話結束時要執行的可選自訂函數。 name
(str): 會話的名稱,如果未提供,則預設為開始時間和結束時間的組合。 in_session
: 檢查目前時間是否在會話內。 begin
: 在會話開始時執行 on_start
或 custom_start
指定的操作。 close
: 在會話結束時執行 on_end
或 custom_end
指定的操作。 duration
: 將會話的持續時間作為具有小時、分鐘和秒的 Duration 物件傳回。 close_all
: 關閉所有未平倉部位。 close_win
: 關閉所有獲利部位。 close_loss
: 關閉所有虧損部位。 action(action: str)
: 執行指定的操作,例如關閉頭寸或觸發自訂函數。 until
: 計算從目前時間到會話開始的時間(以秒為單位)。 sessions
(list[Session]): 依其開始時間排序的 Session
物件清單。 current_session
(Session | None): 目前活動會話(如果有)。 find(moment: datetime.time = None)
: 尋找並傳回包含指定時間的會話。如果未提供時間,則使用目前時間。 find_next(moment: datetime.time = None)
: 尋找並傳回指定時間後的下一個會話。如果未提供時間,則預設為目前時間。 check
: 監控目前會話。如果沒有活動會話,它將等待直到下一個會話開始。 config
: 與會話關聯的配置實例,確定模式(即時或回測)。 Strategy
類別是開發交易策略的基礎框架,可以與 Bot
和 Backtester
無縫整合。作為抽象基類,它配備了許多功能,但在衍生類別中需要實作 trade
方法。此方法充當策略的核心交易邏輯。 Strategy
類別充當非同步上下文管理器,並使用 run_strategy
方法執行策略,根據操作模式呼叫 live_strategy
或 backtest_strategy
方法。
透過 symbol
、sessions
和 parameters
等屬性,該類別確保可以自訂策略並將其調整為特定的金融工具和交易會話。協作多任務方法(例如 sleep
和 delay
)的整合確保策略在即時或回測環境中保持高效且與市場更新同步。這使得 Strategy
類別成為建立複雜交易系統的強大而靈活的工具。
name
(str): 策略的名稱。如果未明確提供,則預設為類別名稱。 symbol
(Symbol): 與策略關聯的金融工具。 parameters
(dict): 特定於策略的參數字典。 sessions
(Sessions): 策略處於活動狀態的交易會話。 mt5
(MetaTrader | MetaBackTester): 以模式為基礎(即時或回測)的 MetaTrader
或 MetaBackTester
實例。 config
: 策略的設定。 running
(bool): 指示策略目前是否正在運作。 backtest_controller
(BackTestController): 用於管理回測操作的控制器。 current_session
(Session): 目前活動的交易會話。 __init__(symbol: Symbol, params: dict = None, sessions: Sessions = None, name: str = "")
: 使用給定的符號、參數和會話初始化策略。 以上是人工智慧OMQL的詳細內容。更多資訊請關注PHP中文網其他相關文章!