আমার ভালো বন্ধু মিঃ রান এই সূচকটি দীর্ঘদিন ধরে পর্যবেক্ষণ করে আসছেন এবং নববর্ষের আগে এটি আমাকে সুপারিশ করেছেন যাতে এটি পরিমাপে রূপান্তরিত হতে পারে কিনা তা নিয়ে আলোচনা করা যায়। এটা খুবই দুঃখজনক যে, বিলম্বকারী তার এই ইচ্ছা পূরণ করতে এত দেরি করেছে। আসলে, সম্প্রতি অ্যালগরিদম সম্পর্কে আমার জ্ঞান দ্রুত উন্নতি করেছে। এটা অনুমান করা হয় যে একদিন আমি পাইন ভাষার জন্য একটি অনুবাদক লিখব। সবকিছু পাইথন হতে পারে। আচ্ছা, বেশি বাজে কথা না বলে, আসুন সুপার ট্রেন্ড লাইনটি পরিচয় করিয়ে দিই।
সিএমসি মার্কেটে নতুন প্রজন্মের ইন্টেলিজেন্ট ট্রেডিং সিস্টেমে, আমরা ব্যবহার করার জন্য প্রযুক্তিগত সূচক থেকে
এটি মূলত চ্যানেলটি বর্ণনা করে যেখানে HL2 (k-লাইন গড় মূল্য) + n বার ATR। একটি ট্রেন্ডের অগ্রগতি করুন। কিন্তু নিবন্ধটি সহজ. কোন বিস্তারিত অ্যালগরিদম নেই. তারপর আমি সবচেয়ে আশ্চর্যজনক সম্প্রদায়ের চিন্তা, ট্রেডিংভিউ. প্রকৃতপক্ষে, এটা সত্যিই আছে।
চার্টে দেখা যাচ্ছে, এটা প্রবণতার সাথে সামঞ্জস্যপূর্ণ। দুর্ভাগ্যবশত, এটি কেবল সতর্কতার একটি সতর্কতা সংকেত।
কোডটি খুব বেশি লম্বা নয়, তাই আসুন এটি অনুবাদ করার চেষ্টা করি।!
সম্পূর্ণ পাইন কোড উপরের মত।
এখানে আমরা এফএমজেডে একটি নতুন কৌশল তৈরি করি, এর নাম দিন সুপারট্রেন্ড
পরবর্তী, আমরা দুটি পরামিতি সেট করব, ফ্যাক্টর এবং পিডি
কোড অপারেশনকে আরও সহজ করার জন্য এবং বোঝার জন্য, আমাদের পাইথনের উন্নত ডেটা সম্প্রসারণ প্যাকেজ পান্ডাস ব্যবহার করতে হবে (https://pandas.pydata.org/) এফএমজেড এখন এই লাইব্রেরীকে সমর্থন করে।
import pandas as pd
import time
def main():
exchange.SetContractType("quarter")
preTime = 0
Log(exchange.GetAccount())
while True:
records = exchange.GetRecords(PERIOD_M15)
if records and records[-2].Time > preTime:
preTime = records[-2].Time
doTicker(records[:-1])
Sleep(1000 *60)
def doTicker(records):
M15 = pd.DataFrame(records)
M15.columns = ['time','open','high','low','close','volume','OpenInterest']
#HL2
M15['hl2']=(M15['high']+M15['low'])/2
তারপরে আমরা মাইল্যাঙ্গুয়েজের ম্যানুয়ালটি উল্লেখ করি, এবং এটিআর বাস্তব ওঠানামা ব্যাপ্তির গড় মানের অ্যালগরিদম পদক্ষেপগুলি নিম্নরূপঃ TR: MAX ((MAX ((((HIGH-LOW),ABS ((REF ((CLOSE,1)-HIGH)),ABS ((REF ((CLOSE,1)-LOW)); ATR: RMA ((TR,N)
TR মান নিম্নলিখিত তিনটি পার্থক্যের সর্বোচ্চ
পাইথনের গণনায়
M15['prev_close']=M15['close'].shift(1)
আমরা পূর্ববর্তী সারিতে বন্ধ তথ্য পুনরুদ্ধার করতে একটি prev_close সেট আপ করতে হবে, অর্থাৎ, একটি নতুন পরামিতি গঠনের জন্য এক গ্রিড দ্বারা ডানদিকে বন্ধ সরানো
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
এরপরে, আমরা একটি মধ্যবর্তী পরিবর্তনশীল সংজ্ঞায়িত করি যা TR এর জন্য 3 টি বিপরীত মানের একটি অ্যারে রেকর্ড করে। (উচ্চ-নিম্ন) (উচ্চ-prev_close) (নিম্ন-prev_close)
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
আমরা ডেটা সেটে একটি নতুন কলাম সংজ্ঞায়িত করি এবং এটিকে TR হিসাবে নামকরণ করি। TR এর মান হল মধ্যবর্তী ভেরিয়েবলের বৃহত্তম পরম মান, ফাংশন abs () এবং max () ব্যবহার করে
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
অবশেষে, আমাদের ATR, ATR: RMA (TR, N) এর মান গণনা করতে হবে। এটি পাওয়া যায় যে RMA অ্যালগরিদম আসলে EMA অ্যালগরিদমের একটি নির্দিষ্ট মানের বৈকল্পিক। N হল আমরা আমদানি করা ভেরিয়েবল। ATR এর ডিফল্ট প্যারামিটার হল 14. এখানে আমরা আলফা = দৈর্ঘ্যের বিপরীত আমদানি করি।
===
তারপর Ewm অ্যালগরিদম ব্যবহার করা হয় ema গণনা করতে সম্পূর্ণ এটিআর গণনা প্রক্রিয়া নিম্নরূপঃ
#ATR(PD)
length=Pd
M15['prev_close']=M15['close'].shift(1)
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
9 Up এবং Dn গণনা শুরু করুন
M15['Up']=M15['hl2']-(Factor*M15['atr'])
M15['Dn']=M15['hl2']+(Factor*M15['atr'])
Up=hl2 - ((ফ্যাক্টর * atr) Dn=hl2 +(ফ্যাক্টর * atr) এটা কি সহজ নয়?
এখানে টিভি থেকে লাইন 15-21 এর কোর কোড বিভাগ
TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = Trend==1? TrendUp: TrendDown
linecolor = Trend == 1 ? green : red
এই অনুচ্ছেদের মূল উদ্দেশ্য হচ্ছে, যদি এটি উত্থানমুখী পর্যায়ে থাকে, (নিচের লাইন) ট্রেন্ডআপ=ম্যাক্স (উপরে, ট্রেন্ডআপ [1]) যদি এটি পতনের পর্যায়ে থাকে, (উপরের লাইন) TrendDown=min (Dn, TrendDown [1]) অর্থাৎ, একটি প্রবণতা হিসাবে, ATR মানটি Bandit Bollinger কৌশল অনুরূপ একটি প্রযুক্তি ব্যবহার করা হয়েছে। চ্যানেলের অন্য দিকে সংকীর্ণ রাখা
এখানে, ট্রেন্ডআপ এবং ট্রেন্ডডাউন এর প্রতিটি গণনার জন্য স্ব-ইটারেশন প্রয়োজন। অর্থাৎ, প্রতিটি ধাপ পূর্ববর্তী ধাপ অনুযায়ী গণনা করা উচিত। অতএব, ডেটা সেটটি লুপে পুনরাবৃত্তি করা উচিত।
প্রথমত, আমরা নতুন ক্ষেত্র TrendUp, TrendDown, Trend, linecolor তৈরি করি ডাটা সেটের জন্য। এবং তাদের একটি প্রাথমিক মান দিন তারপর আমরা 0 দিয়ে পূর্বে গণনা ফলাফলের শূন্য মান দিয়ে তথ্য পূরণ করতে ব্যাকরণ fillna (0) ব্যবহার
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
একটি ফর লুপ সক্ষম করুন লুপে পাইথন টার্নারি অপারেশন ব্যবহার করে
for x in range(len(M15)):
ট্রেন্ডআপ গণনা করুন ট্রেন্ডআপ = MAX(আপ,ট্রেন্ডআপ[-1]) যদি বন্ধ হয়[-1]>ট্রেন্ডআপ[-1] অন্যথায় আপ এর অর্থ হল যদি পূর্ববর্তী বন্ধ> পূর্ববর্তী ট্রেন্ডআপ সত্য হয় তবে আপ এবং পূর্ববর্তী ট্রেন্ডআপের মধ্যে সর্বাধিক মান নেওয়া হবে; যদি না হয় তবে আপ মান নেওয়া হবে এবং বর্তমান ট্রেন্ডআপের কাছে পাস করা হবে
M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
একইভাবে, ট্রেন্ডডাউন গণনা করুন TrendDown=min(Dn,TrendDown[-1]) যদি বন্ধ হয়[-1]
M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
নিম্নলিখিত নিয়ন্ত্রণ দিক গণনা করার জন্য পতাকা. আমি ছদ্ম কোড সরলীকৃত ট্রেন্ড= ১ যদি (বন্ধ > ট্রেন্ডডাউন[-১]) অন্যথায় (x) x = -1 যদি (close
এর অর্থ হল যে যদি বন্ধের মূল্য> পূর্ববর্তী ট্রেন্ডডাউন হয়, তাহলে 1 এর মান নিন। যদি না হয়, তাহলে x এর মান নিন। যদি বন্ধের মূল্য পূর্ববর্তী ট্রেন্ডআপের চেয়ে কম হয়, তাহলে -1 (ধীরগতির) মান নিন। যদি না হয়, তাহলে পূর্ববর্তী ট্রেন্ড (অপরিবর্তিত মানে) নিন চিত্র ভাষায় অনুবাদ করার জন্য বলা যায় যে উপরের ট্র্যাক ট্রানজিশন পতাকার একটি ব্রেকআউট bullish এর জন্য; এবং নিম্ন ট্র্যাক ট্রানজিশন পতাকার একটি ব্রেকআউট bearish এর জন্য। অন্য সময় পরিবর্তন হবে না।
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
Tsl এবং Linecolor গণনা করুন
Tsl= rendUp if (Trend==1) অন্যথায় TrendDown
Tsl হল ইমেজে সুপার ট্রেন্ড উপস্থাপনের জন্য ব্যবহৃত মান। এর অর্থ হল যখন আমরা উত্থানমুখী থাকি তখন ইমেজে ডাউন ট্র্যাক চিহ্নিত করা এবং যখন আমরা হ্রাসমুখী থাকি তখন ইমেজের উপরের ট্র্যাক চিহ্নিত করা।
linecolor=
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else 'red'
পরবর্তী ২৩-৩০ লাইন কোড মূলত প্লট অঙ্কন, যা এখানে ব্যাখ্যা করা হয় না।
অবশেষে, ক্রয় এবং বিক্রয় সংকেত নিয়ন্ত্রণ করার জন্য কোড 2 লাইন আছে ট্রেডভিউতে, এর মানে হল যে পতাকাটি বিপরীত করার পরে সংকেত দেওয়া হয় শর্তাধীন বিবৃতিকে পাইথনে রূপান্তর করুন। যদি সর্বশেষ ট্রেন্ড ফ্ল্যাগ -1 থেকে 1 এ পরিবর্তিত হয়, তাহলে এর অর্থ হল যে উপরের প্রতিরোধের সীমা অতিক্রম করা হয়েছে এবং লং পজিশন খোলা হয়েছে। যদি সর্বশেষ ট্রেন্ড ফ্ল্যাগ ১ থেকে -১-এ পরিবর্তিত হয়, তাহলে এর মানে হল যে ডাউন সাপোর্ট অতিক্রম করা হয়েছে এবং শর্ট পজিশন খোলা হয়েছে।
if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
Log('SuperTrend V.1 Alert Long',"Create Order Buy)
if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
Log('SuperTrend V.1 Alert Long',"Create Order Sell)
সম্পূর্ণ কোডটি নিম্নরূপঃ
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
for x in range(len(M15)):
M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else 'red'
if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
Log('SuperTrend V.1 Alert Long',"Create Order Buy)
Log('Tsl=',Tsl)
if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
Log('SuperTrend V.1 Alert Long',"Create Order Sell)
Log('Tsl=',Tsl)
আমি কোডের কাঠামো সামঞ্জস্য করেছি। এবং আমি লং এবং শর্ট অর্ডার নির্দেশাবলীকে কৌশলতে একত্রিত করেছি। এখানে সম্পূর্ণ কোড আছে:
'''backtest
start: 2019-05-01 00:00:00
end: 2020-04-21 00:00:00
period: 15m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
'''
import pandas as pd
import time
def main():
exchange.SetContractType("quarter")
preTime = 0
Log(exchange.GetAccount())
while True:
records = exchange.GetRecords(PERIOD_M15)
if records and records[-2].Time > preTime:
preTime = records[-2].Time
doTicker(records[:-1])
Sleep(1000 *60)
def doTicker(records):
#Log('onTick',exchange.GetTicker())
M15 = pd.DataFrame(records)
#Factor=3
#Pd=7
M15.columns = ['time','open','high','low','close','volume','OpenInterest']
#HL2
M15['hl2']=(M15['high']+M15['low'])/2
#ATR(PD)
length=Pd
M15['prev_close']=M15['close'].shift(1)
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
M15['Up']=M15['hl2']-(Factor*M15['atr'])
M15['Dn']=M15['hl2']+(Factor*M15['atr'])
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
for x in range(len(M15)):
M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
M15['linecolor'].values[x]= 'Long' if ( M15['Trend'].values[x]==1) else 'Short'
linecolor=M15['linecolor'].values[-2]
close=M15['close'].values[-2]
Tsl=M15['Tsl'].values[-2]
if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
Log('SuperTrend V.1 Alert Long','Create Order Buy')
Log('Tsl=',Tsl)
position = exchange.GetPosition()
if len(position) > 0:
Amount=position[0]["Amount"]
exchange.SetDirection("closesell")
exchange.Buy(_C(exchange.GetTicker).Sell*1.01, Amount);
exchange.SetDirection("buy")
exchange.Buy(_C(exchange.GetTicker).Sell*1.01, vol);
if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
Log('SuperTrend V.1 Alert Long','Create Order Sell')
Log('Tsl=',Tsl)
position = exchange.GetPosition()
if len(position) > 0:
Amount=position[0]["Amount"]
exchange.SetDirection("closebuy")
exchange.Sell(_C(exchange.GetTicker).Buy*0.99,Amount);
exchange.SetDirection("sell")
exchange.Sell(_C(exchange.GetTicker).Buy*0.99, vol*2);
পাবলিক স্ট্র্যাটেজি ঠিকানাঃhttps://www.fmz.com/strategy/200625
আমরা ব্যাকটেস্টিংয়ের জন্য গত বছরের তথ্য নির্বাচন করেছি। আমরা OKEX ত্রৈমাসিক চুক্তি 15 মিনিটের জন্য ব্যবহার করি। সেট করা পরামিতি হলঃ ফ্যাক্টর=৩ Pd=৪৫ Vol=100 (প্রতিটি অর্ডারের জন্য ১০০টি চুক্তি) বার্ষিক আয় প্রায় ৩৩%। সাধারণভাবে বলতে গেলে, প্রত্যাহার খুব বেশি নয়, ৩১২ এর তীব্র হ্রাস সিস্টেমে তুলনামূলকভাবে বড় প্রভাব ফেলেছে, যদি ৩১২ না থাকে, তাহলে রিটার্ন ভালো হবে।
সুপারট্রেন্ড একটি খুব ভাল ট্রেডিং সিস্টেম
সুপারট্রেন্ড সিস্টেমের মূল নীতি হল এটিআর চ্যানেলের অগ্রগতি কৌশল গ্রহণ করা (কেন্ট চ্যানেলের অনুরূপ) তবে এর পরিবর্তন মূলত ব্যাণ্ডিট বোলিংগারের সংকীর্ণকরণ কৌশল বা ডোনচিয়ান নীতির বিপরীত ব্যবহারের কারণে ঘটে। বাজারের ক্রিয়াকলাপে, উপরের এবং নীচের চ্যানেলগুলি ক্রমাগত সংকীর্ণ হয়। চ্যানেলের মাধ্যমে স্টিয়ারিংয়ের কাজটি অর্জনের জন্য (একবার চ্যানেলটি ভেঙে গেলে, উপরের এবং নীচের ট্র্যাকগুলি প্রাথমিক মানটিতে ফিরে আসবে)
আমি ট্রেডভিউতে, ডিএন, ট্রেন্ডআপ এবং ট্রেন্ডডিএন আলাদাভাবে গ্রাফ করি, যা কৌশলকে আরও ভালভাবে বুঝতে সাহায্য করে। এক নজরে দেখে নিনঃ
উপরন্তু, গিটহাব এ জেএস এর একটি সংস্করণ আছে। আমি জেএস এ ভাল নই, কিন্তু মনে হচ্ছে যদি বিবৃতিতে কিছু ভুল আছে। ঠিকানা:https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js
অবশেষে, আমি মূল সংস্করণটি খুঁজে পেয়েছি। ২৯ মে ২০১৩ তারিখে প্রকাশিত। লেখক রাজন্দ্রন আর। এমটি৪ ফোরামে সি++ কোড প্রকাশিত হয়েছে:https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4আমি C++ এর অর্থ মোটামুটি বুঝতে পেরেছি, এবং যখন সুযোগ হবে তখন আমি এটি পুনরায় লিখব।
আমি আশা করি আপনি এর থেকে মূল বিষয়টা শিখতে পারবেন। এটা কঠিন!