import sys import plugin import general class PulseWire: def __init__(self): ... def onRaw(self, data: bytes): ... def send_raw(self, data: bytes): sys.stdout.buffer.write(len(data).to_bytes(8, "little")) sys.stdout.buffer.write(data) sys.stdout.flush() def start(self): while True: len_buf = sys.stdin.buffer.read(8) sys.stderr.write(str(len_buf)) if len(len_buf) == 0: continue length = int.from_bytes(len_buf, "little") if length == 0: continue buffer = sys.stdin.buffer.read(length) if len(buffer) != length: raise EOFError("Unexpected EOF while reading payload") self.onRaw(buffer) class Strategy(PulseWire): def onInitialize(self, msg: plugin.StrategyEngineMessage.Initialize): ... def onWatchList(self, msg: plugin.StrategyEngineMessage.WatchList): ... def onCommand(self, msg: plugin.StrategyEngineMessage.Command): ... def onCandleUpdate(self, msg: plugin.StrategyEngineMessage.CandleUpdate): ... def onCandlestick(self, msg: plugin.StrategyEngineMessage.Candlestick): ... def on(self, req: plugin.StrategyEngineMessageType): ... def send(self, req: plugin.StrategyMessageType): self.send_raw(req.to_com()) def log(self, log: general.EventLog): msg = plugin.StrategyMessage.Log() msg.log = log self.send(msg) def getWatchList(self): self.send(plugin.StrategyMessage.GetWatchList()) def getCandleStick(self, symbol: str, interval: general.CandleInterval, count: general.u32): msg = plugin.StrategyMessage.RequestCandlestick() msg.symbol = symbol msg.interval = interval msg.count = count self.send(msg) def unsubscribeAll(self): self.send(plugin.StrategyMessage.UnsubscribeAll()) def signal(self, signal: plugin.StrategySignal): msg = plugin.StrategyMessage.Signal() msg.signal = signal self.send(msg) def onRaw(self, data: bytes): result: tuple[plugin.StrategyEngineMessageType, int] = plugin.StrategyEngineMessage.from_com(data=data) req, _ = result self.on(req) handler = getattr( self, f"on{req.__class__.__name__}", None ) if handler: handler(req) class Risk(PulseWire): def onInitialize(self, msg: plugin.RiskEngineMessage.Initialize): ... def onWatchList(self, msg: plugin.RiskEngineMessage.WatchList): ... def onCommand(self, msg: plugin.RiskEngineMessage.Command): ... def onSignal(self, msg: plugin.RiskEngineMessage.Signal): ... def on(self, req: plugin.RiskEngineMessageType): ... def send(self, req: plugin.RiskMessageType): self.send_raw(req.to_com()) def log(self, log: general.EventLog): msg = plugin.RiskMessage.Log() msg.log = log self.send(msg) def getWatchList(self): self.send(plugin.RiskMessage.GetWatchList()) def approveSignal(self, signal: general.Signal): msg = plugin.RiskMessage.Approve() msg.signal = signal self.send(msg) def rejectSignal(self, reason: str): msg = plugin.RiskMessage.Reject() msg.reason = reason self.send(msg) def onRaw(self, data: bytes): result: tuple[plugin.RiskEngineMessageType, int] = plugin.RiskEngineMessage.from_com(data=data) req, _ = result self.on(req) handler = getattr( self, f"on{req.__class__.__name__}", None ) if handler: handler(req) class Bro(Strategy): def __init__(self): super().__init__() def onInitialize(self, msg: plugin.StrategyEngineMessage.Initialize): self.log(general.EventLog.info("bro", "Hello, World")) return super().onInitialize(msg) Bro().start()