SuperTrend V.1 - Sistem Garis Super Trend

Penulis:Khotbah, Dicipta: 2020-04-20 22:10:36, Dikemas kini: 2023-10-08 19:57:57

img

Satu, asal usul cerita

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.

2. Pengenalan sistem

CMC Markets, sistem perdagangan pintar generasi baharuDi sini terdapat satu artikel mengenai sistem ini.img

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.img

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.img

Dari segi grafik, ia lebih sesuai dengan trend. Tetapi sayangnya, ia hanya isyarat peringatan Alert.

3. Belajar kod sumber

Jika kodnya tidak terlalu panjang, mari kita cuba menerjemahkannya.imgKode pin lengkap adalah seperti di atas.

Empat, penukaran kod

Di sini, di FMZ, kami telah membina strategi baru yang dinamakan SuperTrade.img

Kemudian kita akan menetapkan dua parameter, Factor, Pd.img

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 = [time tab,open tab,high tab,low tab,close tab,volume tab,OpenInterest tab]Ia adalah untuk menukar huruf pertama dari "open", "high", "low", "close", dan "close" menjadi huruf kecil, untuk memudahkan penulisan kod kemudian daripada menulis huruf besar dan huruf kecil.

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= green if (Trend==1) else red Linecolor bermaksud garis hijau jika anda melihat lebih banyak, warna kosong jika anda melihat tidak banyak (terutamanya digunakan untuk pameran 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'

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)

img img

5. Semua kod

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

6. Ujian semula dan ringkasan

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.

img

6. Di hujung.

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.img

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...!


Berkaitan

Lebih lanjut

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 "", line 1473, in Run File "", line 8, in ImportError: No module named pandas

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?

Mimpi 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.

Mimpi 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!

Mimpi kecilSaya juga menulis versi JS.

KhotbahTerima kasih tuan guru.