আমি প্রায়ই ইনভেন্টর প্ল্যাটফর্মে আড্ডা দেই এবং সবসময় গুপ্তধন খুঁজে পাই। আজ আমি ২১ বছর বয়সী এক যুবককে খুঁজে পেয়েছিপ্রবণতা কৌশল, আমি মূল লেখকের সূক্ষ্ম এবং নিখুঁত কোড কাঠামোর প্রশংসা করি, এবং এর উচ্চ নমনীয়তা রয়েছে। মূল কৌশলটি হল JS সংস্করণ, যা পাইথন বন্ধুদের সুবিধার জন্য পুনর্লিখন করা হয়েছে।
সত্যি বলতে, অনেক নতুন ট্রেডারই প্রথম কোয়ান্টিটেটিভ ট্রেডিংয়ে নামার সময় অনেক পথ পাড়ি দেন। তারা প্রায়শই ব্যর্থ অর্ডার, দুর্বল ঝুঁকি ব্যবস্থাপনার কারণে লোকসান এবং কৌশল পুনরায় চালু করার পরে ডেটা হারানোর মতো সমস্যার সম্মুখীন হন। পরে, আমি ধীরে ধীরে একটি ভালো কাঠামোর গুরুত্ব বুঝতে পেরেছি, যা আমাদের অনেক বিপদ এড়াতে সাহায্য করতে পারে। এই ট্রেন্ড স্ট্র্যাটেজি ফ্রেমওয়ার্কটি একটি মূল্যবান হাতিয়ার। এটি কেবল একটি সাধারণ ট্রেডিং কৌশলের চেয়েও বেশি কিছু; এটি একটি টুলবক্সের মতো, যা আপনাকে অর্ডার প্লেসমেন্ট, স্টপ-লস অর্ডার এবং ডেটা ম্যানেজমেন্টের মতো মৌলিক কিন্তু গুরুত্বপূর্ণ ফাংশন প্রদান করে। আপনাকে কেবল “কখন কিনবেন” এবং “কখন বিক্রি করবেন” এই মূল প্রশ্নগুলিতে মনোনিবেশ করতে হবে। তদুপরি, কাঠামোটি খুবই উন্মুক্ত, যা আপনাকে সহজেই MACD, RSI, অথবা আপনার পছন্দের অন্য যেকোনো সূচকের জন্য EMA অদলবদল করতে দেয়। ট্রেন্ড অনুসরণ করতে চান? কোন সমস্যা নেই। গড় রিভার্সন চেষ্টা করতে চান? এমনকি একাধিক সূচক একত্রিত করতে চান? অবশ্যই। এই নমনীয়তা অবিশ্বাস্যভাবে কার্যকর; আপনি বিভিন্ন ধারণা নিয়ে পরীক্ষা করার জন্য একই কোড পরিবর্তন করতে পারেন।
আমি আজ এই কাঠামোটি শেয়ার করছি, আশা করি এটি পরিমাণগত বিনিয়োগ অন্বেষণকারীদের জন্য সহায়ক হবে। নীচে এই কাঠামোর প্রতিটি উপাদানের একটি বিস্তারিত ভূমিকা দেওয়া হল, যা আপনার জন্য কার্যকর হবে বলে আমি বিশ্বাস করি।
মাল্টি-কমোডিটি ট্রেডিং ফ্রেমওয়ার্কে ব্যবহৃত একাধিক স্বাধীন ফাংশনের তুলনায়, এই ফ্রেমওয়ার্কটি একটি ক্লাস ফর্ম্যাট ব্যবহার করে একটি কৌশলের বিভিন্ন অংশকে সংগঠিত এবং পরিচালনা করার চেষ্টা করে। এই অবজেক্ট-ওরিয়েন্টেড ডিজাইনটি কেবল কোড রক্ষণাবেক্ষণ এবং স্কেলেবিলিটি উন্নত করে না, বরং কৌশলগত উপাদানগুলিকে আরও মডুলার করে তোলে, পরবর্তী সমন্বয় এবং অপ্টিমাইজেশনকে সহজতর করে। ফ্রেমওয়ার্কটিতে মূলত নিম্নলিখিত বিভাগগুলি রয়েছে, প্রতিটির নিজস্ব নির্দিষ্ট ফাংশন রয়েছে, যা কৌশলটির নমনীয়তা এবং ব্যবহারিকতা নিশ্চিত করে।
init ফাংশন
__init__এই ফাংশনটি কৌশল শ্রেণীর প্রাথমিককরণ পদ্ধতি, যা কৌশলের মৌলিক কনফিগারেশন সেট করার, ভেরিয়েবল শুরু করার এবং বাজারের তথ্য প্রাপ্তির জন্য দায়ী। এই ফাংশনটি নিশ্চিত করে যে কৌশলটি চালানোর আগে প্রয়োজনীয় পরামিতিগুলি কনফিগার করা হয়েছে, যাতে পরবর্তী ট্রেডিং কার্যক্রমগুলি সুচারুভাবে সম্পাদন করা যায়।initDatas ফাংশন
saveStrategyRunTime ফাংশন
setStrategyRunTime ফাংশন
_Gফাংশনটি পাস করা টাইমস্ট্যাম্প স্থানীয়ভাবে সংরক্ষণ করে।getDaysFromTimeStamp ফাংশন
সেভ ইউজারডেটাসলোকাল ফাংশন
_Gফাংশনটি স্থানীয়ভাবে ডেটা সংরক্ষণ করে।readUserDataLocal ফাংশন
clearUserDataLocal ফাংশন
_Gফাংশন স্থানীয় ডেটা সাফ করে।রানসিএমডি ফাংশন
অর্ডারডাইরেক্টলি ফাংশন
ওপেনলং ফাংশন
orderDirectlyফাংশনটি একটি ক্রয় কার্য সম্পাদন করে।ওপেনশর্ট ফাংশন
orderDirectlyফাংশনটি একটি বিক্রয় কার্যক্রম সম্পাদন করে।কভারলং ফাংশন
orderDirectlyফাংশনটি একটি বিক্রয় কার্যক্রম সম্পাদন করে।কভারশর্ট ফাংশন
orderDirectlyফাংশনটি একটি ক্রয় কার্য সম্পাদন করে।getRealOrderSize ফাংশন
getSinglePositionMargin ফাংশন
getSinglePositionProfit ফাংশন
ক্যালকুলেটফোর্সডপ্রাইস ফাংশন
getMaxOrderSize ফাংশন
getAccountAsset ফাংশন
ক্যালকুলেটপ্রফিট ফাংশন
isEnoughAssetToOrder ফাংশন
runInKLinePeriod ফাংশন
True, অন্যথায় ফেরত দিনFalse。ট্রেন্ড জাজমেন্ট ফাংশন (কোর ট্রেন্ড জাজমেন্ট মডিউল)
স্টপলস ফাংশন
takeProfit ফাংশন
ট্র্যাকিংটেকপ্রফিট ফাংশন
অর্ডার ফাংশন
ট্রেন্ডস্ট্র্যাটেজি ফাংশন
printLogStatus ফাংশন
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._OrderMarginPerc