資源の読み込みに... 荷物...

スーパートレンド V.1 - スーパートレンドラインシステム

作者: リン・ハーン説教, 作成日:2020年4月20日 22時10分36秒 更新日:2023年10月8日 19時57分57秒

img

物語の起源

私の親友のVagoは,この指標を長い間観察し,それを定量化できるかどうか議論するために,元旦前に私に推薦しました. 遅延症が原因で,今までの間,この願いを叶えるのを遅らせてきました. 実際,最近,アルゴリズムに対する認識は急激に上昇しています. Pythonの翻訳機は,すべてpythonで作れる. この伝説の超トレンドラインについて,少しお話ししましょう.

2 システム紹介

CMC Markets 新世代のスマート取引システム スーパートレンドライン (Supertrend)このシステムについての記事はこちらです.img

CMC Marketsの新しい世代のスマート取引システムでは,技術指標で超トレンドライン調節を選択して, 図のように,上向きの信号,下向きの信号,色の色,粗細さを自分の好みに応じて調整できます. 超トレンド指標の公式を理解する前に,ATRを理解することが必要である.超トレンドはATR値を指標値に計算するためである.

グラフの下には,これらの主要なアルゴリズムが紹介されています.img

概して見ると,主にHL2 (k線平均価格) をn倍ATRの通路で描写している. しかし,文章は簡潔だった. 詳細なアルゴリズムはなかった. その後,最も牛のようなコミュニティ,Tradingviewを思い浮かべた. 驚くことではありません. 上にはあります.img

グラフから見て,傾向が相応しい.しかし残念ながら,これはアラートのアラーム信号に過ぎません.

3 ソースコードを学ぶ

コードが長くないので,やってみよう.imgパインのコードはこちら.

4 コード変換

超貿易という新しい戦略を FMZで作りましたimg

この2つのパラメータを設定します.img

Pythonの高度なデータ拡張パックを使用します. Pythonの高度なデータ拡張パックを使用します. Pythonの高度なデータ拡張パックを使用しますパンダ

昼食の時,FMZがこの図書館を支えているのかと先生に尋ねました. ダン・ドリームの先生は本当にすごい.

1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. サイクル doTicker を設定して, 15 分間 1 回検知します.15分間の周期でコードを実行します. キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (doTicker) で書き込み,キーワードは,doTicker (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)
        

戻り線のOHCLVを取ろうとしているので,GetRecords (,) を使います M15 = pd.DataFrame ((records) に入力します. M15.columns = [timeタグ,openタグ,highタグ,lowタグ,closeタグ,volumeタグ,OpenInterestタグ]基本的には,open,high,low,closeの最初の文字を小文字に書き換えることで,後にコードを書くのに,大文字を入れずに小文字を書き換える.

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

7 数値セットに列を追加します.

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

8.接着我们来计算ATR変数の長さを入力する為の ATR の計算では,Pd の値を取ります.

この例では,A/Tの真波幅均等値を計算するアルゴリズムのステップは以下のとおりです. TR: MAX (MAX) (HIGH-LOW),ABS (REF) (CLOSE,1) (HIGH)),ABS (REF) (CLOSE,1) (LOW)); ATR: RMA (TR,N)

この値が TR の値です. 1,現在の取引日の最高価格と最低価格の波長 HIGH-LOW 2、前日の取引日の閉じる価格と,その取引日の最高価格の間の波長 REF ((CLOSE,1) -HIGH) 3、前日の取引日の閉じる価格と,その取引日の最低価格との波長 REF ((CLOSE,1) -LOW) この例では,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (REF) は,ABS (

Pythonで計算する

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

前の行のデータからcloseを取るために,prev_close を設定します.つまり,close を右に移動して,1 を新しいパラメータにします.

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

次に,中間変数を定義します TR の3つの対比値の配列を記録します。 (HIGH-LOW) (high-prev_close) (low-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: RMA (TR,N) は,RMAのアルゴリズムが固定値変数のEMAアルゴリズムであることを確認します. N は輸入する変数で,ATR のデフォルトパラグラムは 14 です. ここで,alpha=length の分数を輸入します.

===

計算が完了すると,完全なATR計算は以下の通りです.

    #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'])

ポイントは,x=2です. 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

この文章の主な意味は, 値の場合は, (下) トレンドアップ = max (アップ,トレンドアップ[1]) ダウン段階にある場合, (上線) TrendDown=min (Dn,TrendDown[1])ATRの価値は,ある傾向において,盗難ブリーンの戦略のような技術を使用している. 経路の反対側を絞り続ける

この例では,TrendUpとTrendDownの各計算は自己リターニングを要します. ステップごとに,次のステップを自分で計算する. データの集合を回転的に回転させることです.

データの集合に新しいフィールド,TrendUp,TrendDown,Trend,linecolor を構築し,最初の値を与えます. 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)

フォースループを有効にする ループでpythonの第3操作を使用する

    for x in range(len(M15)):

トレンドアップを計算するトレンドアップ = MAX ((Up,TrendUp[-1]) if close [-1]> トレンドアップ[-1] else Up 基本的には,前回のclose>前回のTrendUpで,最大値のアップアップと前回のTrendUpが成立した場合,アップアップは成立せず,現在のTrendUpに転送されます.

        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]) 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]

