連続的なキャンドルスタイク逆転戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月8日 13:56:39
タグ:

概要

この戦略は,クラシックな短期取引のアイデア - 連続した上昇するキャンドルスタイクの後ろにショートに行くことと,連続した下落するキャンドルスタイクの後ろに長時間行くことをベースにしています.具体的には,この戦略は,同じ色の連続したキャンドルスタイクが発生するかどうかを決定するためにキャンドルスタイクの体高と色を検出し,その後RVIインジケータを使用して逆転が起こるか判断します.全体として,これはキャンドルスタイクパターンとRVIインジケータを組み合わせて短期逆転取引を実施する戦略です.これは異常な短期価格行動が発生したときの逆転機会を捉えることを目的としています.

戦略の論理

この戦略の基本論理には,次のことが含まれます.

  1. キャンドルスタイルのボディの高さが最小値を超えているか確認し,マイナス上昇/下落の動きをフィルタリングします.

  2. 前回の2本のろうそくが同じ色なのか調べて下さい これは短期的な逆転を示唆します

  3. 現在のキャンドルスタイクが前2つと異なる色を持っている場合,取引信号が生成されます.つまり,2つの上昇キャンドルスタイクと1つの上昇キャンドルスタイクの後,長期化し,2つの上昇キャンドルスタイクと1つの上昇キャンドルスタイクの後,ショートになります.

  4. 取引に入ると,RVIラインとシグナルラインの交差点が出口ポジションを決定するために使用されます.RVIインジケーターは短期的な逆転を特定することができます.

  5. 要するにこの戦略は,キャンドルスタイクパターンとRVI指標を組み合わせて,短期間の平均逆転システムを作成し,短期間の異常価格行動から利益をもたらす逆転を捕捉します.

利点分析

この戦略の主な利点は以下の通りである.

  1. 短期的な価格異常を捉える.同じ色の連続したキャンドルスタイルは,反転に備えた異常をしばしば示します.

  2. RVIインジケーターは逆転決定を助け,より安定した信号のためにキャンドルスタイクパターンを補完します.

  3. 短期取引では比較的高い取引頻度.連続して同じ色のキャンドルスタイクが頻繁に発生し,豊富な取引機会を可能にします.

  4. 固定取引規模とストップ損失/利益の引き上げから生じる制御可能なリスク

  5. シンプルで明快なロジックで 簡単に理解し リアルタイムで取引できる

リスク分析

注意すべきリスクは:

  1. 短期の逆転は,シグナルが失敗する強いトレンドでは保証されません.

  2. RVIは特殊な市場条件で誤った信号を生成する可能性があります.

  3. ストップ・ロスの設定が不十分なら 大額の損失を起こす可能性があります

  4. 連続したキャンドルスタイク基準はあまりにも厳格です. N 期間に同じ色のキャンドルの必要パーセントに最適化することを検討してください.

  5. 固定取引サイズは,全体的なポジションリスクを制御することはできません.

オプティマイゼーションの方向性

戦略をさらに最適化する方法:

  1. 固定期間の代わりに 連続的なキャンドルスタイク論理を 統計を用いて最適化します

  2. 最適な組み合わせを見つけるために RVI パラメータを最適化します.

  3. 市場変動に基づいて,ストップ損失を加える.

  4. アカウント利用に基づいて位置サイズを追加します.

  5. システム安定性を向上させるために チャンネルやトレンドなどのフィルターを追加します

  6. パラメータ調整は異なる製品で

  7. 動的にパラメータを最適化するために 歴史データで機械学習をします

概要

概要すると,これはキャンドルスタイクパターンとRVIをベースとした典型的な短期間の平均逆転戦略である.利点もあるがリスクもある.パラメータと強度に関するさらなる最適化は,その安定性と収益性を向上させることができる.しかし,いかなる戦略も完全に損失をなくさない.トレーダーはリスク管理に規律的になければならない.


/*backtest
start: 2022-10-07 00:00:00
end: 2023-10-07 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//This is part of a series of strategies developed automatically by a online software. I cannot share the site url, which is not related to me in any way, because it is against the TV reules.
//
//This strategy was optimized for GBPUSD, timeframe 1D, fixed lots 0.1, initial balance 1000€
//LOGIC:
//- LONG ENTRY when previous candle is bear
//- LONG EXIT: RVI > signal line
//- SHORT ENTRY when previous candle is bull
//- SHORT EXIT: RVI <  signal line
//
//NOTE: I considered the open of actual candle instead of close otherwise there will be a back shift of 1 candle in pine script
//
//Take profit = no
//Stop loss = no

// strategy("Expert studio strategy 1 - GBPUSD", overlay=false, precision=6, initial_capital=1000,calc_on_every_tick=true, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=10000, currency=currency.EUR)

//INPUTS
src = input(close, "source")
min_body_height = input(42, "Minimum body height", type=input.float)
//bars_back=input(2, "Consecutive bars of same color")
rvi_period = input(55, "RVI period")

//CALCULATIONS_____________________________
//candle color
body_height = abs(open - close) / syminfo.mintick
body_color = open > close ? color.red : color.green

//da migliorare for i=0 to bars_back-1

//RVI -------- thanks to hecate
p = rvi_period

CO = close - open
HL = high - low

value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6

num = sum(value1, p)
denom = sum(value2, p)

RVI = denom != 0 ? num / denom : 0

RVIsig = (RVI + 2 * RVI[1] + 2 * RVI[2] + RVI[3]) / 6

plot(RVI, color=color.green, style=plot.style_line, linewidth=1)
plot(RVIsig, color=color.red, style=plot.style_line, linewidth=1)

//----------------------------------

longCondition = body_height[1] >= min_body_height and body_color[1] == color.red and 
   body_height[0] >= min_body_height and body_color[0] == color.red and 
   RVIsig > RVI
exitLong = RVI > RVIsig

shortCondition = body_height[1] >= min_body_height and body_color[1] == color.green and 
   body_height[0] >= min_body_height and body_color[0] == color.green and 
   RVIsig < RVI
exitShort = RVI < RVIsig

if longCondition and strategy.opentrades == 0
    strategy.entry("Long", strategy.long)

strategy.close("Long", when=exitLong)

if shortCondition and strategy.opentrades == 0
    strategy.entry("Short", strategy.short)

strategy.close("Short", when=exitShort)

// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2011, "Backtest Start Year")
testStartMonth = input(10, "Backtest Start Month")
testStartDay = input(7, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testStopHour = input(23, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = testPeriodSwitch == true ? testPeriod_1 : true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()





もっと