Rakan baik saya, Vago, telah lama memerhatikan indikator ini dan mencadangkannya kepada saya sebelum tahun baru untuk membincangkan apakah ia boleh ditukar kepada kuantiti. Namun sayangnya, penundaan telah dilakukan, dan hanya sekarang yang dapat membantu beliau mencapai keinginan tersebut, walaupun pengetahuan mengenai algoritma telah meningkat pesat baru-baru ini. Berharap untuk menulis penterjemah pine suatu hari nanti. Semua boleh di python. Jika tidak ada lagi omong kosong, mari kita perkenalkan garis super trend dalam legenda ini.
CMC Markets, sistem perdagangan pintar generasi baharuDi sini terdapat satu artikel mengenai sistem ini.
Dalam sistem dagangan pintar generasi baru di CMC Markets, penyesuaian garis trend super-trend boleh digunakan untuk memilih indikator teknikal, dan juga untuk menghidupkan dan menghidupkan barisan trend. Seperti yang ditunjukkan di bawah, anda boleh menyesuaikan warna lilin dan halus kasar mengikut pilihan anda untuk isyarat naik, isyarat turun. Sebelum memahami formula penunjuk penunjuk penunjuk penunjuk, adalah perlu untuk memahami ATR, kerana penunjuk penunjuk menggunakan nilai ATR untuk mengira nilai.
Di bawah ini adalah satu grafik untuk menunjukkan algoritma utama.
Secara kasarnya, gambaran utama ialah saluran HL2 (k garis purata) dikalikan dengan n kali ATR. Tetapi artikelnya agak ringkas. Tidak ada algoritma terperinci. Kemudian saya teringat dengan komuniti terhebat, Tradingview. Tidak menghairankan.
Dari segi grafik, ia lebih sesuai dengan trend. Tetapi sayangnya, ia hanya isyarat peringatan Alert.
Jika kodnya tidak terlalu panjang, mari kita cuba menerjemahkannya.Kode pin lengkap adalah seperti di atas.
Di sini, di FMZ, kami telah membina strategi baru yang dinamakan SuperTrade.
Kemudian kita akan menetapkan dua parameter, Factor, Pd.
Untuk lebih memudahkan kod untuk digunakan dan mudah difahami, menggunakan pakej pelanjutan data lanjutan Python.panda
Pada waktu makan tengah hari, saya bertanya kepada guru saya, adakah FMZ menyokong perpustakaan ini. Guru impian memang hebat.
1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. Tetapkan satu kitaran doTicker untuk 15 minit untuk mengesan 1 kali.Menghidupkan kod dalam kitaran 15 minit Kemudian kita menulis strategi utama di doTicker.
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)
4. kita mahu mengambil OHCLV dari k-string, jadi kita gunakan GetRecords.
5. Kami akan mengimport data yang kami ambil ke dalam panda M15 = pd.DataFrame (rekod)
6. Kita mahu mengubah tag kepala jadual. M15.columns = [
def doTicker(records):
M15 = pd.DataFrame(records)
M15.columns = ['time','open','high','low','close','volume','OpenInterest']
7. Tambah satu baris kepada set data hl2 hl2= ((high+low) /2)
#HL2
M15['hl2']=(M15['high']+M15['low'])/2
8.接着我们来计算ATROleh kerana ATR perlu mengimport panjang pembolehubah, ia mengambil nilai Pd
Kemudian kita lihat langkah-langkah algoritma untuk nilai rata-rata gelombang sebenar ATR dengan membaca manual bahasa Melayu: TR: MAX (MAX), ABS (REF), CLOSE, 1) -HIGH); ATR: RMA ((TR,N)
TR mengambil nilai yang paling besar daripada 3 perbezaan di bawah ini. 1, Jangkauan HIGH-LOW antara harga tertinggi dan harga terendah pada hari dagangan semasa 2, Jangkauan gelombang antara harga penutupan pada hari dagangan sebelumnya dan harga tertinggi pada hari dagangan tersebut REF ((CLOSE, 1) - HIGH) 3, Jangkauan gelombang antara harga penutupan pada hari dagangan sebelumnya dan harga terendah pada hari dagangan itu REF ((CLOSE, 1) - LOW) Jadi TR: MAX (MAX), ABS (REF), CLOSE, 1) (HIGH), ABS (REF), CLOSE, 1) (LOW)
Dalam Python
M15['prev_close']=M15['close'].shift(1)
Untuk mendapatkan data close pada baris sebelumnya, anda perlu menetapkan prev_close, iaitu, untuk membuat parameter baru dengan menggerakkan close ke kanan.
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
Kemudian tentukan satu pemboleh ubah tengah untuk merekodkan satu susunan tiga nilai perbandingan TR.
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
Dalam satu set data yang kita tentukan untuk menamakan barisan baru TR, nilai TR diambil sebagai nilai mutlak terbesar dari pemboleh ubah tengah, menggunakan fungsi abs (() dan max (().
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
Akhirnya, kita akan mengira nilai ATR, ATR: RMA ((TR,N), yang mana RMA sebenarnya merupakan algoritma EMA dengan variasi nilai tetap. N adalah pemboleh ubah yang kita import, di mana parameter lalai ATR adalah 14; di sini kita import bilangan pecahan dari alpha = length.
===
Kemudian gunakan algoritma ewm untuk mengira ema.Berikut adalah proses pengiraan ATR yang lengkap:
#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 Permulaan Up dan Dn
M15['Up']=M15['hl2']-(Factor*M15['atr'])
M15['Dn']=M15['hl2']+(Factor*M15['atr'])
Up=hl2 - ((Factor * atr) Dn = hl2 + ((Factor * atr)) Adakah ia mudah?
Di bawah ini adalah petikan kod teras dari 15-21 baris TV.
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
Pada tahun 2010, beliau telah menjadi ketua kumpulan yang mengkritik Islam. Jika berada di peringkat bullish, (bottom line) TrendUp = max (Up, TrendUp[1]) Jika berada dalam fasa menurun, (gambar di atas) TrendDown=min (gambar di bawah, TrendDown[1])Ini bermaksud bahawa dalam satu trend, nilai ATR telah menggunakan teknik yang serupa dengan taktik perompak Brin. Selalunya menyempitkan sisi lain laluan.
Di sini TrendUp dan TrendDown memerlukan pengulangan diri setiap kali pengiraan dilakukan. Dalam setiap langkah, anda perlu mengira langkah sebelum anda. Oleh itu, anda perlu melakukan pelayaran berpusing pada kumpulan data.
Di sini, anda perlu membina medan baru TrendUp, TrendDown, Trend, linecolor pada kumpulan data dan memberikan nilai awal kepada mereka. Kemudian menggunakan sintaks fillna ((0) untuk mengisi data dengan nilai kosong dalam hasil yang dihitung sebelum ini dengan 0.
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
Membolehkan sebuah putaran for Menggunakan operasi ketiga Python dalam gelung
for x in range(len(M15)):
Mengira TrendUpTrendUp = MAX ((Up,TrendUp[-1]) if close [-1]>TrendUp[-1] else Up Secara kasar, jika terakhir close> terakhir TrendUp, setup mengambil Up dan nilai terbesar daripada TrendUp terakhir, tidak mengambil Up nilai dan dihantar kepada TrendUp semasa
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]
Sama juga, kira TrendDown.TrendDown=min ((Dn, TrendDown[-1]) if close[-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]
Di bawah ini adalah bendera untuk mengira arah kawalan, dan saya telah menyederhanakan beberapa kod palsu.Trend= 1 jika (tutup > TrendDown[-1]) sebaliknya (x) x = -1 jika (dekat< TrendUp[-1]) sebaliknya Trend[-1]
Maksudnya adalah jika harga penutupan > TrendDown yang lalu, mengambil 1 (lihat lebih) tidak berlaku mengambil x. Jika harga penutupan < TrendUp yang lalu, ambil -1 ((ruang kosong) tidak berlaku ambil Trend (bererti tidak berubah) Terjemahan ke dalam bahasa imej ialah menembusi bendera pemindahan lintasan, melihat lebih banyak, menembusi bendera pemindahan lintasan, tidak ada perubahan lain.
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
Mengira Tsl dan LinecolorTsl = rendUp if (Trend==1) else TrendDown
Tsl digunakan untuk menunjukkan nilai SuperTrend pada imej.
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'
Laluan 23-30 kod adalah gambar plot, tetapi tidak akan dibincangkan di sini.
Akhirnya, ada 2 baris kod untuk kawalan isyarat beli dan jual.Dalam Tradingview, dia bermaksud memberi isyarat selepas membalikkan bendera. Mengubah kata syarat menjadi python. Jika bendera trend terakhir berubah dari -1 kepada 1, ia menandakan penembusan rintangan di atas. Jika bendera trend terakhir berubah dari 1 kepada -1 ia menandakan penembusan ke bawah.
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)
Kode penuh untuk petikan ini adalah sebagai berikut:
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)
Saya telah mengubah keseluruhan struktur kod. Perintah untuk melakukan lebih banyak pekerjaan kosong akan dimasukkan ke dalam strategi. Di bawah ini adalah kod penuh.
'''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);
Sambungan strategi awam https://www.fmz.com/strategy/200625
Kami memilih data hampir setahun untuk kajian semula. Menggunakan kontrak sukuan okx untuk kitaran 15 minit. Parameter yang ditetapkan ialah, Factor = 3 Pd ialah 45. Vol = 100 (dalam setiap pesanan 100) Pendapatan tahunan yang diperoleh, kira-kira 33%. Pada umumnya, pengunduran diri tidak begitu besar. Di antara mereka, kejatuhan besar 312 memberi kesan yang lebih besar kepada sistem. Jika tiada 312, pendapatan akan lebih baik.
SuperTrend adalah satu sistem dagangan yang sangat baik.
Prinsip utama sistem SuperTrend adalah menggunakan strategi penembusan saluran ATR (mirip dengan saluran Kent) Namun, perubahannya adalah kerana ia menggunakan strategi penyempitan yang sama seperti Brin, atau prinsip Dongjian terbalik. "Selain itu, kami juga ingin memberi sokongan yang lebih kepada syarikat-syarikat yang mempunyai perniagaan di Malaysia. Operasi untuk mencapai laluan menembusi arah.
Saya telah memetakan up dn TrendUp TrendDn dalam TradingView. Ini akan membantu anda memahami strategi ini dengan lebih baik.Saya tidak tahu apa yang berlaku.
Selain itu, terdapat juga versi js di github. Saya tidak faham tentang js, tetapi dari if statement nampaknya ada sedikit masalah. Alamatnya ialah:https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js
Akhirnya, saya pergi ke laman web ini untuk mencari semula versi asalnya. Ia diterbitkan pada 29.05.2013. Penulis: Rajandran R Kod C++ diterbitkan di forum Mt4https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4Saya telah memahami maksud C++, dan berpeluang untuk menulis semula.
Saya berharap anda semua dapat belajar daripada kisah ini. Tidak boleh kacau...!
zdg4484YYDS!
Iglydz2010Jika anda menggunakan strategi ini secara langsung di OK pertukaran perdagangan perlu bagaimana untuk menyambung bursa, kecil putih satu tidak akan Python, nampak tidak jelas
pengasuhDi sini, jika gelombang 312 tidak makan, parameter harus ada ruang penyesuaian yang besar, kerana supertrend adalah untuk menangkap senarai trend, 312 tidak boleh dilewatkan.
Zhang tidak boleh menahan diri.Saya tidak tahu bagaimana orang lain mengoptimumkannya, tetapi saya tidak tahu bagaimana orang lain mengoptimumkannya.
Wu besar.Ya, saya berjaya, terima kasih atas sumbangan anda.
Wu besar.Jika anda tidak dapat menggunakannya, menunjukkan ini:Traceback (most recent call last): File "
xunfeng91Penerjemah Pine, menunggu
pengeluarTidak ada budaya yang boleh berkata hanya satu perkataan, "Bobot!"
Frank131419Saya agak-agak akan menulis penerjemah pine suatu hari nanti. Semua boleh di python.
KmeansJika kod enjin replay boleh dibuka, saya ingin melaksanakan replay dan kemudian menggunakan svm untuk mencari parameter terbaik.
DsaidasiSistem ini seolah-olah juga merupakan strategi niaga hadapan yang pernah berada di dalam 10 hasil teratas.
Awan ringanHalo, boleh saya beritahu, PD adalah panjang ATR?
Pencipta Kuantiti - Impian KecilPujian
ovelsSaya tidak tahu apa yang akan berlaku, tetapi saya tidak tahu apa yang akan berlaku, saya tidak tahu apa yang akan berlaku.
KhotbahMaksudnya tiada pakej panda, sistem anda mungkin memerlukan pip untuk memasang panda.
Ant_SkySaya ingin tahu bagaimana ia diuruskan? Terima kasih.
KhotbahHahahaha, terima kasih bos.
Pencipta Kuantiti - Impian KecilTunggu sebentar, terbuka.
lelaki kesepianPermintaan versi JS!
KhotbahSaya tidak tahu apa yang akan berlaku.
Awan ringanBagus, terima kasih! Mq4 juga hilang, terima kasih.
KhotbahYa, betul sekali.
KhotbahMaha Suci Tuhan!
Pencipta Kuantiti - Impian KecilSaya juga menulis versi JS.
KhotbahTerima kasih tuan guru.