これは,ウォールストリート・チェーシング・リング・インデックスを使って,それと相関関係があると考えられるベンチマーク・暗号通貨の計算されたトレンドに基づいて,ターゲット暗号通貨に関する長/短/近信号を生成する自動化された取引戦略です.
デフォルトパラメータとベースシンボルとしてETH/USDTを使用すると,この戦略はDENT/USDT,BTT/USDT,FTT/USDT,DOT/USDTなどのシンボルで良好なバックテスト結果を示しています.ETHは暗号市場で非常に影響力があり,多くの暗号はETHの主要な動きに従う傾向があります.
注: デフォルトパラメータの戦略は4hのタイムフレームに意図されています.他のタイムフレームでは,異なるサポート長さを試してください.
WMAは,標準で長さ200のベースシンボルで計算されます.
WMAが上昇する時は長走し 落ちる時は短走する
長/短のTakeProfitと長/短のStopLossは計算されたパーセントであるため,0.05 = 5%など.また,TakeProfit/StopLossは,チャート
この戦略は,次の論理に基づいて,市場入出命令を使用します.
WMAが上昇し,ポジションがない場合,ロングエントリー
WMAが落ちて,ポジションがない場合,ショートエントリー
ロングポジションの利益 >=TakeProfitロングパーセント,ロングを閉じる
ショートポジションの利益 >=TakeProfitShortの割合で,ショートポジションを閉じる
ロングポジション損失 >=ストップ損失 ロングパーセント,ロングを閉じる
ショートポジションの損失 >=ストップ・ロスのショートポジションの割合でショートポジションを閉じる
TakeProfitとStopLossの価格は,ベースシンボルの価格変化に基づいてリアルタイムで更新されます.
この戦略は,パラメータを調整することで複数の暗号通貨で使用するために高度に適応できます.
ウォールストリートCCIを使用してトレンドを決定することで,騒音による間違った取引を回避できます.CCIはブレイクアウトに遅れをみせ,偽ブレイクアウト損失を避けるのに役立ちます.
TakeProfitとStopLossを組み込むことで,トレンドをフォローし,トレードごとに損失をコントロールできます.
手動の介入なしで完全に自動化された取引は24時間24分実行が可能になります
目標暗号価格がベース暗号から分離し,戦略の失敗につながるリスク.複数のベース暗号を使用して最適化し,最も高い相関性を選択することができます.
ポジションを停止する突然の変動のリスク. StopLoss % を調整したり,トライリングストップを使用することができます.
TakeProfit のリスク % は,十分なトレンドの利益を把握するには小さすぎる.トレンド追跡またはダイナミックなテイク・プロフィートを組み込むことができます.
誤ったブレイクアウトのリスク ストップ損失出口につながる. CCIパラメータを調整したり再入力ロジックを追加することができます.
複数のベース暗号における相関分析を使用し,単一のベース暗号リスクを減らすために指標を組み合わせます.
トレンドトラッキングを追加して,変動に基づいて TakeProfit/StopLoss を動的に調整します.
極端な動きが ポジションを停止するのを防ぐために 段階的なストップを追加します
ストップ・ロスの出口後,さらなるトレンドを逃さないように再エントリーロジックを追加します.
信号の有効性を向上させるため,CCIパラメータと設定を最適化する.
適応性を向上させるために各ターゲット暗号のパラメータを個別に最適化します
口座のサイズに基づいて ポジションのサイズを最適化します
この戦略は,一般的トレンドフォロー戦略である. 基本的なアイデアは,ウォールストリートCCIを使用してベンチマーク暗号のトレンド方向を決定し,それに応じてターゲット暗号を取引することです. この戦略にはいくつかの利点がありますが,注意すべきリスクもあります. 調節,トレンド追跡,リスク管理などのさらなる強化により安定性と収益性が向上します. 要するに,この戦略は自動化された体系的な暗号取引のためのアイデアと参照を提供します.
/*backtest start: 2022-10-25 00:00:00 end: 2023-10-31 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © levieux //@version=5 strategy(title='Correlation Strategy', shorttitle='Correlation Strategy', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1) supportLength = input.int(200, minval=1, title='Support Length') supportSymbol = input('BTC_USDT:swap', title='Correlated Symbol') supportSource = input(hlc3, title='Price Source') takeprofitLong = input.float(0.2, 'Take Profit Long', step=0.01) takeprofitShort = input.float(0.15, 'Take Profit Short', step=0.01) stoplossLong = input.float(0.1, 'Stop Loss Long', step=0.01) stoplossShort = input.float(0.04, 'Stop Loss Short', step=0.01) start = input(defval = timestamp("01 Jan 2016 00:00 +0000"), title = "Start Time") end = input(defval = timestamp("31 Dec 2050 23:59 +0000"), title = "End Time") supportTicker = request.security(supportSymbol, timeframe.period, supportSource, lookahead=barmerge.lookahead_off) //input(close, title="Source") supportLine = ta.wma(supportTicker, supportLength) window() => true if not window() strategy.cancel_all() supportLongPrice = close supportShortPrice = close if strategy.position_size > 0 supportLongPrice := supportLongPrice[1] if strategy.position_size < 0 supportShortPrice := supportShortPrice[1] longCondition = ta.rising(supportLine, 5) and window() and strategy.position_size <= 0 shortCondition = ta.falling(supportLine, 5) and window() and window() and strategy.position_size > 0 takeprofitLongCondition = takeprofitLong > 0 and window() and strategy.position_size > 0 and supportTicker > supportLongPrice * (1 + takeprofitLong) stoplossLongCondition = stoplossLong > 0 and window() and strategy.position_size > 0 and supportTicker < supportLongPrice * (1 - stoplossLong) takeprofitShortCondition = takeprofitShort > 0 and window() and strategy.position_size < 0 and supportTicker > supportShortPrice * (1 + takeprofitShort) stoplossShortCondition = stoplossShort > 0 and window() and strategy.position_size < 0 and supportTicker < supportShortPrice * (1 - stoplossShort) if longCondition strategy.entry('Long', strategy.long) supportLongPrice := supportTicker if shortCondition strategy.entry('Short', strategy.short) supportShortPrice := supportTicker if takeprofitLongCondition strategy.close('Long') if stoplossLongCondition strategy.close('Long') if takeprofitShortCondition strategy.close('Short') if stoplossShortCondition strategy.close('Short') /////////////////// // MONTHLY TABLE // new_month = month(time) != month(time[1]) new_year = year(time) != year(time[1]) eq = strategy.equity bar_pnl = eq / eq[1] - 1 bar_bh = (close-close[1])/close[1] cur_month_pnl = 0.0 cur_year_pnl = 0.0 cur_month_bh = 0.0 cur_year_bh = 0.0 // Current Monthly P&L cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 cur_month_bh := new_month ? 0.0 : (1 + cur_month_bh[1]) * (1 + bar_bh) - 1 // Current Yearly P&L cur_year_pnl := new_year ? 0.0 : (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1 cur_year_bh := new_year ? 0.0 : (1 + cur_year_bh[1]) * (1 + bar_bh) - 1 // Arrays to store Yearly and Monthly P&Ls var month_pnl = array.new_float(0) var month_time = array.new_int(0) var month_bh = array.new_float(0) var year_pnl = array.new_float(0) var year_time = array.new_int(0) var year_bh = array.new_float(0) end_time = false end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory if (not na(cur_month_pnl[1]) and (new_month or end_time)) if (end_time[1]) array.pop(month_pnl) array.pop(month_time) array.push(month_pnl , cur_month_pnl[1]) array.push(month_time, time[1]) array.push(month_bh , cur_month_bh[1]) if (not na(cur_year_pnl[1]) and (new_year or end_time)) if (end_time[1]) array.pop(year_pnl) array.pop(year_time) array.push(year_pnl , cur_year_pnl[1]) array.push(year_time, time[1]) array.push(year_bh , cur_year_bh[1]) // Monthly P&L Table var monthly_table = table(na) getCellColor(pnl, bh) => if pnl > 0 if bh < 0 or pnl > 2 * bh color.new(color.green, transp = 20) else if pnl > bh color.new(color.green, transp = 50) else color.new(color.green, transp = 80) else if bh > 0 or pnl < 2 * bh color.new(color.red, transp = 20) else if pnl < bh color.new(color.red, transp = 50) else color.new(color.red, transp = 80) if end_time monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1) table.cell(monthly_table, 0, 0, "", bgcolor = #cccccc) table.cell(monthly_table, 1, 0, "Jan", bgcolor = #cccccc) table.cell(monthly_table, 2, 0, "Feb", bgcolor = #cccccc) table.cell(monthly_table, 3, 0, "Mar", bgcolor = #cccccc) table.cell(monthly_table, 4, 0, "Apr", bgcolor = #cccccc) table.cell(monthly_table, 5, 0, "May", bgcolor = #cccccc) table.cell(monthly_table, 6, 0, "Jun", bgcolor = #cccccc) table.cell(monthly_table, 7, 0, "Jul", bgcolor = #cccccc) table.cell(monthly_table, 8, 0, "Aug", bgcolor = #cccccc) table.cell(monthly_table, 9, 0, "Sep", bgcolor = #cccccc) table.cell(monthly_table, 10, 0, "Oct", bgcolor = #cccccc) table.cell(monthly_table, 11, 0, "Nov", bgcolor = #cccccc) table.cell(monthly_table, 12, 0, "Dec", bgcolor = #cccccc) table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999) for yi = 0 to array.size(year_pnl) - 1 table.cell(monthly_table, 0, yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc) y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi)) table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100)) + " (" + str.tostring(math.round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color) for mi = 0 to array.size(month_time) - 1 m_row = year(array.get(month_time, mi)) - year(array.get(year_time, 0)) + 1 m_col = month(array.get(month_time, mi)) m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi)) table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100)) + " (" + str.tostring(math.round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)