mcpField
M
moonpay-trading-automation

moonpay-trading-automation

github.com/moonpay其他11256 次安装23 周前更新
代码仓库

关于 moonpay-trading-automation

该技能通过将 `mp` 命令行脚本与 cron 或 launchd 结合,构建无人值守交易流程,涵盖定投、限价单和止损,并说明任务调度与日志管理。

主要功能

  1. 01自动执行定期定投
  2. 02按价格检查限价单条件
  3. 03设置止损脚本
  4. 04使用 cron 或 launchd 调度
  5. 05管理任务和日志

适用场景

  1. 01按固定计划购买代币
  2. 02根据价格条件买入
  3. 03价格触及阈值时卖出

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/moonpay/skills --skill moonpay-trading-automation

安装后在 Claude Code 中输入/moonpay-trading-automation确认已加载。

详细介绍

交易自动化

目标

组合使用 mp CLI 命令和操作系统调度器(cron/launchd),以无人值守的方式运行交易策略:定投、限价单和止损。Agent 生成 shell 脚本并设置调度,无需新工具。

前置条件

  • 已完成身份验证:mp user retrieve
  • 钱包中有资金:mp token balance list --wallet <name> --chain <chain>
  • mp 二进制文件位于 PATH 中:which mp(记下完整路径,供计划任务中的脚本使用)
  • 已安装 jq:which jq

Shell 脚本模式

每种策略都采用相同的基础模式。脚本保存在 ~/.config/moonpay/scripts/ 中,日志写入 ~/.config/moonpay/logs/trading.log。

#!/bin/bash
set -euo pipefail

MP="$(which mp)"  # absolute path for cron/launchd
LOG="$HOME/.config/moonpay/logs/trading.log"
mkdir -p "$(dirname "$LOG")"

log() { echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*" >> "$LOG"; }

# --- Config (agent fills these in) ---
WALLET="main"
CHAIN="solana"
FROM_TOKEN="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"  # USDC
TO_TOKEN="So11111111111111111111111111111111111111111"         # SOL
AMOUNT=5

# --- Execute ---
log "SWAP: $AMOUNT $FROM_TOKEN -> $TO_TOKEN on $CHAIN"
RESULT=$("$MP" --json token swap \
  --wallet "$WALLET" --chain "$CHAIN" \
  --from-token "$FROM_TOKEN" --from-amount "$AMOUNT" \
  --to-token "$TO_TOKEN" 2>&1) || {
  log "FAILED: $RESULT"
  exit 1
}
log "OK: $RESULT"

要点:

  • mp --json 输出单行 JSON,非常适合使用 jq 解析
  • 使用 $(which mp) 并将其保存为 MP——cron/launchd 的 PATH 非常精简
  • 脚本中只使用钱包名称——mp 会在运行时处理密钥链解密
  • 如果用户提供了代币名称/符号,先使用 mp token search 将其解析为地址

定投(美元成本平均法)

“每天上午 9 点买入价值 $5 的 SOL”

脚本:~/.config/moonpay/scripts/dca-sol.sh

按照上面的基础模式,使用用户指定的代币、金额、钱包和链。

使用 cron 调度(Linux)
# Buy $5 of SOL daily at 9am UTC — moonpay:dca-sol
0 9 * * * ~/.config/moonpay/scripts/dca-sol.sh

使用以下命令添加:(crontab -l 2>/dev/null; echo '0 9 * * * ~/.config/moonpay/scripts/dca-sol.sh # moonpay:dca-sol') | crontab -

常见间隔:

  • 每小时:0 * * * *
  • 每 4 小时:0 */4 * * *
  • 每天上午 9 点:0 9 * * *
  • 每周一上午 9 点:0 9 * * 1
使用 launchd 调度(macOS)

将 plist 写入 ~/Library/LaunchAgents/com.moonpay.dca-sol.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.moonpay.dca-sol</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/bash</string>
    <string>/Users/USERNAME/.config/moonpay/scripts/dca-sol.sh</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>9</integer>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
  <key>StandardErrorPath</key>
  <string>/Users/USERNAME/.config/moonpay/logs/dca-sol.err</string>
</dict>
</plist>

使用以下命令加载:launchctl load ~/Library/LaunchAgents/com.moonpay.dca-sol.plist

重要: plist 文件中的波浪号(~)不会展开。务必使用完整路径(例如 /Users/USERNAME/...)。使用 echo $HOME 获取该路径。

限价单

“当 SOL 价格跌破 $80 时买入”

脚本:~/.config/moonpay/scripts/limit-buy-sol.sh
#!/bin/bash
set -euo pipefail

MP="$(which mp)"
LOG="$HOME/.config/moonpay/logs/trading.log"
mkdir -p "$(dirname "$LOG")"
log() { echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*" >> "$LOG"; }

# --- Config ---
WALLET="main"
CHAIN="solana"
TOKEN="So11111111111111111111111111111111111111111"
BUY_WITH="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"  # USDC
BUY_AMOUNT=50
TARGET_PRICE=80
SCRIPT_NAME="limit-buy-sol"

# --- Check price ---
PRICE=$("$MP" --json token search --query "$TOKEN" --chain "$CHAIN" | jq -r '.items[0].marketData.price')

if [ -z "$PRICE" ] || [ "$PRICE" = "null" ]; then
  log "LIMIT $SCRIPT_NAME: price fetch failed, skipping"
  exit 0
fi

# --- Compare ---
if (( $(echo "$PRICE < $TARGET_PRICE" | bc -l) )); then
  log "LIMIT $SCRIPT_NAME: price $PRICE < $TARGET_PRICE — executing buy"
  RESULT=$("$MP" --json token swap \
    --wallet "$WALLET" --chain "$CHAIN" \
    --from-token "$BUY_WITH" --from-amount "$BUY_AMOUNT" \
    --to-token "$TOKEN" 2>&1) || {
    log "LIMIT $SCRIPT_NAME FAILED: $RESULT"
    exit 1
  }
  log "LIMIT $SCRIPT_NAME OK: bought at $PRICE — $RESULT"

  # Self-disable after fill
  if [[ "$OSTYPE" == "darwin"* ]]; then
    launchctl unload "$HOME/Library/LaunchAgents/com.moonpay.${SCRIPT_NAME}.plist" 2>/dev/null || true
  else
    crontab -l | grep -v "$SCRIPT_NAME" | crontab -
  fi
  log "LIMIT $SCRIPT_NAME: disabled after fill"
else
  log "LIMIT $SCRIPT_NAME: price $PRICE >= $TARGET_PRICE — waiting"
fi

每 5 分钟调度一次:

  • Cron:*/5 * * * * ~/.config/moonpay/scripts/limit-buy-sol.sh # moonpay:limit-buy-sol
  • Launchd:使用 <key>StartInterval</key><integer>300</integer>,代替 StartCalendarInterval

止损

“如果 SOL 价格跌破 $70,就卖出我所有的 SOL”

结构与限价单相同,但执行卖出而不是买入。对于“全部卖出”,请先查询余额:

# --- Config ---
SELL_TOKEN="So11111111111111111111111111111111111111111"   # SOL
TO_TOKEN="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" # USDC
TRIGGER_PRICE=70
SCRIPT_NAME="stop-loss-sol"

# --- Check price ---
PRICE=$("$MP" --json token search --query "$SELL_TOKEN" --chain "$CHAIN" | jq -r '.items[0].marketData.price')

if (( $(echo "$PRICE < $TRIGGER_PRICE" | bc -l) )); then
  # Get current balance to sell all
  BALANCE=$("$MP" --json token balance list --wallet "$WALLET" --chain "$CHAIN" \
    | jq -r --arg addr "$SELL_TOKEN" '.items[] | select(.address == $addr) | .balance.amount')

  if [ -n "$BALANCE" ] && (( $(echo "$BALANCE > 0" | bc -l) )); then
    log "STOP-LOSS $SCRIPT_NAME: price $PRICE < $TRIGGER_PRICE — selling $BALANCE"
    RESULT=$("$MP" --json token swap \
      --wallet "$WALLET" --chain "$CHAIN" \
      --from-token "$SELL_TOKEN" --from-amount "$BALANCE" \
      --to-token "$TO_TOKEN" 2>&1) || {
      log "STOP-LOSS $SCRIPT_NAME FAILED: $RESULT"
      exit 1
    }
    log "STOP-LOSS $SCRIPT_NAME OK: sold at $PRICE — $RESULT"
    # Self-disable (same pattern as limit order)
  fi
fi

管理自动化

列出已启用的自动化
# macOS
launchctl list | grep moonpay

# Linux
crontab -l | grep moonpay
移除一项自动化
# macOS
launchctl unload ~/Library/LaunchAgents/com.moonpay.dca-sol.plist
rm ~/Library/LaunchAgents/com.moonpay.dca-sol.plist

# Linux
crontab -l | grep -v "moonpay:dca-sol" | crontab -
查看日志
tail -50 ~/.config/moonpay/logs/trading.log
暂停 / 恢复(仅限 macOS)
launchctl unload ~/Library/LaunchAgents/com.moonpay.dca-sol.plist   # pause
launchctl load ~/Library/LaunchAgents/com.moonpay.dca-sol.plist     # resume

平台检测

检测操作系统并使用相应的调度器:

if [[ "$OSTYPE" == "darwin"* ]]; then
  # macOS: use launchd (fires even if machine was asleep)
else
  # Linux: use crontab
fi

提示

  • 从较小的定投金额开始,确认设置有效后再增加金额
  • 首次运行后检查日志:tail -20 ~/.config/moonpay/logs/trading.log
  • 脚本不包含机密信息——mp 会在运行时通过操作系统密钥链解密钱包
  • 必须有用户登录(用户会话处于活动状态),密钥链访问才能正常工作
  • 使用 mp token search 检查价格是免费的;兑换需要支付 Gas
  • 每 5 分钟检查一次限价单是合理的——间隔不要短于 1 分钟
  • 使用 bc -l 比较十进制价格(bash 无法原生比较浮点数)
  • 如果没有 bc,请使用:awk "BEGIN {exit !($PRICE < $TARGET)}"
  • 始终使用 # moonpay:{name} 标记 cron 条目,以便查找和移除

相关技能

  • moonpay-swap-tokens — 兑换和跨链桥接命令语法
  • moonpay-check-wallet — 设置自动化前检查余额
  • moonpay-discover-tokens — 调研代币并解析地址
  • moonpay-price-alerts — 仅观察价格并发送通知(不进行交易)

评论

支持 Markdown