जावास्क्रिप्ट संस्करण से पोर्ट किया गयाकमोडिटी फ्यूचर्स इंटरटेम्पोरल हेजिंग-कोड कार्यान्वयन की सैकड़ों पंक्तियाँ, यह रणनीति एक सरल शिक्षण रणनीति है, जिसका उद्देश्य पायथन भाषा में कमोडिटी वायदा रणनीतियों का डिजाइन दिखाना है। मुख्य रूप से रणनीति लेखन और संदर्भ डिजाइन विचारों को सीखने के लिए उपयोग किया जाता है।
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
नवीनतम बार टाइमस्टैम्प रिकॉर्ड करने के लिए वर्ग. ड्राइंग के लिए, हम
# 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