制御方向を計算するフラグです.トレンド= 1 if (close > TrendDown[-1]) else (x) x = -1 もし (close< TrendUp[-1]) でなければ トレンド[-1]

閉じる価格>前回のトレンドダウンで1 (さらに見る) を取ると,xが成立しません. 閉じる価格 < 前回のトレンドアップなら -1 (空白) は成立しません. 画像言語への翻訳は,上線変換フラグを突破し,下線変換フラグを突破し,空白に,他の時間は変化しません.

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

TslとLinecolorを計算するTsl= rendUp if (トレンド==1) else トレンドダウン Tsl は,画像上でスーパートレンドの値を表示するために使用されます. これは,より多くの見るときに,グラフにコースをマークし,空を見るときに,グラフにコースをマークすることを意味します. linecolor= if (Trend==1) else linecolorの意味は,もっと見るなら緑色の線,空を見れば空色の線である (主に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'

このコードの23~30行は,主にプロットマッピングです.

そして最後に,2行目のコードがあります.TradingViewでは,Flagを逆転させると信号が表示されます. 条件文をpythonに変換します. 逆の傾向は,前回のトレンドフラグが -1 から 1 になった場合, 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)

img img

5 すべてのコード

私は,このプログラムに,すべてのコード構造を調整しました. また,多職に関する下令を戦略に組み込む. 詳細はこちらです

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

公開戦略リンク http://www.fmz.com/strategy/200625

6 復習と概要

この調査では,約1年間のデータから, OKEXの四半期契約は15分周期を使用します. 設定されたパラメータは, 3 になります. これは,x=45です. vol=100 (毎回100枚を注文する) 年間収入は約33%である. 総じて,撤退はそれほど大きくなかった. この312号機が崩壊したことで,システムに大きな衝撃を与えました. 312がなければ,利益はもっと良くなるはずです.

img

6つ目は,最後に書いてある

スーパートレンドはとても良い取引システムです

スーパートレンドシステムの主な原理は,ATR通道突破戦略 (ケント通道に似ている) を採用することである. しかし,その変化は主に,強盗のブリンクのような縮小戦略,すなわち逆道原理が用いられていることにある. 市場運営における上下通路が狭くなっている. 経路突破回転を達成するための操作である. (経路突破後,上下線が元の値に戻す)

このグラフは,TradingViewで,Up dn TrendUp TrendDnを区切ったものです. この戦略を理解するのに役立ちます.明らかにimg

また,githubにもjsのバージョンがあります。jsはあまり理解していないが,if文からするとちょっと問題があるようです。 アドレスhttps://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

ブログの記事に載っているのは,この記事です. 2013年05月29日に掲載されました. この記事へのトラックバック一覧です. C++コードはMt4フォーラムで公開されていますhttps://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4C++の意味をよく理解し,また書き直す機会がありました.

この記事へのトラックバック一覧です. 困った!


関連性

もっと

ZDG4484YYDS! (YYDS) はい!

イグリッドZ2010直接この戦略を使用すると,OKの取引は,どのように取引所に接続する必要があります,小白の1は,ピトンのない,見えません

バムマン超トレンドは主にトレンドリストを把握するため,312は見逃すべきではない.また,lzのpine翻訳が早く登場することを期待している.

張無忌サイクルの種類やパラメータが悪かったので,他の方がどのように最適化したかわからない.

ウーが太ったありがとうございました.

ウーが太ったファイル"", line 1473, in Run File "", line 8, in ImportError: No module named pandas ファイル"", line 1473, in Run File "", line 8, in ファイル"""""""""

クンフェン91パインの翻訳家,期待して

ティミュア文化は"頑固だ"としか言いようがない.

フランク131419は,ある日パインの翻訳機を書いてしまう. すべてはpythonで.

平均復元エンジンのコードがオープンソースであるかどうか,復元を実行してsvmで最適なパラメータを見つけたい.

言ったこのシステムは,前10位の収益率を上げていたフューチャー戦略だったようです.

軽い雲じゃあ,PD は ATR の長さですか? 例えば,ATR は 14 です. PD は 14 です.

発明者 量化 - 微かな夢賞賛する

卵子パインは本当に読めないし,教科書もほとんどない.

説教パンダをインストールするには,PIP を必要とします.

アント_スカイありがとうございました. ありがとうございました.

説教ありがとう,ボス

発明者 量化 - 微かな夢公開された.

ロンリーマンJS版をお願いします!

説教恩〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

軽い雲ありがとうございました! Mq4も取り除きました.ありがとう.

説教そうです 完全に正しい

説教讃えあれ!

発明者 量化 - 微かな夢JS版も作りました.

説教ありがとうございました.