
この戦略の主な考えは,価格が指定された周期内の最低価格を破ったかどうかを検出し,破った場合,さらにそれを行い,価格が均線に戻るまで待つことです.これはトレンドフォローの類の戦略です.
この策略は,Pineスクリプトの ta.lowest を呼び出すことで,指定された周期内の最低値lowestLow を取得し,前回の周期の最低値prevLow と比較する.
最新周期の最低値 (lowestLow) が前期の最低値 (prevLow) よりも低ければ,多行信号を発せます.多行の後,指定周期内の最高値 (highestHigh) と比較することによって,最新の周期の最高値が前期の最高値より大きい場合は,平仓します.
この戦略は,取引頻度を制御するために,最低価格が1つ,2つ,3つまたは4つの前の最低価格を連続的に破る必要性というトリガー条件を選択することを許可します.
さらに,この戦略は,トレンドの変化を直感的に表示するために,最低価格平均線 (lowestLow) と最高価格平均線 (highestHigh) をグラフに描いています.
この戦略は,新低を突破した後に反転する傾向を捉え,高い勝利率を持つ.
取引頻度を制御するために,最低値を破る数を選択することができます.
平均線を描くことは,トレンドの変化点を直視的に判断するのに役立ちます.
戦略の論理はシンプルで明快で,実行が分かりやすい.
異なる株と時間周期を設定して最適化テストを行うことができます.
突破の偽突破は,トレンドの逆転点を特定できず,損失を招く可能性があります.
異なるパラメータの組み合わせの最適化配置をテストする必要があります.そうでなければ,取引頻度は高すぎたり低すぎたりする可能性があります.
異なる株式に合わせてパラメータを調整する必要があり,機械的な適用は不適宜である.
返信時間周期が不十分である場合,戦略が過度に適合する可能性があります.
突破後,価格がさらに低くなる可能性があり,リスクをコントロールするためにストップを設定する必要があります.
単一損失を制御するために,移動停止,追跡停止などの止損メカニズムを追加します.
突破数の最適化,取引頻度と信号品質のバランス
異なる株と時間周期のパラメータ最適化をテストする.
フィルタリング条件を増やして,不安定な市場で頻繁に取引を避ける.
トレンド指数を使うことを検討し,逆行を避ける.
異なる出場の出口信号をテストする.
この戦略は,最低価格の突破を監視することによって逆転の機会を捉えるため,典型的な突破回帰戦略の1つである. 優点は,単純で分かりやすいこと,取引頻度が制御可能であり,多種多様な株式に適用できる点である. しかし,ある種の偽突破リスクも存在し,補助条件を加え,フィルタリング最適化を行う必要があり,同時にリスクを制御することが非常に必要である. 徹底したテストと最適化により,この戦略は,安定した信頼性の高い定量化取引システムになる.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
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/
// © merovinh
//@version=5
strategy(title="Merovinh - Mean Reversion Lowest low",
overlay = true,
default_qty_type = strategy.percent_of_equity,
initial_capital = 10000,
default_qty_value = 10,
commission_type = strategy.commission.percent,
slippage = 1,
commission_value = 0.04)
GR_TIME = 'Time Period'
bars = input(9, title = "Minimum number of bars", tooltip = "The minimum number of bars before updating lowest low / highest high")
numberOfLows = input.string(defval='One', title='Number of broken lows', options=['One', 'Two', 'Three', 'Four'])
//Period
var prevLow = .0
var prevHigh = .0
var prevLow2 = .0
var prevLow3 = .0
var prevLow4 = .0
truetime = true
highestHigh = ta.highest(high, bars)
lowestLow = ta.lowest(low, bars)
if numberOfLows == 'One'
if truetime and prevLow > 0 and lowestLow < prevLow
strategy.entry('long', strategy.long)
if numberOfLows == 'Two'
if truetime and prevLow > 0 and lowestLow < prevLow and prevLow < prevLow2
strategy.entry('long', strategy.long)
if numberOfLows == 'Three'
if truetime and prevLow > 0 and lowestLow < prevLow and prevLow < prevLow2 and prevLow2 < prevLow3
strategy.entry('long', strategy.long)
if numberOfLows == 'Four'
if truetime and prevLow > 0 and lowestLow < prevLow and prevLow < prevLow2 and prevLow2 < prevLow3 and prevLow3 < prevLow4
strategy.entry('long', strategy.long)
if truetime and prevHigh > 0 and highestHigh > prevHigh
strategy.close('long')
if prevLow != lowestLow
prevLow4 := prevLow3
prevLow3 := prevLow2
prevLow2 := prevLow
prevLow := lowestLow
prevHigh := highestHigh
plot(lowestLow, color=color.green, linewidth=1, title="Lowest Low Line")
plot(highestHigh, color=color.green, linewidth=1, title="Highest High Line")