利沃莫尔多头关键价位突破量化交易策略是一种基于Jesse Livermore交易哲学的系统化交易方法。该策略通过识别市场的主要趋势、自然回调和次级回调,精确捕捉价格突破关键支撑和阻力位的时机。策略核心是使用百分比或ATR指标定义的关键枢轴点来确定趋势转换,并在确认主要上升趋势时建立多头仓位,在确认主要下降趋势时平仓,实现对市场波动的智能跟踪和资金管理。
该策略基于Jesse Livermore的交易理念,将市场趋势细分为六种状态:主要上升趋势(MAIN_UP)、主要下降趋势(MAIN_DOWN)、自然反弹(NATURAL_REBOUND)、自然回调(NATURAL_RETRACEMENT)、次级反弹(SECONDARY_REBOUND)和次级回调(SECONDARY_RETRACEMENT)。
策略通过计算当前价格与历史关键点位的关系,结合预设的枢轴距离比率(可以是固定百分比或基于ATR动态计算)来确定市场所处的趋势状态。具体逻辑如下:
在主要上升趋势中,当价格持续上涨或回调幅度不超过主要枢轴乘数定义的阈值时,维持上升趋势状态并更新最高点;当回调超过阈值时,转为自然回调状态。
在主要下降趋势中,当价格持续下跌或反弹幅度不超过主要枢轴乘数定义的阈值时,维持下降趋势状态并更新最低点;当反弹超过阈值时,转为自然反弹状态。
在自然反弹/回调和次级反弹/回调之间,根据价格与历史高低点的关系以及预设的主要和次要枢轴乘数判断趋势转换。
交易信号生成逻辑是:当趋势连续两个周期确认为主要上升趋势时,建立多头仓位;当趋势连续两个周期确认为主要下降趋势时,平仓离场。
系统化趋势判断:策略将Livermore的交易理念系统化,通过明确的数学模型定义不同趋势状态,消除了主观判断带来的不确定性。
适应性强:通过参数化的枢轴距离百分比和ATR选项,策略可以适应不同市场环境和波动率条件,增强了策略的灵活性。
确认机制:策略要求趋势连续两个周期确认才执行交易,有效减少了假突破带来的亏损。
资金管理集成:策略使用账户权益百分比进行仓位管理,确保在不同账户规模下都能保持一致的风险敞口。
长期趋势捕捉:通过区分主要趋势和次级趋势,策略能有效捕捉大周期趋势,避免被短期噪音干扰。
滞后性风险:由于策略需要确认两个周期的趋势状态才执行交易,可能在趋势初期错过部分利润,或在趋势反转时承受更大回撤。
参数敏感性:策略表现高度依赖于枢轴距离百分比、主要和次要枢轴乘数等参数设置,不当的参数可能导致过度交易或错过重要信号。
单向交易限制:策略设计为仅执行多头交易,在长期下跌市场中可能面临较长时间的资金闲置,影响整体收益率。
趋势定义复杂性:六种趋势状态之间的转换逻辑较为复杂,在市场波动剧烈时可能导致频繁的状态切换,增加交易成本。
缺乏止损机制:代码中没有明确的止损设置,在市场急剧反转时可能面临较大损失。
增加止损机制:引入基于ATR或固定百分比的止损策略,在趋势反转前控制单笔交易风险。具体实现可以在建立多头仓位的同时设置止损价位,保护资金安全。
优化趋势确认机制:当前策略需要两个连续周期确认趋势,可以考虑结合成交量或其他技术指标进行趋势确认,提高信号质量。
增加做空功能:扩展策略以支持空头交易,充分利用下降趋势中的获利机会,提高策略的全天候性能。
动态参数调整:引入基于历史波动率或市场状态的动态参数调整机制,使策略能更好地适应不同市场环境。
增加过滤条件:结合市场周期、季节性或基本面过滤器,避免在不利条件下开仓,提高胜率。
分批建仓和平仓:实现分批进出场机制,降低时机选择风险,优化资金利用效率。
利沃莫尔多头关键价位突破量化交易策略成功地将Jesse Livermore的经典交易理念转化为可量化执行的算法系统。通过精确定义市场的六种趋势状态及其转换条件,策略能够有效识别和跟踪主要上升趋势,在确认趋势的基础上执行多头交易。
虽然策略具有系统化、适应性强和内置确认机制等优势,但也面临滞后性、参数敏感性和缺乏止损等风险。通过增加止损机制、优化趋势确认、扩展做空功能、实现动态参数调整等方向的优化,可以进一步提升策略的稳健性和盈利能力。
总体而言,该策略为寻求系统化实现Livermore交易哲学的投资者提供了一个坚实的框架,通过适当的参数调整和风险管理优化,有望在实际交易中取得稳定的长期收益。
/*backtest
start: 2024-07-16 00:00:00
end: 2025-07-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":200000}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bozhang_ox
//@version=6
strategy("Trading strategy Jesse Livermore", overlay=true, fill_orders_on_standard_ohlc = true, initial_capital = 1000000, default_qty_type=strategy.percent_of_equity, default_qty_value = 95)
// Input parameters
pivot_distance_percentage = input.float(0.5, title="Pivot Distance Percentage")
major_pivot_multiplier = input.int(6, title="Major Pivot Multiplier")
minor_pivot_multiplier = input.int(3, title="Minor Pivot Multiplier")
use_atr_pivot_distance = input.bool(false, title="Use ATR for Pivot Distance")
atr_period = input.int(14, title="ATR Period")
atr_pivot_multiplier = input.float(1, title="ATR Pivot Multiplier")
// Calculate ATR
atr = ta.atr(atr_period)
// Helper function to calculate pivot distance ratio
pivot_distance_ratio = use_atr_pivot_distance ? (atr * atr_pivot_multiplier) / close : pivot_distance_percentage / 100
// Trend states
NONE = 0
MAIN_UP = 6
MAIN_DOWN = 1
NATURAL_REBOUND = 2
NATURAL_RETRACEMENT = 5
SECONDARY_REBOUND = 4
SECONDARY_RETRACEMENT = 3
// Variables to track trends
var float main_up_max = na
var float main_down_min = na
var float natural_rebound_max = na
var float natural_retracement_min = na
var int trend = NONE
var int prev_trend = NONE
var int prev_prev_trend = NONE
// Initialize variables
if na(main_up_max)
main_up_max := -1e10
if na(main_down_min)
main_down_min := 1e10
if na(natural_rebound_max)
natural_rebound_max := -1e10
if na(natural_retracement_min)
natural_retracement_min := 1e10
// Trend logic
if trend == MAIN_UP
if close > close[1] or (main_up_max - close < close[1] * pivot_distance_ratio * major_pivot_multiplier)
trend := MAIN_UP
main_up_max := math.max(main_up_max, close)
else
trend := NATURAL_RETRACEMENT
natural_retracement_min := close
else if trend == MAIN_DOWN
if close < close[1] or (close - main_down_min < close[1] * pivot_distance_ratio * major_pivot_multiplier)
trend := MAIN_DOWN
main_down_min := math.min(main_down_min, close)
else
trend := NATURAL_REBOUND
natural_rebound_max := close
else if trend == NATURAL_REBOUND
if close > close[1]
if close <= main_up_max
if close - natural_rebound_max <= close[1] * pivot_distance_ratio * minor_pivot_multiplier
trend := NATURAL_REBOUND
natural_rebound_max := math.max(natural_rebound_max, close)
else
trend := MAIN_UP
main_up_max := close
else
trend := MAIN_UP
main_up_max := close
else
if natural_rebound_max - close <= close[1] * pivot_distance_ratio * major_pivot_multiplier
trend := NATURAL_REBOUND
else if close < natural_retracement_min
trend := NATURAL_RETRACEMENT
natural_retracement_min := close
else
trend := SECONDARY_RETRACEMENT
else if trend == NATURAL_RETRACEMENT
if close < close[1]
if close >= main_down_min
if natural_retracement_min - close <= close[1] * pivot_distance_ratio * minor_pivot_multiplier
trend := NATURAL_RETRACEMENT
natural_retracement_min := math.min(natural_retracement_min, close)
else
trend := MAIN_DOWN
main_down_min := close
else
trend := MAIN_DOWN
main_down_min := close
else
if close - natural_retracement_min <= close[1] * pivot_distance_ratio * major_pivot_multiplier
trend := NATURAL_RETRACEMENT
else if close > natural_rebound_max
trend := NATURAL_REBOUND
natural_rebound_max := close
else
trend := SECONDARY_REBOUND
else if trend == SECONDARY_REBOUND
if close <= natural_rebound_max and close >= natural_retracement_min
trend := SECONDARY_REBOUND
else if close < natural_retracement_min
trend := NATURAL_RETRACEMENT
natural_retracement_min := close
else
trend := NATURAL_REBOUND
natural_rebound_max := close
else if trend == SECONDARY_RETRACEMENT
if close >= natural_retracement_min and close <= natural_rebound_max
trend := SECONDARY_RETRACEMENT
else if close > natural_rebound_max
trend := NATURAL_REBOUND
natural_rebound_max := close
else
trend := NATURAL_RETRACEMENT
natural_retracement_min := close
else
if close > close[1]
trend := MAIN_UP
main_up_max := close
else
trend := MAIN_DOWN
main_down_min := close
// Execute trades based on trend changes
if prev_trend != prev_prev_trend
if trend == MAIN_UP and prev_trend == MAIN_UP
strategy.entry("Long Entry", strategy.long, comment="Long Entry")
else if trend == MAIN_DOWN and prev_trend == MAIN_DOWN
strategy.close("Long Entry", qty_percent = 100, comment = "Long Close")
// Update previous trend
prev_prev_trend := prev_trend
prev_trend := trend