জাভাস্ক্রিপ্ট সংস্করণ থেকে পোর্ট করা হয়েছেকমোডিটি ফিউচার ইন্টারটাইমোরাল হেজিং-কোড বাস্তবায়নের শত শত লাইন, এই কৌশলটি একটি সহজ শিক্ষামূলক কৌশল, যা পাইথন ভাষায় পণ্যের ফিউচার কৌশলগুলির নকশা দেখানোর উদ্দেশ্যে। মূলত কৌশল লেখার এবং রেফারেন্স ডিজাইনের ধারণা শেখার জন্য ব্যবহৃত হয়।
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 টাইমস্ট্যাম্প রেকর্ড করতে. অঙ্কন জন্য, আমরা
# 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")
ব্যাকটেস্টিং এফেক্টঃ
পরবর্তী, আমরা ইন্টারেক্টিভ ফাংশন যোগ করা হবে, যাতে কৌশল পরিবর্তন করতে পারেনHedgeSpread
এবংCoverSpread
আপনি একটি ক্লিক সঙ্গে অবস্থান বন্ধ করার জন্য একটি বোতাম প্রয়োজন. আমরা কৌশল সম্পাদনা পৃষ্ঠায় এই নিয়ন্ত্রণ যোগ করুন.
তারপর কৌশলটির মূল লুপে,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