エージェントにやらせたかったこと、そしてなぜ...

私はトレーディングツールを作ることにほとんどの時間を費やしています。メインは Python のアシスタントで、Binance Futures を監視し、あらゆるセットアップを 100 点満点でスコアリングして、BUY / SELL / WAIT を理由付きで出します。EMA クロス、VWAP ポジション、出来高、ブレイクアウトの確認、ATR、近くの水準、ローソク足パターン。各条件には点があり、なければゼロ。

意図的な制限が 1 つあります。注文を出すことは許可されていません。

それは見落としではありません。私は、眠っている間に動けてしまうボットに自分を任せたくなかったので、このように書きました。また、毎週ずっと変え続けているコードに対して、取引権限付きの生の API キーを渡したくなかったのです。

トレーディングエージェントのダッシュボード

だから私のボットは何か月もそこに置かれていて、正しいときも間違っているときもあったのに、どちらの場合も何もできなかった。

BinanceAgentOS が計算を変えました。自分のコードに取引権限付き API キーを埋め込む代わりに、エージェントは公式ゲートウェイを通ります。そこで権限を設定でき、いつでも取り消せます。なので私は自分に仕事を 1 つだけ与えました:分析エンジンを Agent OS に接続し、サンドボックス環境で自分自身の取引を行わせて、何が壊れるのかを確かめる。

かなり壊れた。そこが面白い部分。

どうやってやったか

ステップ1:触る前に確認 🧐

1 行も書く前に、私は Agent OS を Claude に接続して、1 つ質問しました。私は実際に何をできるのか?

👉 wallet.getApiKeyPermission

答えは、まず書き留める価値がある最初のものだった:

{

"enableReading": true,

"enableSpotAndMarginTrading": true,

"enableFutures": true,

"enableWithdrawals": false,

"enableInternalTransfer": false,

"permitsUniversalTransfer": true,

"ipRestrict": false

}

出金はオフ。良い、これが最初に全員が確認する境界だ。

でも permitsUniversalTransfer は true。私のエージェントは Binance から資金を引き出せない一方で、自分の口座同士なら資金を移動できます。これは「資金を入れた分しか取引できない」からくる脅威モデルとはまったく別物です。だからこそ、任意のベストプラクティスではなく、専用のサブアカウントが重要なんです。

どこにも書いてあるのを見なかった。エンドポイントを呼んで、レスポンスを見て見つけました。

ステップ2:どのマーケットに当たっても気にしないレイヤーを作る。

私は現物(Spot)と USDT-M 先物の両方を、実行中に切り替えられるようにしたかった。だから私のスコアリングエンジンは、会場に依存しない注文を出し、ルーターがどこに着地させるかを決めます:

router(.)use(Venue.SPOT)

router(.)place(intent)

router(.)toggle() now USDT-M Futures

router(.)place(intent) same intent, different market

2 つのマーケットはドキュメントが示すより似ていません。現物(Spot)にはレバレッジがなく、reduce-only もありません。そして出口(exit)は、資産を売り戻す別の STOP_LOSS_LIMIT 注文です。先物(Futures)はエントリー前にレバレッジを設定する必要があり、出口は STOP_MARKET と closePosition です。アダプタはそれぞれ 1 つ、以上のことがすべて、そこから先は気にしなくてよくなります。

ルーターも、アクティブ側のポジションがまだ開いている間は、会場の切り替えを拒否します。放置された先物ポジションから離れて現物を取り引きしに行くのは、ものすごく速いお金の失い方です。

ステップ3:ガードレール。サブアカウントは最初の層にすぎないため。

侵害されたエージェントへの Binance 側の回答はサブアカウント境界です。これにより残りの資金は守られます。ですがサブアカウント内のお金までは守りません。そこで私は、何かが取引所に届く前に 2 つ目の層を追加しました:想定(ノーション)上限、レバレッジ上限、1 時間あたりの注文数、シンボルのホワイトリスト、すべての新規オーダーに必須の損切り、そして両方の会場を同時に止めるキルスイッチです。

ドライランはデフォルト。読み取りは通るが、書き込みはすべて拒否されログに記録されます。私はそのモードでビルドの全工程をやり切りました。

実際に起きたこと

看板(フラッグシップ)の AI 機能は何も返さなかった

