如何编写用于 OKX 的马丁格尔合约交易算法(基于 Freqtrade)

·

马丁格尔策略被称为“逆人性翻倍加仓法”,在高波动、多空皆可盈利的永续合约市场尤为常见。但若想把它顺利跑在 OKX 永续合约 上,就需要针对 Freqtrade 框架做一次深度定制。下文从 0 到 1 拆解全流程:配置步骤、策略核心、风控模块、回测演练及常见问题。读完即可动手写代码,并通过蒙特卡洛测试再上实盘。

一、先搞定 OKX 端:完整配置示范

关键词示例:OKX 永续合约、隔离保证金、对冲模式、API 密钥、ISK 头寸管理

要告诉 Freqtrade “交易的是 OKX 永续”,必须在 config.json 中写明以下信息:

{
  "trading_mode": "futures",
  "margin_mode": "isolated",
  "liquidation_buffer": 0.05,
  "exchange": {
    "name": "okx",
    "key": "你的_api_key",
    "secret": "你的_secret",
    "password": "你的_passphrase",
    "pair_whitelist": ["BTC/USDT:USDT"],
    "_ft_has_params": {
      "position_mode": "hedge"
    }
  },
  "fee": 0.0004   /* 0.02% maker + 0.02% taker */
}

小贴士
liquidation_buffer=0.05 表示当账户权益距离爆仓只剩 5% 时强制降杠杆或平仓;pair_whitelist/USDT:USDT 这种 永续合约符号 写法。

二、策略框架拆解:马丁格尔公式化为代码

关键词示例:MartingaleStrategy、加仓乘数、最大加仓次数、布林带下轨、动态杠杆

本策略继承 Freqtrade 的 IStrategy,核心思想:价格每下跌一次,就按martingale_multiplier倍数加仓,最多连加max_martingale_steps。关键函数注释如下:

1. 入参定义

martingale_multiplier = DecimalParameter(1.5, 3.0, default=2.0, space='buy')
max_martingale_steps   = IntParameter(3, 10, default=5, space='buy')

2. 首次开仓信号

利用布林带下轨即可:

dataframe.loc[
    (qtpylib.crossed_below(dataframe['close'], dataframe['bb_lower'])),
 'enter_long'] = 1

3. 加仓条件

if current_trade and current_trade.is_open and current_trade.current_profit < 0:
    count = self.trade_count.get(pair, 0)
    if count < self.max_martingale_steps.value:
        dataframe['enter_long'] = 1

4. 仓位大小计算

def adjust_trade_position(self, trade, ..., **kwargs):
    if current_profit < -0.03:      # -3% 触发
        new_stake = trade.stake_amount * self.martingale_multiplier.value
        return new_stake

5. 动态杠杆+止损

杠杆 min(proposed × multiplier^count, 10),止损线 -0.05 - 0.01 * count,两者都随加仓次数自动加码、收紧。

三、风控“鹰眼”:如何防止穿仓

关键词示例:强平保护、动态止损、紧急关停、账户级风控

  1. 单笔档位上限:执行 self.trade_count[pair] 以后,如若 ≥ max_martingale_steps,直接 return 'max_martingale_steps_exceeded' 强制平光。
  2. 全局熔断:任意时刻 total_profit < -0.20 就触发 emergency_stop,私聊机器人或电报报警。
  3. 滑点控制use_order_book=true 拉实时买一卖一,慎防高溢价成交。

👉 点击观看实盘风控踩坑实录:真正大规模爆仓前的 5 个信号

四、回测与验证:如何快速跑 500 次蒙特卡洛

关键词示例:回测命令、计时器、干跑钱包、堆叠头寸、滑点因子

freqtrade backtesting \
  --strategy MartingaleStrategy \
  --config config.json \
  --timeframe 5m \
  --timerange 20230101-20230301 \
  --enable-position-stacking \
  --max-open-trades 3 \
  --stake-amount 100 \
  --dry-run-wallet 10000

点兵点将:

五、FAQ:高频疑问一次说清

  1. Q:为什么用对冲模式而不是 one-way?
    A:马丁可能在极短间隔内同时出现做空信号,启用 hedge 能进行多空对冲,防止订单被拒绝。
  2. Q:杠杆倍数会不会失控?
    A:代码已限制最高 10 倍。如果想更稳,可把 max_leverage 向下改至 5~6 倍,策略仍能运行。
  3. Q:5 级加仓后满仓,BTC 还在跌怎么办?
    A:策略在第 5 次会直接平仓止损,再叠加账户级熔断,因此一个币不会拖垮整体。
  4. Q:回测盈利,实盘却出现滑点磨损?
    A:OKX 永续深度时常在中位动荡,建议同时启用 虚拟订单簿延迟 50ms 模拟真实撮合。
  5. Q:想把乘数改成线性 1.3 而不是指数倍增,可行吗?
    A:把 martingale_multiplier.value 换成 1 + count * 0.3,逻辑写在 adjust_trade_position 里即可。
  6. Q:能否 BTC、ETH 一起跑?
    A:pair_whitelist 加列 “ETH/USDT:USDT”,再启用 --max-open-trades 6,默认独立买量,互不影响。

👉 复制黏贴即可运行的完整代码仓库,免费领

六、结语:永远做风险的“先手”

马丁格尔不是钥匙,而是一把双刃剑。把它放进 Freqtrade + OKX 的组合拳里,最难得的并非策略本身,而是从回测到上线一路敬畏数据:让止损线先于加仓逻辑入心。谨记一句话:不要试图战胜市场,先用风控守住本金。