কমোডিটি ফিউচার ইন্টারটেম্পোরাল হেজিং স্ট্র্যাটেজি এর পাইথন সংস্করণ

লেখক:ভাল, তৈরিঃ 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শ্রেণী সর্বশেষ BAR টাইমস্ট্যাম্প রেকর্ড করতে. অঙ্কন জন্য, আমরা Drawing Class লাইব্রেরি ব্যবহার, সরাসরি অঙ্কন ইন্টারফেস কল, আপনি সহজেই চার্ট আঁকা করতে পারেন.

# 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


আরো