私の親友のVagoは,この指標を長い間観察し,それを定量化できるかどうか議論するために,元旦前に私に推薦しました. 遅延症が原因で,今までの間,この願いを叶えるのを遅らせてきました. 実際,最近,アルゴリズムに対する認識は急激に上昇しています. Pythonの翻訳機は,すべてpythonで作れる. この伝説の超トレンドラインについて,少しお話ししましょう.
CMC Markets 新世代のスマート取引システム
CMC Marketsの新しい世代のスマート取引システムでは,技術指標で
超トレンドライン調節を選択して, 図のように,上向きの信号,下向きの信号, 色の色,粗細さを自分の好みに応じて調整できます. 超トレンド指標の公式を理解する前に,ATRを理解することが必要である.超トレンドはATR値を指標値に計算するためである.
グラフの下には,これらの主要なアルゴリズムが紹介されています.
概して見ると,主にHL2 (k線平均価格) をn倍ATRの通路で描写している. しかし,文章は簡潔だった. 詳細なアルゴリズムはなかった. その後,最も牛のようなコミュニティ,Tradingviewを思い浮かべた. 驚くことではありません. 上にはあります.
グラフから見て,傾向が相応しい.しかし残念ながら,これはアラートのアラーム信号に過ぎません.
コードが長くないので,やってみよう.パインのコードはこちら.
超貿易という新しい戦略を FMZで作りました
この2つのパラメータを設定します.
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 = [
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
この文章の主な意味は,
この例では,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=
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)
私は,このプログラムに,すべてのコード構造を調整しました. また,多職に関する下令を戦略に組み込む. 詳細はこちらです
'''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
この調査では,約1年間のデータから, OKEXの四半期契約は15分周期を使用します. 設定されたパラメータは, 3 になります. これは,x=45です. vol=100 (毎回100枚を注文する) 年間収入は約33%である. 総じて,撤退はそれほど大きくなかった. この312号機が崩壊したことで,システムに大きな衝撃を与えました. 312がなければ,利益はもっと良くなるはずです.
スーパートレンドはとても良い取引システムです
スーパートレンドシステムの主な原理は,ATR通道突破戦略 (ケント通道に似ている) を採用することである.
しかし,その変化は主に,強盗のブリンクのような縮小戦略,すなわち逆道
このグラフは,TradingViewで,Up dn TrendUp TrendDnを区切ったものです. この戦略を理解するのに役立ちます.明らかに
また,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翻訳が早く登場することを期待している.
張無忌サイクルの種類やパラメータが悪かったので,他の方がどのように最適化したかわからない.
ウーが太ったありがとうございました.
ウーが太ったファイル"
クンフェン91パインの翻訳家,期待して
ティミュア文化は"頑固だ"としか言いようがない.
フランク131419
平均復元エンジンのコードがオープンソースであるかどうか,復元を実行してsvmで最適なパラメータを見つけたい.
言ったこのシステムは,前10位の収益率を上げていたフューチャー戦略だったようです.
軽い雲じゃあ,PD は ATR の長さですか? 例えば,ATR は 14 です. PD は 14 です.
発明者 量化 - 微かな夢賞賛する
卵子パインは本当に読めないし,教科書もほとんどない.
説教パンダをインストールするには,PIP を必要とします.
アント_スカイありがとうございました. ありがとうございました.
説教ありがとう,ボス
発明者 量化 - 微かな夢公開された.
ロンリーマンJS版をお願いします!
説教恩〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
軽い雲ありがとうございました! Mq4も取り除きました.ありがとう.
説教そうです 完全に正しい
説教讃えあれ!
発明者 量化 - 微かな夢JS版も作りました.
説教ありがとうございました.