SuperTrend V.1 - Sistem garis tren super

Penulis:khotbah, Dibuat: 2020-04-20 22:10:36, Diperbarui: 2023-10-08 19:57:57

img

Pertama, dari mana cerita itu berasal.

Teman baik saya Vago telah mengamati indikator ini untuk waktu yang lama dan merekomendasikannya kepada saya sebelum Tahun Baru untuk membahas apakah dapat diubah menjadi kuantitatif. Namun sayangnya, penundaan telah dilakukan, dan telah ditunda hingga saat ini untuk membantu dia mencapai keinginan tersebut, yang pada kenyataannya baru-baru ini meningkatkan pemahaman tentang algoritma. Saya berharap suatu hari nanti saya bisa menulis sebuah penerjemah pine. Semua bisa di python. Untuk menghindari omong kosong, mari kita perhatikan garis supertrend dalam legenda ini.

2. Pengantar Sistem

CMC Markets adalah generasi baru dari sistem perdagangan cerdas.Di sini ada artikel tentang sistem ini.img

Dalam sistem perdagangan cerdas generasi baru di CMC Markets, penyesuaian garis tren super dapat digunakan untuk memilih indikator teknis. Seperti yang ditunjukkan pada gambar di atas, Anda dapat menyesuaikan warna jeruk dan kehalusan tebal sesuai dengan preferensi Anda untuk sinyal naik, sinyal turun. Jadi apa itu indikator supertrend? Sebelum memahami rumus indikator supertrend, pemahaman ATR adalah penting karena supertrend menggunakan nilai ATR untuk menghitung nilai indikator.

Di bawah ini adalah grafik yang menunjukkan algoritma utama.img

Secara umum, deskripsi utama adalah saluran HL2 (k garis rata-rata) dikalikan dengan n kali ATR. Tapi artikelnya lebih sederhana. Tidak ada algoritma yang rinci. Kemudian saya memikirkan komunitas terkuat, Tradingview. Tidak mengherankan.img

Dari grafiknya, tampaknya lebih sesuai dengan tren. Namun sayangnya, itu hanya sinyal peringatan Alert.

3. Belajar kode sumber

Jika Anda melihat kode yang tidak terlalu panjang, maka mari kita coba menerjemahkannya.imgKode pin lengkapnya di atas.

Empat, mengubah kode.

Di sini di FMZ, kami membuat strategi baru yang disebut SuperTrade.img

Jadi kita akan mengatur dua parameter, Factor, Pd.img

Untuk lebih menyederhanakan pengoperasian kode, mudah dimengerti, ini menggunakan paket ekstensi data tingkat tinggi Python.panda

Saat makan siang, saya bertanya kepada guru tentang apakah FMZ mendukung perpustakaan ini. "Mengharukan" adalah ungkapan yang sering diucapkan oleh para guru di sekolah.

1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. Mengatur satu siklus doTicker untuk 15 menit dan mendeteksi 1 kali.Mengoperasikan kode dalam siklus 15 menit 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)
        

Jadi kita akan menggunakan GetRecords untuk mendapatkan OHCLV dari k. 5. kita akan mengimpor data yang kita ambil ke dalam panda M15 = pd.DataFrame (rekaman) M15.columns = [time tab,open tab,high tab,low tab,close tab,volume tab,OpenInterest tab]Yang sebenarnya adalah mengubah huruf pertama dari "open", "high", "low", "close" menjadi huruf kecil, sehingga lebih mudah untuk menulis kode di kemudian hari.

def doTicker(records):
    M15 = pd.DataFrame(records)
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  

7. Tambahkan baris hl2 ke dalam kumpulan data. hl2 = ((high+low) /2)

#HL2
M15['hl2']=(M15['high']+M15['low'])/2

8.接着我们来计算ATRKarena perhitungan ATR untuk mengimpor panjang variabel, nilai yang diambil adalah Pd

