定量取引:ボリューム主導戦略


作成日: 2024-01-04 15:38:54 最終変更日: 2024-01-04 15:38:54
コピー: 1 クリック数: 612
1
フォロー
1621
フォロワー

定量取引:ボリューム主導戦略

概要

量能駆動策は,取引量の変化を分析し,市場参加者の感情の多空変化を判断する.それは,取引量を多頭取引量と空頭取引量に分け,それらの加重移動平均を計算し,多頭取引量が優勢であるときに多頭信号を生じ,空頭取引量が優勢であるときに空頭信号を生成する.

戦略原則

この戦略は,最初に,閉じる価格と開いた価格の関係に基づいて,各K線の取引量を,多頭取引量と空頭取引量に分けます.閉じる価格が開いた価格より大きい場合は,K線全体の取引量は多頭取引量です.閉じる価格が開いた価格より小さい場合は,そのK線の多頭取引量を, (最高価格-開いた価格) / (最高価格-最低価格) の比率で計算し,残りは空頭取引量です.

続いて,最後のn根K線の多頭取引量と空頭取引量の加重移動平均をそれぞれ計算する.多頭取引量の移動平均が空頭取引量の移動平均より大きく,両者の差が多頭取引量の比率で設定されたスレッジより大きい場合,多頭信号が生成される.空頭信号の生成規則は類似する.

また,取引量の平均値が設定され,収束領域を識別する.空っぽの取引量が目に見える差異がない場合は,現在収束状態にあることを提示する.

優位分析

  • 取引量情報を用いて市場参加者の感情を判断し,シグナルを生成する理論的根拠
  • 重要な信号を逃さないように,自動で整合区を認識する
  • 異なる取引品種と時間周期に対応するカスタマイズ可能なパラメータ
  • 多頭と空頭信号を単独で判断し,単面信号のみをフォローすることもできます

リスク分析

  • 取引量データを操作する可能性がある
  • デフォルトのパラメータは,すべての品種に適していない可能性があり,最適化が必要です.
  • 認識パラメータを正しく設定しない場合,信号が失われます
  • 短い周期で誤信号が生じる可能性

パラメータの最適化,他の指標の組み合わせなどの方法によってリスクを減らすことができます.

最適化の方向

  • 取引量を計算する方法を試す
  • EMA,SMMAなどの移動平均を試す
  • 平均を計算する周期パラメータを最適化
  • 整合された取引量差のパラメータを最適化
  • 他の技術指標と組み合わせたフィルタリング信号

要約する

量能駆動戦略は,取引量の多空分布を賢明に判断し,市場情緒やトレンドの変化を自動的に判断し,単独で使用することも,他の戦略の組み合わせと組み合わせることもできます.パラメータの最適化と指標の組み合わせは,戦略の安定性と収益性をさらに向上させることができます.

ストラテジーソースコード
/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 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/
// © Shuttle_Club
//@version=5

strategy('Volume fight strategy', default_qty_type=strategy.cash, default_qty_value=10000, currency='USD', commission_value=0.04, calc_on_order_fills=false, calc_on_every_tick=false, initial_capital=10000)

direction = input.string('ANY', 'Direction', options=['LONG', 'SHORT', 'ANY'], tooltip='Select the direction of trade.\n\nВыберите направление торговли.')
ma = input.int(11, 'Search_range', minval=1, tooltip='The range of estimation of the predominance of bullish or bearish volume (quantity bars). The smaller the TF, the higher the range value should be used to filter out false signals.\n\nДиапазон оценки преобладания бычьего или медвежьего объема (количество баров). Чем меньше ТФ, тем выше следует использовать значение диапазона, чтобы отфильтровать ложные сигналы.')
delta = input.float(15, 'Smoothing_for_flat,%', step=0.5, minval=0, tooltip='Smoothing to reduce false signals and highlight the flat zone. If you set the percentage to zero, the flat zones will not be highlighted, but there will be much more false signals, since the indicator becomes very sensitive when the smoothing percentage decreases.\n\nСглаживание для уменьшения ложных сигналов и выделения зоны флета. Если выставить процент равным нулю, то зоны флета выделяться не будут, но будет гораздо больше ложных сигналов, так как индикатор становится очень чувствительным при снижении процента сглаживания')
bgshow = input.bool(true, 'Show background zones', tooltip='Show the color background of the current trading zone.\n\nПоказывать цветовой фон текущей торговой зоны.')
all_signal_show = input.bool(false, 'Show each setup in zone', tooltip='Show every signals into trading zone.\n\nПоказывать каждый сигнал внутри торговой зоны.')

/////   CALCULATION
bull_vol = open < close ? volume : volume * (high - open) / (high - low)  //determine the share of bullish volume
bear_vol = open > close ? volume : volume * (open - low) / (high - low)  //determine the share of bearish volume
avg_bull_vol = ta.vwma(bull_vol, ma)  //determine vwma
avg_bear_vol = ta.vwma(bear_vol, ma)
diff_vol = ta.sma(avg_bull_vol / volume - 1 - (avg_bear_vol / volume - 1), ma)  //normalize and smooth the values
vol_flat = math.abs(avg_bull_vol + avg_bear_vol) / 2  //determine average value for calculation flat-filter

/////   SIGNALS
up = int(na), up := nz(up[1])
dn = int(na), dn := nz(dn[1])
bull = avg_bull_vol > avg_bear_vol and vol_flat / avg_bull_vol < 1 - delta / 100  //determine up zones
bear = avg_bull_vol < avg_bear_vol and vol_flat / avg_bear_vol < 1 - delta / 100  //determine dn zones

if bull
    up += 1, dn := 0
    dn
if bear
    dn += 1, up := 0
    up
if not bull and not bear and all_signal_show
    up := 0, dn := 0
    dn

/////   PLOTTING
plotshape(bull and up == 1, 'UP', location=location.bottom, style=shape.triangleup, color=color.new(color.green, 0), size=size.tiny)
plotshape(bear and dn == 1, 'DN', location=location.top, style=shape.triangledown, color=color.new(color.red, 0), size=size.tiny)
bgcolor(title='Trading zones', color=bgshow and avg_bull_vol > avg_bear_vol and vol_flat / avg_bull_vol < 1 - delta / 100 ? color.new(color.green, 85) : bgshow and avg_bull_vol < avg_bear_vol and vol_flat / avg_bear_vol < 1 - delta / 100 ? color.new(color.red, 85) : na)
plot(diff_vol, 'Volume difference', style=plot.style_area, color=avg_bull_vol > avg_bear_vol and vol_flat / avg_bull_vol < 1 - delta / 100 ? color.new(color.green, 0) : avg_bull_vol < avg_bear_vol and vol_flat / avg_bear_vol < 1 - delta / 100 ? color.new(color.red, 0) : color.new(color.gray, 50))

strategy.close('Short', comment='close', when=bull and up == 1)
strategy.close('Long', comment='close', when=bear and dn == 1)
strategy.entry('Long', strategy.long, when=direction != 'SHORT' and bull and up == 1)
strategy.entry('Short', strategy.short, when=direction != 'LONG' and bear and dn == 1)

if bull and up==1
    alert('Bullish movement! LONG trading zone', alert.freq_once_per_bar_close)
if bear and dn==1
    alert('Bearish movement! SHORT trading zone', alert.freq_once_per_bar_close)