कमोडिटी फ्यूचर्स की अंतराल-समय की हेजिंग रणनीति का पायथन संस्करण

लेखक:अच्छाई, बनाया गयाः 2020-06-12 15:57:51, अद्यतन किया गयाः 2023-11-01 20:33:32

img

जावास्क्रिप्ट संस्करण से पोर्ट किया गयाकमोडिटी फ्यूचर्स इंटरटेम्पोरल हेजिंग-कोड कार्यान्वयन की सैकड़ों पंक्तियाँ, यह रणनीति एक सरल शिक्षण रणनीति है, जिसका उद्देश्य पायथन भाषा में कमोडिटी वायदा रणनीतियों का डिजाइन दिखाना है। मुख्य रूप से रणनीति लेखन और संदर्भ डिजाइन विचारों को सीखने के लिए उपयोग किया जाता है।

class Hedge:
    'Hedging control class'
    def __init__(self, q, e, initAccount, symbolA, symbolB, hedgeSpread, coverSpread):
        self.q = q 
        self.initAccount = initAccount
        self.status = 0
        self.symbolA = symbolA
        self.symbolB = symbolB
        self.e = e
        self.isBusy = False 
        self.hedgeSpread = hedgeSpread
        self.coverSpread = coverSpread
        self.opAmount = OpAmount 
        
    def poll(self):
        if (self.isBusy or not exchange.IO("status")) or not ext.IsTrading(self.symbolA):
            Sleep(1000)
            return 

        insDetailA = exchange.SetContractType(self.symbolA)
        if not insDetailA:
            return 

        tickerA = exchange.GetTicker()
        if not tickerA:
            return 

        insDetailB = exchange.SetContractType(self.symbolB)
        if not insDetailB:
            return 

        tickerB = exchange.GetTicker()
        if not tickerB:
            return 

        LogStatus(_D(), "A sell B buy", _N(tickerA["Buy"] - tickerB["Sell"]), "A buy B sell", _N(tickerA["Sell"] - tickerB["Buy"]))
        action = 0

        if self.status == 0:
            if (tickerA["Buy"] - tickerB["Sell"]) > self.hedgeSpread:
                Log("open position A sell B buy", tickerA["Buy"], tickerB["Sell"], "#FF0000")
                action = 1
            elif (tickerB["Buy"] - tickerA["Sell"]) > self.hedgeSpread:
                Log("open position B sell A buy", tickerB["Buy"], tickerA["Sell"], "#FF0000")
                action = 2
        elif self.status == 1 and (tickerA["Sell"] - tickerB["Buy"]) <= self.coverSpread:
            Log("close position A buy B sell", tickerA["Sell"], tickerB["Buy"], "#FF0000")
            action = 2
        elif self.status == 2 and (tickerB["Sell"] - tickerA["Buy"]) <= self.coverSpread:
            Log("close position B buy A sell", tickerB["Sell"] - tickerA["Buy"], "#FF0000")
            action = 1 

        if action == 0:
            return 
        
        self.isBusy = True
        tasks = []
        if action == 1:
            tasks.append([self.symbolA, "sell" if self.status == 0 else "closebuy"])
            tasks.append([self.symbolB, "buy" if self.status == 0 else "closesell"])
        elif action == 2:
            tasks.append([self.symbolA, "buy" if self.status == 0 else "closesell"])
            tasks.append([self.symbolB, "sell" if self.status == 0 else "closebuy"])

        def callBack(task, ret):
            def callBack(task, ret):
                self.isBusy = False
                if task["action"] == "sell":
                    self.status = 2
                elif task["action"] == "buy":
                    self.status = 1
                else:
                    self.status = 0
                    account = _C(exchange.GetAccount)
                    LogProfit(account["Balance"] - self.initAccount["Balance"], account)
            self.q.pushTask(self.e, tasks[1][0], tasks[1][1], self.opAmount, callBack)

        self.q.pushTask(self.e, tasks[0][0], tasks[0][1], self.opAmount, callBack)


def main():
    SetErrorFilter("ready|login|timeout")
    Log("Connecting to the trading server...")
    while not exchange.IO("status"):
        Sleep(1000)

    Log("Successfully connected to the trading server")
    initAccount = _C(exchange.GetAccount)
    Log(initAccount)
    n = 0 

    def callBack(task, ret):
        Log(task["desc"], "success" if ret else "fail")

    q = ext.NewTaskQueue(callBack)

    if CoverAll:
        Log("Start closing all remaining positions...")
        ext.NewPositionManager().CoverAll()
        Log("Operation complete")

    t = Hedge(q, exchange, initAccount, SA, SB, HedgeSpread, CoverSpread)
    while True:
        q.poll()
        t.poll()

बस कोड प्रत्यारोपण, यह थोड़ा बहुत सरल लगता है, हम कुछ परिवर्तन करने के लिए जारी है, इस व्यापार रणनीति के लिए चार्ट जोड़ने.

निम्नलिखित कोड उस स्थान से पहले जोड़ा जाए जहांLogStatusफ़ंक्शन को वास्तविक समय में मूल्य अंतर को के-लाइन सांख्यिकी में बदलने के लिए बुलाया जाता है।self.preBarTimeके द्वारा जोड़ा गया हैHedgeनवीनतम बार टाइमस्टैम्प रिकॉर्ड करने के लिए वर्ग. ड्राइंग के लिए, हम Drawing क्लास पुस्तकालय का उपयोग, सीधे ड्राइंग इंटरफ़ेस कॉल, आप आसानी से चार्ट ड्राइंग कर सकते हैं.

# Calculate the spread K line
        r = exchange.GetRecords()
        if not r:
            return 
        diff = tickerB["Last"] - tickerA["Last"]
        if r[-1]["Time"] != self.preBarTime:
            # Update
            self.records.append({"Time": r[-1]["Time"], "High": diff, "Low": diff, "Open": diff, "Close": diff, "Volume": 0})
            self.preBarTime = r[-1]["Time"]
        if diff > self.records[-1]["High"]:
            self.records[-1]["High"] = diff
        if diff < self.records[-1]["Low"]:
            self.records[-1]["Low"] = diff
        self.records[-1]["Close"] = diff
        ext.PlotRecords(self.records, "diff:B-A")
        ext.PlotHLine(self.hedgeSpread if diff > 0 else -self.hedgeSpread, "hedgeSpread")
        ext.PlotHLine(self.coverSpread if diff > 0 else -self.coverSpread, "coverSpread")

बैकटेस्टिंग प्रभाव:

img

इसके बाद, हम इंटरैक्टिव फ़ंक्शन जोड़ेंगे, ताकि रणनीति को संशोधित किया जा सकेHedgeSpreadऔरCoverSpreadआप भी एक बटन की जरूरत है एक क्लिक के साथ स्थिति को बंद करने के लिए. हम रणनीति संपादन पृष्ठ पर इन नियंत्रणों को जोड़ते हैं.

img

फिर रणनीति के मुख्य लूप में,q.poll(), t.poll()कॉल, इंटरैक्टिव नियंत्रण कोड जोड़ें।

while True:
        q.poll()
        t.poll()
        # The following interactive control code
        cmd = GetCommand()
        if cmd:
            arr = cmd.split(":")
            if arr[0] == "AllCover":
                p.CoverAll()
            elif arr[0] == "SetHedgeSpread":
                t.SetHedgeSpread(float(arr[1]))
            elif arr[0] == "SetCoverSpread":
                t.SetCoverSpread(float(arr[1]))

आप यहाँ पूरी ट्रेडिंग रणनीति की प्रतिलिपि बना सकते हैंःhttps://www.fmz.com/strategy/211504


अधिक