analysis.getTokenAiReport → {''code'':''000000" ''success'':true,''data'':null}

$BTC も同じ。$BNB も同じ。成功、データなし。これは導入途中かもしれないし、地域差かもしれない。いずれにせよ、今日のトークン AI レポートに依存するワークフローを作るなら、ステータスフィールドではなくペイロードを確認してください。

シリアライズのバグで、10 分を失う

1 回の呼び出しで複数のティッカーを要求すると失敗する:

spot.ticker24hr symbols=["BTCUSDT", "BNBUSDT"]

→ -1100 パラメータ 'symbols' に不正な文字が見つかりました

カンマの後ろのスペースが問題です。1 呼び出しにつき 1 シンボルならちゃんと動く。些細なことですが、これに気づくには実際に踏んでみないと学べないタイプのやつ。

貼り付ける API キーは存在しません。とはいえ、私はとにかくそれを前提に設定を組み立ててしまった。

これが私の最大の誤った前提でした。私は auth_token という設定フィールドを設計しました。なぜなら、私がこれまで書いてきたあらゆる取引所連携がそういう仕組みだったからです。

#AgentOS はそういうものではありません。公開される市場データには認証はまったく不要です。だから私のボットは、何も設定していない段階でも、価格やティックサイズ、注文板を読み取れたはずです。アカウントアクセスと取引は、互換クライアントからの認可フローを通じて行われます。そこではサブアカウントを割り当て、後で取り消せる権限を設定します。交換所キーをローカルに保存しないことが、この仕組みの全ての要点です。

私はトランスポートを書き直して、3 つのモードを用意しました:市場データには認証なし、アカウントには OAuth、そして例外のための手動ベアラートークン。設定は「ここに鍵を貼り付けて」から、「このエージェントに到達を許す範囲を選ぶ」へと変わりました。

この 逆転 は本当の設計上の違いで、最初に間違えてみたことでようやく理解できました。

SDK が、私の下で使っていた関数名を変えた

MCP SDK 1.x

streamablehttp_client(url, headers=..., auth=...)

MCP SDK 2.x

streamable_http_client(url, http_client=create_mcp_http_client(auth=...))

名前も違う、署名も違う。数か月前に書かれたチュートリアルからスニペットをコピペすると、新規インストールでは失敗します。今の私のトランスポートは、両方を確認するようになっています。

実際に効いたレバレッジ探索

私のダッシュボードには、レバレッジを 1 から 150 まで動かせるスライダーがあります。テストで一番役に立つことを学びました。ビルド全体で最も有用だった学びがここにありました。

レバレッジは、ストップ損失が維持されている間はリスクを変えません。変わるのは証拠金と、清算までの距離です。分離証拠金ではおおむね:

liquidation_distance ≈ (1 / leverage) - maintenance_margin_rate

150x だと、メンテナンス証拠金の前で約 0.67%。私の典型的な損切りは、エントリーからだいたい 0.5% あたりです。どちらの数字も近すぎて、ウィック、資金調達、または手数料で注文がその間でひっくり返ることがあります。そして清算が先に来れば、取引所は私自身の保護が働く前に私をクローズ(退出)させてしまう。私は予定していた失うはずの 10 USDT ではなく、証拠金を失います。

そこで執行側は、見積もった清算(liquidation)がストップより先に来る場合は注文自体を最初から拒否するようになり、さらにそれらが互いに 1.5x 以内のときに警告も出すようにしました。何も送信されません。レバレッジ設定すら。私はそんなことをするつもりはありませんでした。スライダーが、その問いを強制してきたんです。

使い続けますか?

ビルド自体から言えること:

私が気に入っているのは、その境界があるべきところにあること。私のガードレールは私のもの、@binance の権限は Binance のもの。2 つは互いに信用しなくてよい。自分のリポジトリに取引権限付き API キーを埋め込むのと比べて、これは本当に改善です。しかも、そもそもキー版をやりたくなかった人間として言います。

変更したい点:権限サマリーで permitsUniversalTransfer をもっと大きく目立たせるべきです。「出金不可」は、実態より安全に見えてしまうからです。そして AI レポートのエンドポイントは、null のペイロードではなく、成功コードと一緒に明示的な理由を返してほしい。

率直なまとめ:私のボットは数か月間「意見」だった。Binance Agent OS で「行動」へ変えるのにだいたい 1 日かかり、その大半は「それは No と言うべき理由」を作る作業に費やした。

改めて言いたいのは、私は開発者ではないということ。でもコードを学ぶ時間を取り、Claude は私にとって最高の相棒でした。私は Claude と Binance のおかげで、これらを全部作れました。

上に書いた内容は、最初の実注文の前に、自分のアカウントでドライラン(dry-run)モードに対してすべて実行しました。これは、既存のツールに統合できる単なる分析ツールであって、魔法の治療薬でも、お金を生む機械でもありません。情報提供のみです。必ず最初にご自身で調査してください。NFA

@Yi He $BNB

BNB
BNBUSDT
746.07
+1.59%