میرے اچھے دوست مسٹر ران نے اس اشارے کا مشاہدہ کافی عرصے سے کیا ہے اور نئے سال کے دن سے پہلے مجھے اس کی سفارش کی تاکہ اس پر تبادلہ خیال کیا جا سکے کہ کیا اسے مقدار میں تبدیل کیا جا سکتا ہے۔ یہ افسوس کی بات ہے کہ تاخیر کرنے والے نے اس طرح کی خواہش کو پورا کرنے میں مدد کرنے میں اب تک تاخیر کی ہے۔ در حقیقت ، حال ہی میں الگورتھم کے بارے میں میری سمجھ میں تیزی سے بہتری آئی ہے۔ یہ اندازہ لگایا گیا ہے کہ ایک دن میں پائن زبان کے لیے ایک مترجم لکھوں گا۔ ہر چیز پائیتھون ہو سکتی ہے۔ ٹھیک ہے، بہت سی بکواس کے بغیر، آئیے افسانوی سپر رجحان لائن متعارف کراتے ہیں.
سی ایم سی مارکیٹس میں ذہین ٹریڈنگ سسٹم کی نئی نسل میں، ہم استعمال کرنے کے لئے تکنیکی اشارے سے
ایک مختصر نظر ڈالیں۔ یہ بنیادی طور پر اس چینل کی وضاحت کرتا ہے جہاں HL2 (k- لائن اوسط قیمت) کے علاوہ اے ٹی آر کا n گنا۔ ایک رجحان کی پیشرفت کریں۔ لیکن مضمون سادہ ہے۔ کوئی تفصیلی الگورتھم نہیں۔ پھر میں نے سب سے حیرت انگیز کمیونٹی کا سوچا، ٹریڈنگ ویو۔ بے شک، وہ واقعتاً موجود ہے۔
چارٹ کو دیکھ کر، یہ رجحان کے مطابق ہے۔ بدقسمتی سے، یہ صرف الرٹ کا الارم سگنل ہے۔
کوڈ بہت لمبا نہیں ہے، تو چلو اسے ترجمہ کرنے کی کوشش کرتے ہیں.!(っ•̀ω•́)っ
مکمل پائن کوڈ مندرجہ بالا ہے.
یہاں ہم FMZ پر ایک نئی حکمت عملی تخلیق، اس کا نام سپر رجحان
اگلا، ہم دو پیرامیٹرز مقرر کریں گے، فیکٹر اور پی ڈی
کوڈ آپریشن کو بہتر طور پر آسان بنانے اور تفہیم کو آسان بنانے کے لئے، ہمیں پطرون
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
پھر ہم MyLanguage کے دستی کا حوالہ دیتے ہیں، اور ATR حقیقی اتار چڑھاؤ طول و عرض کی اوسط قیمت کے الگورتھم اقدامات مندرجہ ذیل ہیں: TR: MAX ((MAX(((HIGH-LOW),ABS ((REF ((CLOSE,1)-HIGH)),ABS ((REF ((CLOSE,1)-LOW)); اے ٹی آر: آر ایم اے (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 متضاد اقدار کی ایک صف ریکارڈ کرتا ہے۔ (ہائی-لو) (ہائی-پریو_کلوز) (لو-پریو_کلوز)
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()
آخر میں ، ہمیں اے ٹی آر ، اے ٹی آر: آر ایم اے (ٹی آر ، این) کی قدر کا حساب لگانے کی ضرورت ہے۔ یہ پتہ چلتا ہے کہ آر ایم اے الگورتھم اصل میں ای ایم اے الگورتھم کا ایک مقررہ قدر والا متغیر ہے۔ N وہ متغیر ہے جسے ہم درآمد کرتے ہیں۔ اے ٹی آر کا ڈیفالٹ پیرامیٹر 14 ہے۔ یہاں ہم الفا = لمبائی کے متضاد کو درآمد کرتے ہیں۔
===
پھر ای ایم ایم الگورتھم ای ایم اے کا حساب کرنے کے لئے استعمال کیا جاتا ہے اے ٹی آر کے حساب کا مکمل عمل مندرجہ ذیل ہے
#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 اوپر اور 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
اس پیراگراف کا بنیادی نکتہ یہ ہے کہ، اگر یہ تیزی کے مرحلے میں ہے، (نیچے کی لائن) TrendUp=max (Up, TrendUp [1]) اگر یہ گرنے کے مرحلے میں ہے، (اوپر لائن) ٹرینڈ ڈاؤن = منٹ (Dn، ٹرینڈ ڈاؤن [1]) یعنی ایک رجحان میں اے ٹی آر ویلیو بانڈٹ بولنگر حکمت عملی کی طرح ایک ٹیکنالوجی کا استعمال کر رہا ہے۔ چینل کے دوسرے حصے کو تنگ کرتے رہیں
یہاں، TrendUp اور TrendDown کے ہر حساب خود تکرار کی ضرورت ہوتی ہے. یعنی ہر قدم کا حساب پچھلے مرحلے کے مطابق لگایا جائے۔ لہذا، ڈیٹا سیٹ لوپ میں تکرار کیا جانا چاہئے.
سب سے پہلے، ہم نئے کھیتوں TrendUp، TrendDown، Trend، ڈیٹا سیٹ کے لئے لائن کلر تخلیق. اور ان کو ایک ابتدائی قدر دے پھر ہم استعمال کرتے ہیں گرامر fillna (0) 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)):
ٹرینڈ اپ کا حساب لگائیں TrendUp = MAX(Up,TrendUp[-1]) اگر قریب[-1]>TrendUp[-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]
مندرجہ ذیل کنٹرول کی سمت کا حساب کرنے کے لئے پرچم ہے. میں نے سادہ جعلی کوڈ رجحان= 1 اگر (بند کریں > رجحان نیچے[-1]) دوسری صورت میں (x) x = -1 اگر (قریب< ٹرینڈ اپ[-1]) دوسری صورت میں ٹرینڈ[-1]
اس کا مطلب یہ ہے کہ اگر اختتامی قیمت> پچھلے ٹرینڈ ڈاؤن ہے تو ، 1 کی قدر لیں (بلس) ۔ اگر نہیں تو ، ایکس کی قدر لیں اگر اختتامی قیمت پچھلے ٹرینڈ اپ سے کم ہے تو ، -1 کی قدر لیں (بھاری) ۔ اگر نہیں تو ، پچھلے ٹرینڈ (یعنی غیر تبدیل شدہ) کو لیں تصویر کی زبان میں ترجمہ کرنے کے لئے یہ ہے کہ بالیش کے لئے اوپری ٹریک ٹرانزیشن پرچم کی خرابی؛ اور bearish کے لئے نچلی ٹریک ٹرانزیشن پرچم کی خرابی.
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
Tsl اور Linecolor کا حساب لگائیں
TSl= rendUp اگر (ٹرینڈ==1) دوسری صورت میں ٹرینڈ ڈاؤن
tsl تصویر پر سپر ٹرینڈ کی نمائندگی کرنے کے لئے استعمال ہونے والا قدر ہے۔ اس کا مطلب یہ ہے کہ جب ہم تیزی سے ہیں تو تصویر پر نیچے کی ٹریک کو نشان زد کریں ، اور جب ہم bearish میں ہیں تو تصویر پر اوپری ٹریک کو نشان زد کریں۔
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'
اگلے 23-30 کوڈ لائنز بنیادی طور پر پلاٹ ڈرائنگ ہیں، جو یہاں وضاحت نہیں کی جاتی ہیں.
آخر میں، خریدنے اور فروخت سگنل کو کنٹرول کرنے کے لئے کوڈ کی 2 لائنیں ہیں ٹریڈ ویو میں، اس کا مطلب یہ ہے کہ سگنل پرچم کو الٹ کرنے کے بعد دیا جاتا ہے مشروط بیان کو پطرون میں تبدیل کریں۔ اگر آخری ٹرینڈ فلیگ -1 سے 1 میں بدل جاتی ہے تو اس کا مطلب یہ ہے کہ اوپری مزاحمت سے تجاوز کیا گیا ہے اور طویل پوزیشن کھول دی گئی ہے۔ اگر آخری ٹرینڈ فلیگ 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 منٹ کی مدت کے لئے استعمال کرتے ہیں. مقرر پیرامیٹرز ہیں: فیکٹر=3 Pd=45 Vol=100 (ہر آرڈر کے لئے 100 معاہدے) سالانہ واپسی تقریبا 33٪ ہے. عام طور پر، واپسی بہت زیادہ نہیں ہے، 312 کی شدید کمی کا نظام پر نسبتاً بڑا اثر پڑا، اگر کوئی 312 نہیں ہے، واپسی بہتر ہونا چاہئے.
سپر ٹرینڈ ایک بہت اچھا تجارتی نظام ہے
سپر ٹرینڈ سسٹم کا بنیادی اصول اے ٹی آر چینل کی پیشرفت کی حکمت عملی کو اپنانا ہے (کینٹ چینل کی طرح) تاہم ، اس کی تبدیلی بنیادی طور پر بانڈٹ بولنگر کی تنگ کرنے والی حکمت عملی کے استعمال کی وجہ سے ہے ، یا ڈونچیئن اصول کا الٹا ہے۔ مارکیٹ آپریشن میں، اوپری اور نچلے چینلز کو مسلسل تنگ کیا جاتا ہے۔ چینل کے ذریعے بریکنگ سٹیرنگ کے آپریشن کو حاصل کرنے کے لئے. (ایک بار چینل کے ذریعے توڑنے کے بعد، اوپری اور نچلے پٹریوں ابتدائی قیمت پر واپس آ جائیں گے)
میں نے TradeView پر الگ الگ، dn، TrendUp اور TrendDn نقشہ، جس سے حکمت عملی کو بہتر طور پر سمجھنا آسان ہوجاتا ہے۔ ایک نظر میں واضح طور پر دیکھیں:
اس کے علاوہ، github پر js کا ایک ورژن ہے۔ میں js میں اچھا نہیں ہوں، لیکن ایسا لگتا ہے کہ اگر بیان میں کچھ غلط ہے۔ پتہ:https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js
آخر میں، میں نے اصل ورژن کا سراغ لگایا. یہ 29 مئی 2013 کو شائع ہوا تھا مصنف راجاندران آر ہے C ++ کوڈ MT4 فورم پر شائع کیا گیا تھا:https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4میں نے C++ کے معنی کو تقریباً سمجھ لیا ہے، اور موقع ملنے پر میں اسے دوبارہ لکھوں گا۔
مجھے امید ہے کہ آپ اس سے جوہر سیکھ سکتے ہیں۔ یہ مشکل ہے!