Selanjutnya, kita akan melihat langkah-langkah algoritma untuk mendapatkan rata-rata gelombang sebenarnya ATR dengan membaca manual bahasa Inggris: TR: MAX ((MAX (((HIGH-LOW), ABS ((REF ((CLOSE, 1) -HIGH)), ABS ((REF ((CLOSE, 1) -LOW)); ATR: RMA (TR,N)

TR adalah nilai yang paling besar dari tiga perbedaan di bawah ini. 1, kisaran antara harga tertinggi dan harga terendah hari perdagangan saat ini HIGH-LOW 2, rentang gelombang antara harga penutupan hari sebelumnya dan harga tertinggi hari itu REF ((CLOSE, 1) -HIGH) 3, rentang gelombang antara harga penutupan hari sebelumnya dan harga terendah hari itu REF ((CLOSE, 1) - LOW) Jadi TR: MAX ((MAX ((((HIGH-LOW), ABS ((REF ((CLOSE, 1) -HIGH)), ABS ((REF ((CLOSE, 1) -LOW));

Perhitungan Python

M15['prev_close']=M15['close'].shift(1)

Untuk mengambil data close pada baris sebelumnya, Anda harus mengatur prev_close, yaitu dengan memindahkan close ke kanan 1 untuk membuat parameter baru.

ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]

Kemudian, definisi variabel tengah untuk merekam array dengan tiga nilai kontras TR.

M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)

Kami mendefinisikan sebuah kolom baru yang diberi nama TR dalam kumpulan data, TR mengambil nilai yang terbesar dari nilai absolut dari variabel 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 menghitung nilai ATR, ATR: RMA ((TR,N), yang menurut RMA sebenarnya adalah algoritma EMA dengan variabel nilai tetap. N adalah variabel yang kita impor, dimana parameter default ATR adalah 14; di sini kita impor faktor dari alpha = length.

===

Kemudian gunakan algoritma ewm untuk menghitung ema.Berikut adalah proses perhitungan ATR 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 mulai menghitung Up dan Dn

    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])

Up=hl2 - ((Factor * atr) Dn = hl2 + ((Faktor * atr)) Apakah itu sederhana?

Di bawah ini adalah bagian kode inti dari 15-21 baris dari 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

"Saya tidak tahu apa yang akan terjadi di Indonesia", kata dia. Jika berada di fase bullish, (bottom line) TrendUp = max (Up, TrendUp[1]) Jika berada di fase menurun, (line up) TrendDown=min (Dn, TrendDown[1])Dengan kata lain, dalam satu tren, nilai ATR telah menggunakan teknik yang mirip dengan taktik perampok Brin. Terus-menerus menyempit di sisi lain.

Di sini, TrendUp dan TrendDown membutuhkan pengulangan diri setiap kali perhitungan dilakukan. Dia mengatakan bahwa setiap langkah yang dia ambil adalah langkah yang akan dia ambil sendiri. Jadi kita harus melakukan looping pada data set.

Di sini Anda harus membuat kolom baru untuk kumpulan data TrendUp, TrendDown, Trend, linecolor, dan memberi mereka nilai awal Kemudian menggunakan sintaks fillna ((0) untuk mengisi 0 dengan data dengan nilai kosong dari hasil yang dihitung sebelumnya.

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

Memungkinkan loop for Menggunakan operasi ketiga Python dalam loop

    for x in range(len(M15)):

Menghitung TrendUpTrendUp = MAX ((Up,TrendUp[-1]) if close [-1]>TrendUp[-1] else Up Ini berarti bahwa jika yang terakhir close> yang terakhir TrendUp, setup mengambil Up dan nilai terbesar dari yang terakhir TrendUp, tidak mengambil Up nilai dan dikirim ke TrendUp saat ini

        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]

Jadi, kita bisa menghitung 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 menghitung arah kendali, dan saya telah menyederhanakan beberapa kode palsu.Trend= 1 jika (close > TrendDown[-1]) sebaliknya (x) x = -1 jika (dekat< TrendUp[-1]) sebaliknya Trend[-1]

Artinya adalah jika harga penutupan > TrendDown terakhir maka mengambil 1 ((lihat lebih) tidak berlaku mengambil x Jika harga penutupan < satu TrendUp sebelumnya maka ambil -1 ((ruang kosong) tidak dibuat ambil satu Trend (berarti tidak berubah) Terjemahan ke bahasa gambar adalah menembus bendera konversi lintasan, melihat lebih banyak, menembus bendera konversi lintasan, tidak ada perubahan lainnya.

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]

Menghitung Tsl dan LinecolorTsl = rendUp if (Trend==1) else TrendDown Tsl digunakan untuk menunjukkan nilai SuperTrend pada gambar. Tsl berarti menandai tren di grafik saat melihat lebih banyak, dan menandai tren di grafik saat melihat lebih sedikit. linecolor= green if (Trend==1) else red Linecolor berarti garis hijau jika dilihat lebih banyak, warna kosong jika dilihat kosong (sebagian besar digunakan untuk tampilan Tradingview)

        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'

Lalu, baris 23-30 kode yang sebagian besar adalah plot drawing.

Dan terakhir, ada dua baris kode untuk kontrol sinyal jual beli.Dalam Tradingview, dia berarti memberi sinyal setelah membalikkan Flag. Mengkonversi kata syarat menjadi python. Jika bendera tren terakhir berubah dari -1 menjadi 1, maka itu berarti kita telah melewati resistensi di atas. Jika bendera tren terakhir berubah dari 1 menjadi -1 berarti support turun dan terbuka.

    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 lengkap untuk bagian 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)

img img

Lima, semua kode

Saya telah mengubah keseluruhan struktur kode. Selain itu, para pekerja juga akan mengintegrasikan perintah untuk melakukan pekerjaan lebih banyak ke dalam strategi tersebut. Berikut adalah kode lengkapnya.

'''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);

Link Kebijakan Publik https://www.fmz.com/strategy/200625

6. Uji dan kesimpulan

Kami memilih data dari hampir satu tahun untuk analisis ulang. Menggunakan kontrak kuartal okx dengan siklus 15 menit. Parameter yang ditetapkan adalah: Factor = 3 Pd adalah 45. Vol = 100 (untuk 100 pesanan) Hasil tahunan, sekitar 33%. Pada umumnya, mundurannya tidak terlalu besar. Di antara mereka, jatuhnya 312 menjadi yang paling berdampak pada sistem. Jika 312 tidak ada, hasilnya seharusnya lebih baik.

img

6 di bagian akhir

SuperTrend adalah sistem perdagangan yang sangat bagus.

Prinsip utama dari sistem SuperTrend adalah menggunakan strategi penembusan saluran ATR (mirip dengan saluran Kent) Namun, perubahan yang terjadi adalah karena penggunaan strategi penyempitan seperti yang dilakukan oleh para perampok Brin, atau prinsip Dongjian terbalik. "Selama beberapa hari, kami telah melihat bahwa ada banyak orang yang tidak bisa masuk ke pasar", katanya. Operasi untuk mencapai jalur terobosan berputar.

Saya telah memetakan up dn TrendUp TrendDn di TradingView. Ini akan membantu Anda memahami strategi ini dengan lebih baik.Saya tidak tahu.img

Selain itu, ada juga versi js di github. Saya tidak tahu banyak tentang js, tetapi menurut pernyataan if, sepertinya ada sedikit masalah. Alamatnya adalahhttps://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

Akhirnya, saya pergi dan mencari versi aslinya. Artikel ini diterbitkan pada 29.05.2013. Penulis: Rajandran R Kode C++ dipublikasikan di forum Mt4https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4Saya telah memahami apa yang dimaksud dengan C++, dan saya memiliki kesempatan untuk menulis ulang.

Saya berharap semua orang dapat belajar dari esensi dari ini. Tidak sulit!


Berkaitan

Lebih banyak

zdg4484YYDS!

Iglydz2010Jika Anda menggunakan strategi ini secara langsung di OK Bursa transaksi perlu bagaimana untuk terhubung ke bursa, yang kecil tidak akan Python, terlihat tidak jelas

BamsmenDi sini, jika gelombang 312 tidak terjadi, parameter harus memiliki ruang penyesuaian yang besar, karena supertrend terutama menangkap daftar tren. 312 tidak boleh dilewatkan.

Zhang tidak mauSaya tidak tahu bagaimana orang lain mengoptimalkannya, tetapi saya tidak tahu bagaimana orang lain mengoptimalkannya.

Wook gemuk.Ya, sudah selesai, terima kasih atas kontribusi Anda.

Wook gemuk.Trackback (most recent call last): File "", line 1473, in Run File "", line 8, in ImportError: No module named pandas

xunfeng91Penerjemah pine, menunggu

timer"Ketika saya melihat orang-orang di sekitar saya, saya melihat bahwa orang-orang di sekitar saya tidak memiliki kemampuan untuk mengontrol diri mereka sendiri.

Frank131419Saya akan mencoba menulis sebuah penerjemah pine suatu hari nanti. Semua bisa di python.

ArtinyaApakah kode untuk mesin iterasi dapat di-open source, saya ingin mengimplementasikan iterasi dan kemudian menggunakan svm untuk mencari parameter terbaik

DsaidasiSistem ini seolah-olah pernah menjadi strategi futures yang memiliki 10 hasil teratas.

Awan ringanHalo, tolong, PD adalah panjang ATR, bukan?

Mimpi kecilTerima kasih.

ovelsSaya berharap untuk berharap, Pine benar-benar tidak mengerti, dan sedikit tutorial.

khotbahIni berarti tidak ada paket pandas, sistem Anda mungkin membutuhkan pip untuk menginstal pandas

Ant_SkySaya ingin tahu bagaimana hal ini diatasi?

khotbahTerima kasih bos.

Mimpi kecilTunggu sebentar, terbuka.

LonelymanSaya ingin versi JS!

khotbahSaya tidak tahu apa yang harus saya lakukan.

Awan ringanBagus, terima kasih! Mq4 yang berhasil juga dihapus, terima kasih.

khotbahYa, benar sekali.

khotbahMaha Suci Allah!

Mimpi kecilSaya kebetulan juga menulis versi JS.

khotbahTerima kasih guru Dream Dream.