ルダモメンタムトレンド取引戦略

EMA OBV
作成日: 2024-04-03 15:16:47 最終変更日: 2024-04-03 15:16:47
コピー: 0 クリック数: 700
1
フォロー
1617
フォロワー

ルダモメンタムトレンド取引戦略

概要

Rudaの動量トレンド取引戦略は,動量とトレンド指標に基づいた量的な取引戦略である.この戦略は,OBV (オンバランス・ボリューム),EMA (エクスポネンショナル・ムービング・アベरेज) とK線実体比率などの指標を使用して,買入と売却のタイミングを判断する.短期EMAに長期EMA,OBVの創出が高く,K線実体比率が設定値下げより大きいとき,戦略は,翌日の開場価格で買入する.価格が止損価格を下回るとか,閉場価格が短期EMAを下回ると,戦略は平仓する.

戦略原則

  1. 2つのEMA線を計算し,短期EMAのパラメータは5であり,長期EMAのパラメータは21である.短期EMAに長期EMAを穿戴すると,トレンドは上方とみなされ,逆にトレンドは下方である.
  2. OBV指標を計算すると,OBVが10日目の新高を記録したとき,多頭動力が強いと考えられる.
  3. K線実体比を計算し,実体比が設定値 ((デフォルト50%) よりも大きいとき,トレンドが確立したと考える.
  4. トレンドが強く,多方向の動きが強く,トレンドが確立されたとき,戦略は,次の日の開場価格で買い,その日の最低価格と開場価格の-1%の最小値であるストップ・ロスの価格である.
  5. 価格がストップ・ロスの値を下回ったとき,または閉盘価格が短期EMAを下回ったとき,戦略的平仓.

優位分析

  1. 傾向と動力の指標を組み合わせて,強な品種を捕まえることができます.
  2. 次の日の開盤価格での買入と動的ストップを用いると,部分的な偽ブレークを回避できます.
  3. ストップ・ダメージとストップ・コンディションは明確で,リスクはコントロールできます.

リスク分析

  1. トレンド・モナビリティ・インジケーターの遅れで,買い上げや早めの止損が発生する可能性があります.
  2. パラメータが固定され,自主性の欠如があり,異なる市場の状況でパフォーマンスは大きく異なる可能性があります.
  3. 単一市場と品種再評価,戦略の安定性および適用性については,さらなる検証が待っています.

最適化の方向

  1. トレンドと動力の指標のパラメータを最適化し,指標の感度と有効性を向上させる.
  2. 市場状況の判断を導入し,現在の市場特性の動態に応じてパラメータを調整する.
  3. 追跡範囲を拡大し,異なる市場と品種を対象としたテストを増やし,戦略の安定性を向上させる.
  4. ポジション管理とリスク管理モジュールを導入することを検討し,利益リスク比率を向上させる.

要約する

ルーダ動量トレンド取引戦略は,トレンドと動量指標の組み合わせによって,強力な品種とトレンドの機会を捕捉できる,シンプルで使いやすい量化取引戦略である.しかし,この戦略には,指標の遅れ,パラメータの固定などの問題がある.将来,指標のパラメータを最適化,自己適応メカニズムを導入し,反測範囲を拡大し,リスク管理を強化するなど,戦略の安定性と収益性を高めるために,戦略の最適化と改進を行うことができる.

ストラテジーソースコード
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
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/
// © lhcbenac

//@version=5
strategy('Ruda_Strategy', overlay=true , initial_capital=5000 , pyramiding = 3, commission_type =  strategy.commission.cash_per_contract , commission_value =  1 )

//
// 
////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                    Otimizações                     //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////
//
// 

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                 Codigo Operacional                 //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////
//
//
// Indica situação de Compra ou Venda

// Condição True or False 
YEAR_BT= input.int(1,title="Nº Anos ", group = "Backtest")

INPUT_ME1 = input.int(5,title="Momentum ", group = "RUDA")
INPUT_ME2 = input.int(21,title="Trend ", group = "RUDA")
INPUT_CORPO = input.int(50,title="CORPO ", group = "RUDA")/100



v_obv = ta.obv
v_med1 = ta.ema(close , INPUT_ME1)
v_med2 = ta.ema(close , INPUT_ME2)
valid_1 = v_med1 > v_med2 
valid_2 = v_obv >= ta.highest(v_obv[1], 10)
valid_3 = math.abs(close - open) / (high-low) > INPUT_CORPO
plot(v_med1)
plot(v_med2)

compra = valid_1 and valid_2 and  strategy.position_size == 0 and valid_3


var float v_minima_ref = na

dataInicio = timestamp(year(timenow) - YEAR_BT, month(timenow), dayofmonth(timenow), 00, 00)

// Variáveis globais
var float preco_entrada = na
var float preco_stop = na

if compra and time >= dataInicio and ta.change(time("D")) != 0 and ta.change(compra)  
    v_minima_ref := low
    preco_entrada := open
    preco_stop := math.min(low, open - 0.01 * open)
    strategy.entry("Compra", strategy.long , stop = preco_stop )
    if (not na(preco_entrada) and not na(preco_stop))
        label.new(x=bar_index, y= low * 0.9, text= "Dia: " + str.tostring(dayofmonth) + "\nPreço de Entrada: " + str.tostring(preco_entrada) + "\nPreço de Stop Loss: " + str.tostring(preco_stop), style=label.style_label_up, color=color.green)

    
    
// Lógica de saída
// Saída no stop loss
if (not na(preco_stop) and low < preco_stop and ta.change(low) < 0)
    strategy.close("Compra", comment="Saída no Stop")

// Saída no lucro
if (close < v_med1 and ta.change(close) < 0)
    strategy.close("Compra", comment="Saída na Media")

venda =( (not na(preco_stop) and low < preco_stop and ta.change(low) < 0) or (close < v_med1 and ta.change(close) < 0) ) and strategy.position_size > 0
codiff = compra ? 1 : venda ? -1 : na 
plotarrow(codiff, colorup=#00c3ff, colordown=#ff0062,title="Compra", maxheight=20, offset=0)