chore: move indicator example files to docs folder
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# ============================================================
|
||||
# 双均线策略 (支持外部参数配置)
|
||||
# Dual Moving Average Strategy with External Parameters
|
||||
# ============================================================
|
||||
#
|
||||
# 使用方法:
|
||||
# 1. 在交易助手中选择此指标
|
||||
# 2. 根据不同币种配置不同参数
|
||||
# - BTC/USDT: sma_short=5, sma_long=10
|
||||
# - ETH/USDT: sma_short=5, sma_long=20
|
||||
#
|
||||
# ============================================================
|
||||
|
||||
# === 参数声明 (会在前端表单中显示) ===
|
||||
# @param sma_short int 14 短期均线周期
|
||||
# @param sma_long int 28 长期均线周期
|
||||
|
||||
# === 获取参数 (带默认值作为后备) ===
|
||||
sma_short_period = params.get('sma_short', 14)
|
||||
sma_long_period = params.get('sma_long', 28)
|
||||
|
||||
# === 指标信息 ===
|
||||
my_indicator_name = "双均线策略"
|
||||
my_indicator_description = f"短期{sma_short_period}/长期{sma_long_period}均线交叉策略"
|
||||
|
||||
# === 计算均线 ===
|
||||
df = df.copy()
|
||||
sma_short = df["close"].rolling(sma_short_period).mean()
|
||||
sma_long = df["close"].rolling(sma_long_period).mean()
|
||||
|
||||
# === 生成买卖信号 ===
|
||||
# 金叉:短期均线上穿长期均线
|
||||
buy = (sma_short > sma_long) & (sma_short.shift(1) <= sma_long.shift(1))
|
||||
# 死叉:短期均线下穿长期均线
|
||||
sell = (sma_short < sma_long) & (sma_short.shift(1) >= sma_long.shift(1))
|
||||
|
||||
df["buy"] = buy.fillna(False).astype(bool)
|
||||
df["sell"] = sell.fillna(False).astype(bool)
|
||||
|
||||
# === 买卖标记点 (用于K线图显示) ===
|
||||
buy_marks = [df["low"].iloc[i] * 0.995 if df["buy"].iloc[i] else None for i in range(len(df))]
|
||||
sell_marks = [df["high"].iloc[i] * 1.005 if df["sell"].iloc[i] else None for i in range(len(df))]
|
||||
|
||||
# === 图表输出配置 ===
|
||||
output = {
|
||||
"name": my_indicator_name,
|
||||
"plots": [
|
||||
{"name": f"SMA{sma_short_period}", "data": sma_short.tolist(), "color": "#FF9800", "overlay": True},
|
||||
{"name": f"SMA{sma_long_period}", "data": sma_long.tolist(), "color": "#3F51B5", "overlay": True}
|
||||
],
|
||||
"signals": [
|
||||
{"type": "buy", "text": "B", "data": buy_marks, "color": "#00E676"},
|
||||
{"type": "sell", "text": "S", "data": sell_marks, "color": "#FF5252"}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
# ============================================================
|
||||
# 多指标组合策略 (均线+RSI+MACD)
|
||||
# Multi-Indicator Composite Strategy
|
||||
# ============================================================
|
||||
#
|
||||
# 使用方法:
|
||||
# 1. 可配置均线周期、RSI阈值等参数
|
||||
# 2. 买入条件: RSI超卖 + MACD金叉 + 成交量放大
|
||||
# 3. 卖出条件: RSI超买 或 MACD死叉
|
||||
#
|
||||
# ============================================================
|
||||
|
||||
# === 参数声明 ===
|
||||
# @param sma_short int 10 短期均线周期
|
||||
# @param sma_long int 30 长期均线周期
|
||||
# @param rsi_period int 14 RSI周期
|
||||
# @param rsi_oversold int 30 RSI超卖阈值
|
||||
# @param rsi_overbought int 70 RSI超买阈值
|
||||
# @param use_macd bool True 是否使用MACD过滤
|
||||
# @param use_volume bool False 是否使用成交量过滤
|
||||
# @param volume_mult float 1.5 成交量放大倍数
|
||||
|
||||
# === 获取参数 ===
|
||||
sma_short_period = params.get('sma_short', 10)
|
||||
sma_long_period = params.get('sma_long', 30)
|
||||
rsi_period = params.get('rsi_period', 14)
|
||||
rsi_oversold = params.get('rsi_oversold', 30)
|
||||
rsi_overbought = params.get('rsi_overbought', 70)
|
||||
use_macd = params.get('use_macd', True)
|
||||
use_volume = params.get('use_volume', False)
|
||||
volume_mult = params.get('volume_mult', 1.5)
|
||||
|
||||
# === 指标信息 ===
|
||||
my_indicator_name = "多指标组合策略"
|
||||
my_indicator_description = f"SMA{sma_short_period}/{sma_long_period} + RSI{rsi_period}"
|
||||
|
||||
df = df.copy()
|
||||
|
||||
# === 计算均线 ===
|
||||
sma_short = df["close"].rolling(sma_short_period).mean()
|
||||
sma_long = df["close"].rolling(sma_long_period).mean()
|
||||
|
||||
# === 计算RSI ===
|
||||
delta = df["close"].diff()
|
||||
gain = delta.where(delta > 0, 0).rolling(window=rsi_period).mean()
|
||||
loss = (-delta.where(delta < 0, 0)).rolling(window=rsi_period).mean()
|
||||
rs = gain / loss
|
||||
rsi = 100 - (100 / (1 + rs))
|
||||
|
||||
# === 计算MACD ===
|
||||
exp1 = df["close"].ewm(span=12, adjust=False).mean()
|
||||
exp2 = df["close"].ewm(span=26, adjust=False).mean()
|
||||
macd = exp1 - exp2
|
||||
macd_signal = macd.ewm(span=9, adjust=False).mean()
|
||||
macd_hist = macd - macd_signal
|
||||
|
||||
# === 计算成交量均线 ===
|
||||
volume_ma = df["volume"].rolling(20).mean()
|
||||
|
||||
# === 生成信号条件 ===
|
||||
# 均线金叉
|
||||
ma_golden = (sma_short > sma_long) & (sma_short.shift(1) <= sma_long.shift(1))
|
||||
# 均线死叉
|
||||
ma_death = (sma_short < sma_long) & (sma_short.shift(1) >= sma_long.shift(1))
|
||||
# RSI超卖
|
||||
rsi_buy = rsi < rsi_oversold
|
||||
# RSI超买
|
||||
rsi_sell = rsi > rsi_overbought
|
||||
# MACD金叉
|
||||
macd_golden = (macd > macd_signal) & (macd.shift(1) <= macd_signal.shift(1))
|
||||
# MACD死叉
|
||||
macd_death = (macd < macd_signal) & (macd.shift(1) >= macd_signal.shift(1))
|
||||
# 成交量放大
|
||||
volume_up = df["volume"] > volume_ma * volume_mult
|
||||
|
||||
# === 综合买卖信号 ===
|
||||
buy = ma_golden | rsi_buy # 均线金叉 或 RSI超卖
|
||||
|
||||
if use_macd:
|
||||
buy = buy & (macd > macd_signal) # 需要MACD向上
|
||||
|
||||
if use_volume:
|
||||
buy = buy & volume_up # 需要成交量放大
|
||||
|
||||
sell = ma_death | rsi_sell # 均线死叉 或 RSI超买
|
||||
|
||||
if use_macd:
|
||||
sell = sell | macd_death # MACD死叉也卖出
|
||||
|
||||
df["buy"] = buy.fillna(False).astype(bool)
|
||||
df["sell"] = sell.fillna(False).astype(bool)
|
||||
|
||||
# === 买卖标记点 ===
|
||||
buy_marks = [df["low"].iloc[i] * 0.995 if df["buy"].iloc[i] else None for i in range(len(df))]
|
||||
sell_marks = [df["high"].iloc[i] * 1.005 if df["sell"].iloc[i] else None for i in range(len(df))]
|
||||
|
||||
# === 图表输出配置 ===
|
||||
output = {
|
||||
"name": my_indicator_name,
|
||||
"plots": [
|
||||
{"name": f"SMA{sma_short_period}", "data": sma_short.tolist(), "color": "#FF9800", "overlay": True},
|
||||
{"name": f"SMA{sma_long_period}", "data": sma_long.tolist(), "color": "#3F51B5", "overlay": True}
|
||||
],
|
||||
"signals": [
|
||||
{"type": "buy", "text": "B", "data": buy_marks, "color": "#00E676"},
|
||||
{"type": "sell", "text": "S", "data": sell_marks, "color": "#FF5252"}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user