मैं अक्सर आविष्कारक मंच पर घूमता रहता हूँ और हमेशा कुछ न कुछ नया खोजता रहता हूँ। आज मुझे एक 21 साल का लड़का मिला।रुझान रणनीतिमैं मूल लेखक की उत्तम और उत्तम कोड संरचना की प्रशंसा करता हूँ, और इसमें उच्च लचीलापन है। मूल रणनीति JS संस्करण है, जिसे पायथन मित्रों की सुविधा के लिए फिर से लिखा गया है।
सच कहूँ तो, कई शुरुआती लोग क्वांटिटेटिव ट्रेडिंग में कदम रखते समय कई तरह के चक्कर लगाते हैं। उन्हें अक्सर असफल ऑर्डर, खराब जोखिम प्रबंधन से होने वाले नुकसान और रणनीति को दोबारा शुरू करने पर डेटा हानि जैसी समस्याओं का सामना करना पड़ता है। बाद में, मुझे धीरे-धीरे एक अच्छे फ्रेमवर्क के महत्व का एहसास हुआ, जो हमें कई नुकसानों से बचने में मदद कर सकता है। यह ट्रेंड स्ट्रैटेजी फ्रेमवर्क एक बेहद मूल्यवान उपकरण है। यह सिर्फ़ एक साधारण ट्रेडिंग रणनीति से कहीं बढ़कर है; यह एक टूलबॉक्स की तरह है, जो आपको ऑर्डर प्लेसमेंट, स्टॉप-लॉस ऑर्डर और डेटा प्रबंधन जैसे बुनियादी लेकिन ज़रूरी काम प्रदान करता है। आपको बस “कब खरीदें” और “कब बेचें” जैसे मुख्य सवालों पर ध्यान केंद्रित करने की ज़रूरत है। इसके अलावा, यह फ्रेमवर्क बहुत ही खुला-समाप्त है, जिससे आप आसानी से EMA को MACD, RSI, या अपनी पसंद के किसी भी अन्य संकेतक से बदल सकते हैं। क्या आप रुझानों का अनुसरण करना चाहते हैं? कोई बात नहीं। क्या आप मीन रिवर्सन आज़माना चाहते हैं? क्या आप कई संकेतकों को मिलाना भी चाहते हैं? बिल्कुल। यह लचीलापन अविश्वसनीय रूप से उपयोगी है; आप अलग-अलग विचारों के साथ प्रयोग करने के लिए एक ही कोड को संशोधित कर सकते हैं।
मैं आज यह फ्रेमवर्क साझा कर रहा हूँ, उम्मीद है कि यह मात्रात्मक निवेश की खोज करने वालों के लिए मददगार होगा। नीचे इस फ्रेमवर्क के प्रत्येक घटक का विस्तृत परिचय दिया गया है, जो मुझे विश्वास है कि आपको उपयोगी लगेगा।
मल्टी-कमोडिटी ट्रेडिंग फ्रेमवर्क में इस्तेमाल होने वाले कई स्वतंत्र कार्यों की तुलना में, यह फ्रेमवर्क एक क्लास फ़ॉर्मेट का उपयोग करके रणनीति के विभिन्न भागों को व्यवस्थित और प्रबंधित करने का प्रयास करता है। यह ऑब्जेक्ट-ओरिएंटेड डिज़ाइन न केवल कोड की रखरखाव क्षमता और मापनीयता में सुधार करता है, बल्कि रणनीति के घटकों को अधिक मॉड्यूलर भी बनाता है, जिससे बाद में समायोजन और अनुकूलन आसान हो जाते हैं। इस फ्रेमवर्क में मुख्य रूप से निम्नलिखित खंड शामिल हैं, जिनमें से प्रत्येक का अपना विशिष्ट कार्य है, जो रणनीति के लचीलेपन और व्यावहारिकता को सुनिश्चित करता है।
init फ़ंक्शन
__init__यह फ़ंक्शन रणनीति वर्ग की आरंभीकरण विधि है, जो रणनीति के मूल विन्यास को निर्धारित करने, चरों को आरंभीकृत करने और बाज़ार की जानकारी प्राप्त करने के लिए ज़िम्मेदार है। यह फ़ंक्शन यह सुनिश्चित करता है कि रणनीति चलाने से पहले आवश्यक पैरामीटर कॉन्फ़िगर किए जाएँ, ताकि बाद के व्यापारिक संचालन सुचारू रूप से निष्पादित हो सकें।initDatas फ़ंक्शन
saveStrategyRunTime फ़ंक्शन
setStrategyRunTime फ़ंक्शन
_Gफ़ंक्शन पास किए गए टाइमस्टैम्प को स्थानीय रूप से सहेजता है।getDaysFromTimeStamp फ़ंक्शन
saveUserDatasLocal फ़ंक्शन
_Gयह फ़ंक्शन डेटा को स्थानीय रूप से सहेजता है।readUserDataLocal फ़ंक्शन
clearUserDataLocal फ़ंक्शन
_Gफ़ंक्शन स्थानीय डेटा साफ़ करता है.runCmd फ़ंक्शन
ऑर्डरडायरेक्टली फ़ंक्शन
openLong फ़ंक्शन
orderDirectlyयह फ़ंक्शन एक खरीद ऑपरेशन निष्पादित करता है।openShort फ़ंक्शन
orderDirectlyयह फ़ंक्शन विक्रय ऑपरेशन निष्पादित करता है।कवरलॉन्ग फ़ंक्शन
orderDirectlyयह फ़ंक्शन विक्रय ऑपरेशन निष्पादित करता है।कवरशॉर्ट फ़ंक्शन
orderDirectlyयह फ़ंक्शन एक खरीद ऑपरेशन निष्पादित करता है।getRealOrderSize फ़ंक्शन
getSinglePositionMargin फ़ंक्शन
getSinglePositionProfit फ़ंक्शन
calculateForcedPrice फ़ंक्शन
getMaxOrderSize फ़ंक्शन
getAccountAsset फ़ंक्शन
calculateProfit फ़ंक्शन
isEnoughAssetToOrder फ़ंक्शन
runInKLinePeriod फ़ंक्शन
Trueअन्यथा वापस लौटेंFalse。ट्रेंड जजमेंट फ़ंक्शन (कोर ट्रेंड जजमेंट मॉड्यूल)
स्टॉपलॉस फ़ंक्शन
takeProfit फ़ंक्शन
ट्रैकिंगटेकप्रॉफिट फ़ंक्शन
ऑर्डर फ़ंक्शन
ट्रेंडस्ट्रेटेजी फ़ंक्शन
प्रिंटलॉगस्टेटस फ़ंक्शन
LogStatusयह फ़ंक्शन तालिका डेटा को स्टेटस बार पर आउटपुट करता है।मुख्य समारोह
यह ढांचा न केवल डिजिटल मुद्रा बाजार पर लागू है, बल्कि इसका उपयोग भी किया जा सकता हैtrendJudgmentविभिन्न व्यापारिक रणनीतियों की आवश्यकताओं के अनुकूल होने के लिए इस ढाँचे का विस्तार किया जा सकता है। इसके अलावा, इस ढाँचे को विशेष रूप से स्पॉट मार्केट या बहु-विविधता अनुबंधों के लिए भी उच्च लचीलेपन और मापनीयता के साथ संशोधित किया जा सकता है।
एक व्यापक और अत्यधिक लचीली स्वचालित ट्रेडिंग प्रणाली के रूप में, यह ढाँचा क्रिप्टोकरेंसी बाज़ार में ट्रेंड ट्रेडिंग के लिए उपयुक्त है। निरंतर अनुकूलन और विस्तार के माध्यम से, यह भविष्य में क्रिप्टोकरेंसी व्यापारियों के लिए एक मूल्यवान उपकरण बनने की उम्मीद है, जिससे उन्हें अपनी मात्रात्मक रणनीतियों को बेहतर ढंग से विकसित करने में मदद मिलेगी। “क्रिप्टोकरेंसी ट्रेंड स्ट्रैटेजी ट्रेडिंग ढाँचा” एक व्यापक संरचना का दावा करता है। कोड में अपेक्षाकृत बड़ा होने के बावजूद, यह वास्तविक दुनिया के व्यापारिक दृष्टिकोण से ट्रेंड ट्रेडिंग के लिए आवश्यक मुख्य कार्यात्मक मॉड्यूल को अनिवार्य रूप से कवर करता है। इसलिए, यह ढाँचा ट्रेडिंग रणनीतियों को सीखने और व्यावहारिक अनुप्रयोग, दोनों के लिए महत्वपूर्ण संदर्भ मूल्य और व्यावहारिक महत्व रखता है। इसकी व्यापक कार्यक्षमता और लचीलापन इसे विविध बाजार परिवेशों के अनुकूल होने और मजबूत समर्थन प्रदान करने में सक्षम बनाता है।
इन्वेंटर प्लेटफ़ॉर्म मात्रात्मक ट्रेडिंग ज्ञान और रणनीतियों का एक भंडार है, जिनमें से प्रत्येक अपने डेवलपर्स के ज्ञान और अनुभव का प्रतीक है। हम सभी का यहाँ मूल्यवान ट्रेडिंग रणनीतियों और तकनीकों को जानने के लिए स्वागत करते हैं। हमारे सभी नवोन्मेषी और साझा करने वाले उपयोगकर्ताओं का धन्यवाद। आपके योगदान के कारण ही यह प्लेटफ़ॉर्म मात्रात्मक ट्रेडिंग में सीखने और आदान-प्रदान के लिए एक महत्वपूर्ण स्थान बन गया है, जिससे सभी को अपने कौशल और विशेषज्ञता को बेहतर बनाने में मदद मिलती है।
”`python “‘backtest start: 2024-11-26 00:00:00 end: 2024-12-03 00:00:00 period: 1d basePeriod: 1d exchanges: [{“eid”:“Futures_Binance”,“currency”:“BTC_USDT”}] “’
import json, talib import numpy as np
class TrendStrategy: def init(self): # 基本设置 self._Currency = TradeCurrency self._Interval = Interval self._UseQuarter = UseQuarter self._UseContract = TradeCurrency + (‘.swap’ if self._UseQuarter else ‘.quarter’) self._OnlyTrendJudgment = OnlyTrendJudgment self._EnableMessageSend = EnableMessageSend # 趋势判断 self._RunInKLinePeriod = RunInKLinePeriod self._KLinePeriod = KLinePeriod self._EmaLength = EmaLength self._EmaCoefficient = EmaCoefficient self._UseStddev = UseStddev self._UseRecordsMiddleValue = UseRecordsMiddleValue self._StddevLength = StddevLength self._StddevDeviations = StddevDeviations # 下单设置 self._MarginLevel = MarginLevel self._OrderSize = OrderSize self._OrderByMargin = OrderByMargin self._OrderMarginPercent = OrderMarginPercent self._PricePrecision = None self._AmountPrecision = None self._OneSizeInCurrentCoin = None self._QuarterOneSizeValue = None # 止盈止损 self._UseStopLoss = UseStopLoss self._StopLossPercent = StopLossPercent self._UseTakeProfit = UseTakeProfit self._TakeProfitPercent = TakeProfitPercent self._UseTrackingTakeProfit = UseTrackingTakeProfit self._UsePositionRetracement = UsePositionRetracement self._TakeProfitTriggerPercent = TakeProfitTriggerPercent self._CallBakcPercent = CallBakcPercent
# 策略变量
self._LastBarTime = 0
self._TrendWhenTakeProfitOrStopLoss = 0
self._HadStopLoss = False
self._TriggeredTakeProfit = False
self._PeakPriceInPosition = 0
self._HadTakeProfit = False
self._PriceCrossEMAStatus = 0
# 统计变量
self._InitAsset = 0
self._ProfitLocal = 0
self._TakeProfitCount = 0
self._TradeCount = 0
self.StrategyRunTimeStampString = "strategy_run_time"
self._StrategyDatas = {"start_run_timestamp": 0, "others": ""}
self._UserDatas = None
# 相对固定参数
self._MaintenanceMarginRate = 0.004
self._TakerFee = 0.0005
self._IsUsdtStandard = False
# 获取合约信息
ticker = _C(exchange.GetTicker, self._UseContract)
marketInfo = exchange.GetMarkets()[self._UseContract]
Log('获取市场信息:', marketInfo)
self._PricePrecision = marketInfo['PricePrecision']
self._AmountPrecision = marketInfo['AmountPrecision']
self._OneSizeInCurrentCoin = marketInfo['CtVal']
self._QuarterOneSizeValue = marketInfo['CtVal']
exchange.SetCurrency(self._Currency)
exchange.SetMarginLevel(self._UseContract, self._MarginLevel)
exchange.SetPrecision(self._PricePrecision, self._AmountPrecision)
# 初始化数据
def initDatas(self):
self.saveStrategyRunTime()
self.readUserDataLocal()
self._InitAsset = self._UserDatas["init_assets"]
self._ProfitLocal = self._UserDatas["profit_local"]
self._TakeProfitCount = self._UserDatas["take_profit_count"]
self._TradeCount = self._UserDatas["trade_count"]
if self._OrderByMargin:
self.getRealOrderSize(-1, self._OrderSize)
Log("已经重新计算下单张数:", self._OrderSize)
if self._UseTakeProfit and self._UseTrackingTakeProfit:
raise Exception("止盈和回调止盈不能同时使用!")
# 设置合约
def setContract(self):
self._IsUsdtStandard = "USDT" in self._Currency
exchange.SetCurrency(self._Currency)
if self._UseQuarter:
exchange.SetContractType("quarter")
else:
exchange.SetContractType("swap")
# 保存程序起始运行时间 秒级时间戳
def saveStrategyRunTime(self):
local_data_strategy_run_time = _G(self.StrategyRunTimeStampString)
if local_data_strategy_run_time is None:
self._StrategyDatas["start_run_timestamp"] = Unix()
_G(self.StrategyRunTimeStampString, self._StrategyDatas["start_run_timestamp"])
else:
self._StrategyDatas["start_run_timestamp"] = local_data_strategy_run_time
# 设置程序起始运行时间 秒级时间戳
def setStrategyRunTime(self, timestamp):
_G(self.StrategyRunTimeStampString, timestamp)
self._StrategyDatas["start_run_timestamp"] = timestamp
# 计算两个时间戳之间的天数,参数是秒级时间戳
def getDaysFromTimeStamp(self, start_time, end_time):
if end_time < start_time:
return 0
return (end_time - start_time) // (60 * 60 * 24)
# 保存数据到本地
def saveUserDatasLocal(self):
self._UserDatas = {
"init_assets": self._InitAsset,
"profit_local": self._ProfitLocal,
"take_profit_count": self._TakeProfitCount,
"trade_count": self._TradeCount
}
# 存储到本地
_G(exchange.GetLabel(), self._UserDatas)
Log("已把所有数据保存到本地.")
# 读取用户本地数据,程序启动时候运行一次
def readUserDataLocal(self):
user_data = _G(exchange.GetLabel())
if user_data is None:
self._InitAsset = self.getAccountAsset(_C(exchange.GetPosition), _C(exchange.GetAccount), _C(exchange.GetTicker))
self._UserDatas = {
"init_assets": self._InitAsset,
"profit_local": 0,
"take_profit_count": 0,
"trade_count": 0
}
else:
self._UserDatas = user_data
# 清除用户本地数据,交互按钮点击运行
def clearUserDataLocal(self):
_G(exchange.GetLabel(), None)
Log(exchange.GetLabel(), ":已清除本地数据.")
# 策略交互
def runCmd(self):
cmd = GetCommand()
if cmd:
# 检测交互命令
Log("接收到的命令:", cmd, "#FF1CAE")
if cmd.startswith("ClearLocalData:"):
# 清除本地数据
self.clearUserDataLocal()
elif cmd.startswith("SaveLocalData:"):
# 保存数据到本地
self.saveUserDatasLocal()
elif cmd.startswith("ClearLog:"):
# 清除日志
log_reserve = cmd.replace("ClearLog:", "")
LogReset(int(log_reserve))
elif cmd.startswith("OrderSize:"):
# 修改下单张数
if self._OrderByMargin:
Log("已经使用保证金数量来下单,无法直接修改下单数量!")
else:
order_size = int(cmd.replace("OrderSize:", ""))
self._OrderSize = order_size
Log("下单张数已经修改为:", self._OrderSize)
elif cmd.startswith("OrderMarginPercent:"):
# 修改下单保证金百分比
if self._OrderByMargin:
order_margin_percent = float(cmd.replace("OrderMarginPercent:", ""))
self._OrderMarginPercent = order_margin_percent
Log("下单保证金百分比:", self._OrderMarginPercent, "%")
else:
Log("没有打开根据保证金数量下单,无法修改下单保证金百分比!")
# 交易函数
def orderDirectly(self, distance, price, amount):
tradeFunc = None
if amount <= 0:
raise Exception("设置的参数有误,下单数量已经小于0!")
if distance == "buy":
tradeFunc = exchange.Buy
elif distance == "sell":
tradeFunc = exchange.Sell
elif distance == "closebuy":
tradeFunc = exchange.Sell
else:
tradeFunc = exchange.Buy
exchange.SetDirection(distance)
return tradeFunc(price, amount)
def openLong(self, price, amount):
real_amount = self.getRealOrderSize(price, amount)
return self.orderDirectly("buy", price, real_amount)
def openShort(self, price, amount):
real_amount = self.getRealOrderSize(price, amount)
return self.orderDirectly("sell", price, real_amount)
def coverLong(self, price, amount):
return self.orderDirectly("closebuy", price, amount)
def coverShort(self, price, amount):
return self.orderDirectly("closesell", price, amount)
# 重新计算下单数量
def getRealOrderSize(self, price, amount):
real_price = price if price != -1 else _C(exchange.GetTicker).Last
if self._OrderByMargin:
if self._IsUsdtStandard:
self._OrderSize = _N(self._InitAsset * (self._OrderMarginPercent / 100) / real_price * self._MarginLevel / self._OneSizeInCurrentCoin, self._AmountPrecision) # u本位数量(杠杆放大数量)
else:
self._OrderSize = _N(self._InitAsset * (self._Ord