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. 04cron または 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 コマンドを OS のスケジューラー(cron/launchd)と組み合わせて、ドルコスト平均法、指値注文、ストップロスなどの取引戦略を無人で実行します。エージェントがシェルスクリプトを生成してスケジュールを設定するため、新しいツールは不要です。

前提条件

  • 認証済みであること:mp user retrieve
  • ウォレットに資金があること:mp token balance list --wallet <name> --chain <chain>
  • mp バイナリが PATH 上にあること:which mp(スケジュールするスクリプトで使うため、フルパスを控えてください)
  • jq がインストールされていること:which jq

シェルスクリプトのパターン

すべての戦略で同じ基本パターンを使用します。スクリプトは ~/.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 は 1 行の JSON を出力するため、jq での解析に最適です
  • cron/launchd では PATH が最小限のため、$(which mp) を使って MP に保存します
  • スクリプトではウォレット名のみを使います。mp が実行時にキーチェーンを復号します
  • ユーザーがトークン名やシンボルを指定した場合は、まず mp token search でアドレスを特定します

DCA(ドルコスト平均法)

「毎日午前 9 時に SOL を 5 ドル分購入する」

スクリプト:~/.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)

~/Library/LaunchAgents/com.moonpay.dca-sol.plist に 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 で確認できます。

指値注文

「価格が 80 ドルを下回ったら SOL を購入する」

スクリプト:~/.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:StartCalendarInterval の代わりに <key>StartInterval</key><integer>300</integer> を使用します

ストップロス

「価格が 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

プラットフォームの検出

OS を検出し、適切なスケジューラーを使用します。

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

ヒント

  • 設定が正しく動作することを確認するため、まず少額の DCA から始めてください
  • 初回実行後にログを確認してください:tail -20 ~/.config/moonpay/logs/trading.log
  • スクリプトにシークレットは含まれません。mp が実行時に OS のキーチェーンを使ってウォレットを復号します
  • キーチェーンにアクセスできるよう、マシンにログインし、ユーザーセッションをアクティブにしておく必要があります
  • mp token search による価格確認は無料ですが、スワップにはガス代がかかります
  • 指値注文の確認は 5 分ごとが妥当です。1 分未満にはしないでください
  • bash は浮動小数点数をネイティブに比較できないため、価格の小数比較には bc -l を使用してください
  • bc が利用できない場合は、次を使用します:awk "BEGIN {exit !($PRICE < $TARGET)}"
  • cron のエントリーには必ず # moonpay:{name} のタグを付け、検索や削除ができるようにしてください

関連スキル

  • moonpay-swap-tokens — スワップとブリッジのコマンド構文
  • moonpay-check-wallet — 自動化の設定前に残高を確認
  • moonpay-discover-tokens — トークンを調査し、アドレスを特定
  • moonpay-price-alerts — 取引を行わない、監視のみの価格通知

コメント