這是我在這里的第一個問題。問題主要是關于 Python,但也有一點關于撰寫加密交易機器人。我需要在我的機器人中計算一些關于交易的指標,如布林帶、RSI 等。
指標是根據交易中的燭臺資料計算得出的。燭臺資料在其時間段內更新。例如,如果在 5 分鐘內使用燭臺資料,我需要每 5 分鐘計算一次指標(在燭臺更新后),或者如果我在 1 小時內使用燭臺資料,我需要每 1 小時計算一次指標。
所以,認為我有兩個課程。一個以“TradeControl”命名,它有一個以“candlestick_data”命名的屬性。第二類以“CandlestickUpdater”命名。我想從“CandlestickUpdater”類管理“TradeControl”類中“candlestick_data”的更新。
我的問題是關于 python 中的并行行程(或執行緒)。我不知道如何正確地做到這一點。有沒有人在這里給我一些建議或示例代碼。而且我還想知道我是否應該使用類似互斥鎖的結構來防范競爭條件等條件。我在代碼中嘗試做的如下所示。另外,如果您有不同的建議,我想考慮一下。
class TradeControl():
def __init__(self):
self.candlestick_data = 0
def update_candlestick(self):
"""Candlesticks data will be requested from exchange and updated in here"""
pass
def run_trading_bot(self):
while True:
"""Main trading algorithm is running and using self.candlestick_data in here"""
pass
pass
pass
class CandlestickUpdater():
def __init__(self, controller: TradeControl):
self.controller = controller
def run_candlestick_updater(self):
while True:
"""Candlesticks data updates will be checked in here"""
if need_to_update:
"""TradeControl will be informed in here"""
self.controller.update_candlestick()
pass
pass
pass
pass
感謝您的回復,
uj5u.com熱心網友回復:
從你的描述中看不太清楚CandlestickUpdater是干什么用的。看起來它的目的是通知TradeControlupdate 的時間到了candlestick_data,而更新邏輯本身就在TradeControl.update_candlestick方法中。所以基本上CandlestickUpdater是一個計時器。
調度事件有不同的 python 庫。以調度為例。它似乎可以用于TradeControl.update_candlestick具有所需時間段的調度方法。
如果您仍然想CandlestickUpdater上課,我認為它實際上可以按照您的代碼中撰寫的那樣作業。您可以通過這種方式在執行緒中使用這些類:
from threading import Thread
trade_control = TradeControl()
candlestick_updater = CandlestickUpdater(controller=trace_control)
Thread(target=trade_control.update_candlestick).start()
Thread(target=candlestick_updater.run_candlestick_updater).start()
說到比賽條件。好吧,可能是這種情況,但這取決于您對update_candlestickand的實作run_trading_bot。最好在更新時創建TradeControl.lock: threading.Lock屬性并使用它candlestick_data:https ://docs.python.org/3/library/threading.html#lock-objects 。
還有另一種無需直接方法呼叫的執行緒間通信方式。看看閃光燈。這是一個很好的庫來實作事件驅動的場景。您只需要創建一個“信號”物件(在TradeControl和CandlestickUpdater類之外)并將TradeControl.update_candlestick方法連接到它。然后你只需在“CandlestickUpdater.run_candlestick_updater”中呼叫“signal.send”方法,連接的函式就會被執行。將實體方法連接到信號可能有點棘手。但是有一些解決方案。CandlestickUpdater.run_candlestick_updater如果可能的話,最簡單的方法是制作靜態的。
uj5u.com熱心網友回復:
問:
“......應該(我)使用類似互斥鎖的結構來防范競爭條件“......?
答:
鑒于事實,Python 解釋器是如何作業的(正如 Guido von Rossum 自己所表達的那樣),通過它的所有執行緒分發“作業許可”約 100 [ms] 時間量子,通過中央G -lobal I -ninterpreter L -lock ( GIL-lock ),在 Python 中沒有要滿足的競爭條件(除非軟體創建的活鎖或一些確實人為生成的相互阻塞的模糊不清)。
換句話說,所有 Python 解釋器執行緒主要是無沖突的,因為 GIL-lock[SERIAL]將任何和所有執行緒重新設定為 one-and-only-ONE-works-(if-GIL-lock-owner)-ALL-others -等待...
問:
“我的問題是關于 python 中的并行行程(或執行緒)。”
答:
在 Python 中,執行緒甚至從來都不是“公正”[CONCURRENT]的,所以根本就不會形成真正[PARALLEL]的流程編排形式。流程擺脫了 GIL 鎖重新[SERIAL]化的暴政,然而,在向新范式轉變程序中需要付出許多附加成本和障礙。分布式處理
如果基于行程的[CONCURRENT]處理
恰好進入現場:
如果進入基于流程的“公正”——[CONCURRENT]處理(使用joblib.Parallel(...)delayed(...),multiprocessing或其他模塊),你從盡可能多的獨立開始(每個都在內部仍然 GIL 鎖驅動,但彼此獨立——相互獨立的不協調自由GIL-locks 的保留)行程,原始 Python 解釋器的自上而下的副本(所有 Win,一些 MacOS)(是的,由于 RAM-footprint RAM-I/O 它是[SPACE]- 并且[TIME]-domain 昂貴)。
在這里,您不能享受呼叫本地行程類方法或類似機制來在行程中傳播狀態更改,因為您的“接收者”可能駐留在原始 Python 解釋器行程中,該行程主要具有本地行程不能的獨立地址空間(并且永遠不應該)被允許觸摸,更少的改變它的一點點。
然而,我們可以在這里使用用于分布式計算信令和/或訊息傳遞的工具,例如零MQ,pyzmq,納米粒,平等等,滿足您的需求,其中一些擁有龐大的 Quant/Fintech 安裝基礎和許多語言系結/包裝器(我們在 python AI/ML-Ensemble-of-Predictors 中使用 ZeroMQ 自 v2.11 ,MQL4 用于驅動 FX -Broker XTO 和 MQL4 回測模擬農場、python 非阻塞分布式記錄器、python 遠程 CLI 代理、用于多系統集成膠合邏輯的橫向擴展 C 語言工具、信號供應服務、訂閱者管理……宏-系統健康監測和報警系統)
The above sketched distributed-computing macro-system spans several platforms and has no problems to process sub-millisecond cadence of FX-market stream of QUOTE-events, handle tens of thousands managed-trade positions ( driving live FX-market XTO-modifications ) and maintain all QuantFX-technical indicator re-calculations on the fly.
Building one's own event-responsive MVC-framework -OR-
re-use a robust & stable & feature-rich one :
Having said the above, you may re-use another concept, when living in a comfort of plenty of time when going into just an H1-timeframe operations.
have o look on Tkinter.mainloop()-examples, with tools for both event-driven & timed-callbacks, that will permit you anything within the ceiling of your imagination, including GUI and infinitely many modes of Man-Machine-Interaction modes and gadgets.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442893.html
上一篇:授權錯誤錯誤400:C#上的redirect_uri_mismatch
下一篇:取消未來與停止執行緒
