Strasmore Research
Belajar Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-04

Pemutus Litar untuk Bot Dagangan

Ketahui cara pemutus litar menghentikan bot dagangan sebelum kerugian harian bertambah, serta kesan penskalaan turun naik terhadap saiz posisi.

Circuit breaker untuk bot dagangan ialah peraturan yang menghentikan strategi automatik daripada menghantar pesanan apabila had yang ditetapkan dicapai. Ia berada dalam lapisan risiko antara strategi dengan broker, dan berkuat kuasa pada setiap pesanan tanpa mengira sama ada strategi bersetuju atau tidak. Strategi menentukan perkara yang hendak didagangkan. Lapisan risiko menentukan sama ada dagangan boleh berlaku sama sekali.

Pemisahan itu merupakan asas keseluruhan reka bentuk. Strategi yang mengawasi dirinya sendiri tidak mempunyai semakan bebas apabila andaian strategi itu sendiri mula gagal. Itulah ketika semakan paling diperlukan.

Fungsi pemutus litar dalam bot dagangan

Lapisan risiko mempunyai empat komponen. Setiap komponen diwujudkan untuk mengelakkan kegagalan tertentu yang mungkin kelihatan remeh.

  • Had mutlak terhadap saiz posisi, pendedahan nosional bagi setiap simbol dan kadar pesanan. Had ini mengehadkan kerugian akibat pepijat yang sebaliknya tidak mempunyai batas.
  • Pemutus litar kemerosotan nilai yang menghentikan pesanan baharu apabila akaun susut sebanyak jumlah tertentu dalam sesi tersebut, atau susut sebanyak jumlah tertentu daripada paras kemuncak ekuitinya.
  • Penentuan saiz pesanan secara berskala, berdasarkan volatiliti terkini atau sebahagian daripada pertaruhan Kelly, bukannya bilangan saham tetap. Kaedah ini mengekalkan risiko bagi setiap dagangan pada tahap yang hampir stabil apabila julat pergerakan pasaran berubah.
  • Log audit tambah sahaja bagi setiap keputusan, termasuk pesanan yang ditolak oleh lapisan risiko. Log ini ialah satu-satunya artifak yang membezakan antara “strategi itu salah” dengan “semakan itu tidak pernah dijalankan”.

Semua yang berikut ialah penerapan konkrit bagi salah satu daripada empat komponen tersebut.

What is a reasonable daily loss limit for a trading bot?

A daily loss limit halts new orders once the session's loss passes a threshold. Picking the number is calibration, not taste: set it inside ordinary market noise and the bot sits halted most weeks, set it far outside and it never fires. The starting point is how often the market itself delivers a down day of a given size.

PertanyaanHari penurunan SPY mengikut magnitud, setahun, 2018 hingga Julai 2026
SQL tepat di sebalik setiap nombor
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2017-12-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
with_prev AS (
    SELECT d,
           close_px,
           any(close_px) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_close
    FROM daily
)
SELECT toYear(d) AS year,
       countIf(close_px / prev_close - 1 <= -0.01) AS down_1pct_days,
       countIf(close_px / prev_close - 1 <= -0.02) AS down_2pct_days,
       countIf(close_px / prev_close - 1 <= -0.03) AS down_3pct_days
FROM with_prev
WHERE prev_close > 0
  AND d >= toDate('2018-01-01')
GROUP BY year
ORDER BY year
Run this yourself

Sessions at 1% down or worse numbered 15 in 2019 and 45 in 2020, out of roughly 250 trading days a year. The 3%-or-worse count is a different animal: 0 in 2019 against 16 in 2020. The last row of the 9 covers sessions through July 31, 2026 only.

The line is lumpy rather than steady, and the lumpiness is the design point. Hard days arrive in clusters. A bot that halts on the first day of a cluster and resumes on the second has not really halted.

Two thresholds do different jobs. A daily loss limit, commonly 2% of account equity, ends the session. A trailing drawdown limit measured from the equity high-water mark, commonly around 10%, ends the strategy pending human review. The first is routine, the second is meant to be rare, and a bot carrying only the first can grind an account down 2% at a time without ever tripping anything.

Bagaimanakah penskalaan volatiliti mengubah saiz posisi?

Penyasaran volatiliti menentukan saiz posisi secara songsang dengan volatiliti terealisasi terkini: apabila julat harian meningkat dua kali ganda, posisi dikurangkan kira-kira separuh bagi mengekalkan risiko dolar setiap dagangan hampir malar. Volatiliti terealisasi di sini ialah sisihan piawai pulangan harian yang dinyahkuasakan kepada kadar tahunan, dan perubahannya lebih besar daripada jangkaan kebanyakan pelabur.

PertanyaanVolatiliti direalisasi SPY mengikut bulan, dan saiz posisi bagi sasaran volatiliti 12%
SQL tepat di sebalik setiap nombor
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2023-12-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
rets AS (
    SELECT d,
           close_px / any(close_px) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - 1 AS ret
    FROM daily
)
SELECT formatDateTime(toStartOfMonth(d), '%Y-%m') AS month,
       round(stddevSamp(ret) * sqrt(252) * 100, 1) AS realized_vol_pct,
       round(least(100.0, 1200.0 / (stddevSamp(ret) * sqrt(252) * 100)), 1) AS vol_target_size_pct
FROM rets
WHERE d >= toDate('2024-01-01')
  AND isFinite(ret)
GROUP BY toStartOfMonth(d)
HAVING count() >= 15
ORDER BY toStartOfMonth(d)
Run this yourself

Volatiliti terealisasi diukur 11.1% pada asas tahunan pada 2024-01 dan 12% dalam 2026-07, merentasi 31 bulan. Lajur kedua menukarkan setiap bacaan kepada posisi yang akan dibawa oleh sasaran volatiliti 12%, dengan had pada paras penuh: 100% dalam 2024-01 berbanding 99.7% dalam 2026-07. Strategi sama, keyakinan sama, tetapi jumlah saham yang sangat berbeza.

Kriteria Kelly menangani masalah yang sama dari sudut bertentangan. Ia menentukan saiz posisi berdasarkan kelebihan dan varians yang dianggarkan, bukan volatiliti semata-mata. Kebanyakan pengendali sistematik menggunakan sebahagian daripadanya, iaitu separuh Kelly atau suku Kelly, kerana kedua-dua input itu merupakan anggaran berdasarkan sampel terhad. Penentuan saiz posisi menggunakan kriteria Kelly menghuraikan pengiraan tersebut.

Mengapa bot dagangan terus masuk semula selepas stop?

Stop dicetuskan. Posisi ditutup. Sembilan puluh saat kemudian, syarat kemasukan kembali benar, bot masuk semula, menanggung kerugian yang sama dan mengulanginya. Tiada satu pun komponen yang rosak. Strategi melaksanakan perkara yang diprogramkan, stop melaksanakan perkara yang diprogramkan, tetapi akaun terus susut sedikit demi sedikit bagi setiap pusing ganti dagangan.

Kekerapan itu berpunca secara langsung daripada laluan harga. Panel ini mengira, bagi setiap sesi, berapa kali SPY bergerak daripada lebih 0.1% di atas harga pembukaan kepada lebih 0.1% di bawahnya, atau bergerak kembali ke arah bertentangan.

PertanyaanKekerapan SPY melintasi semula harga pembukaannya sendiri, setiap sesi, mengikut bulan
SQL tepat di sebalik setiap nombor
WITH mins AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           window_start AS ts,
           toFloat64(close) AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
),
opens AS (
    SELECT d, argMin(px, ts) AS open_px
    FROM mins
    GROUP BY d
),
zoned AS (
    SELECT m.d AS d,
           m.ts AS ts,
           multiIf(m.px >= o.open_px * 1.001, 1,
                   m.px <= o.open_px * 0.999, -1,
                   0) AS zone
    FROM mins AS m
    INNER JOIN opens AS o ON m.d = o.d
),
flips AS (
    SELECT d,
           zone,
           any(zone) OVER (PARTITION BY d ORDER BY ts ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_zone
    FROM zoned
    WHERE zone != 0
),
per_day AS (
    SELECT d, countIf(prev_zone != 0 AND zone != prev_zone) AS crossings
    FROM flips
    GROUP BY d
)
SELECT formatDateTime(toStartOfMonth(d), '%Y-%m') AS month,
       round(avg(crossings), 1) AS avg_crossings_per_session,
       max(crossings) AS max_crossings_in_a_session
FROM per_day
GROUP BY toStartOfMonth(d)
ORDER BY toStartOfMonth(d)
Run this yourself

SPY melintasi jalur itu secara purata sebanyak 0.7 kali setiap sesi pada 2025-08 dan 1.5 kali pada 2026-07, dengan satu sesi pada 2026-07 merekodkan 5 lintasan. Mana-mana peraturan yang membuka posisi pada satu sisi sesuatu paras dan menetapkan stop pada sisi yang lain mempunyai sebanyak itu peluang untuk dicetuskan dalam satu hari.

Empat mekanisme boleh mengehadkannya.

  • Tempoh bertenang selepas setiap stop, diukur dalam minit atau bar, yang menghalang pesanan baharu bagi simbol tersebut daripada melepasi lapisan risiko.
  • Had bilangan dagangan harian bagi setiap simbol, yang menukar gelung tanpa had kepada gelung yang terhad.
  • Bendera henti yang kekal aktif. Sebaik sahaja had kerugian harian dicetuskan, bendera itu kekal aktif sehingga dipadamkan oleh seseorang.
  • Penyimpanan bendera itu di luar memori proses. Penyelia yang memulakan semula bot yang ranap akan memberikannya keadaan awal yang bersih, sedangkan keadaan awal yang bersih itulah yang hendak dielakkan oleh bendera tersebut.

Mekanisme terakhir ini sering terlepas pandang walaupun perkara lain telah dilaksanakan dengan betul. Bot dagangan Grid sengaja meletakkan susunan pesanan berperingkat, sekali gus menjadikan had bilangan dagangan sebagai komponen penting, bukannya sekadar hiasan.

Apakah yang berlaku apabila bot berdagang berdasarkan suapan harga yang lapuk?

Sebut harga yang sudah berhenti dikemas kini masih kelihatan seperti nombor. Bot membacanya, menetapkan harga pesanan berdasarkan sebut harga itu, lalu menghantar pesanan tersebut ke pasaran yang sudah bergerak. Kegagalan ini berlaku secara senyap: tiada ralat dilemparkan, tiada ralat direkodkan, dan kejanggalan pada pelaksanaan hanya kelihatan selepas itu.

Ukuran yang paling jelas ialah jurang harga semalaman. Dalam keadaan ini, harga yang diketahui kekal tidak berubah selama beberapa jam, sedangkan harga yang boleh didagangkan terus bergerak.

PertanyaanJurang semalaman daripada penutupan sebelumnya kepada pembukaan seterusnya: enam kaunter, Jan 2024 hingga Jul 2026
SQL tepat di sebalik setiap nombor
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMin(toFloat64(open), window_start) AS open_px,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'MSFT', 'AAPL', 'NVDA', 'TSLA')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, d
),
gaps AS (
    SELECT ticker,
           d,
           open_px,
           any(close_px) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_close
    FROM daily
)
SELECT ticker,
       round(quantileDeterministic(0.5)(abs(open_px / prev_close - 1) * 100, cityHash64(ticker, d)), 2) AS median_gap_pct,
       round(quantileDeterministic(0.95)(abs(open_px / prev_close - 1) * 100, cityHash64(ticker, d)), 2) AS p95_gap_pct,
       round(max(abs(open_px / prev_close - 1) * 100), 2) AS max_gap_pct
FROM gaps
WHERE prev_close > 0
GROUP BY ticker
ORDER BY p95_gap_pct DESC
Run this yourself

Instrumen dengan jurang pada persentil ke-95 paling besar ialah TSLA pada 4.41%, berbanding 1% bagi KO. Kebanyakan malam jauh lebih tenang, dengan jurang median masing-masing sebanyak 1.01% dan 0.24%. Lapisan risiko dibina untuk menangani keadaan ekstrem ini, dan jurang tunggal terbesar bagi TSLA dalam tempoh yang diukur ialah 14.57%. Itulah jarak pergerakan yang mungkin dihadapi bot apabila bertindak berdasarkan harga yang dibacanya beberapa ketika sebelum itu. Mengapa saham mengalami jurang harga semalaman menerangkan mekanismenya.

Langkah perlindungannya mudah dan murah. Tetapkan had umur maksimum bagi setiap sebut harga yang akan digunakan oleh lapisan risiko untuk menetapkan harga, lazimnya beberapa saat bagi strategi intrahari. Pantau isyarat degupan daripada suapan secara berasingan daripada data, supaya soket yang senyap dapat dibezakan daripada pasaran yang tidak banyak bergerak. Anggap data yang hilang sebagai pemberhentian dagangan, bukannya harga yang kekal, kerana bot yang tiada harga juga tidak dapat menilai arahan keluar posisinya.

Apakah had keras yang patut diletakkan dalam lapisan risiko?

  • Nilai nosional maksimum bagi setiap simbol sebagai bahagian daripada ekuiti akaun. Had 10% menghalang satu simbol yang bermasalah daripada menjejaskan keseluruhan akaun.
  • Nilai nosional kasar maksimum bagi semua posisi terbuka. Menetapkannya pada 100% ekuiti bermakna tiada leverage. Keputusan ini wajar dibuat secara jelas, bukannya diwarisi daripada tetapan lalai broker.
  • Kadar pesanan maksimum, seminit dan sehari. Sepuluh pesanan seminit memadai untuk kebanyakan strategi pelabur runcit dan masih mengehadkan gelung yang berjalan tanpa kawalan dalam tempoh seminit.
  • Saiz pesanan maksimum sebagai bahagian daripada volum harian purata simbol tersebut. Had 1% menghalang bot daripada menggerakkan harga yang cuba didagangkannya, dan volum harian purata ialah penyebutnya.

Setiap satu daripada had ini sepatutnya berada dalam lapisan risiko, bukannya dalam strategi. Setiap satu juga mesti menggunakan laluan kod yang sama dalam ujian belakang, dagangan kertas dan dagangan langsung. Had yang hanya wujud dalam dagangan langsung ialah had yang belum diuji oleh sesiapa.

Apakah yang diperlukan oleh log audit trading bot?

Log append-only menulis satu rekod bagi setiap keputusan dan tidak pernah mengedit atau memadamkannya. Setiap rekod mengandungi cap masa, sebut harga yang digunakan serta usianya, setiap semakan had yang dijalankan berserta keputusannya, pesanan yang dihantar dan jawapan broker. Pesanan yang ditolak direkodkan dengan kepentingan yang sama seperti pesanan yang dilaksanakan.

Tujuannya ialah pembinaan semula. Enam minggu selepas sesi yang buruk, persoalannya bukanlah P&L. Persoalannya ialah semakan yang mana telah diluluskan dan berdasarkan input apa. Tanpa input yang direkodkan, anda akhirnya perlu membuat semula keadaan bot daripada keadaan pasaran. Ini merupakan kesilapan yang sama seperti bias pandang hadapan dalam backtesting: menggunakan maklumat yang belum dimiliki oleh sistem ketika keputusan dibuat.

Projek riskguard ialah salah satu pelaksanaan sumber terbuka yang memisahkan kedua-dua perkara ini. Semakan had ditempatkan dalam komponen yang dipanggil oleh strategi, bukannya logik yang berselerak dalam strategi itu sendiri. Ini hanyalah satu daripada beberapa reka bentuk yang ada dan wajar dibaca, bukan terus diguna pakai. Apa jua yang anda jadikan kebergantungan, tetapkan keluaran bertanda dan bukannya menggunakan cawangan lalai. Cawangan boleh berubah antara dua larian backtest yang sama, dan lapisan risiko yang berubah secara senyap lebih buruk daripada tiada lapisan risiko langsung.

Mengapa pelaksanaan pertama dijalankan melalui broker simulasi

Penyesuai broker menggunakan mod simulasi secara lalai, manakala dagangan sebenar memerlukan penetapan bendera khusus. Ini disengajakan. Langkah tersebut mengelakkan kegagalan biasa: fail konfigurasi yang disalin, atau pemboleh ubah persekitaran yang tidak pernah digantikan, lalu menghantar pesanan sebenar menggunakan wang sebenar.

Pelaksanaan simulasi juga menghasilkan artifak yang penting, iaitu log keputusan daripada lapisan risiko yang sama berdasarkan harga masa nyata. Log ini menunjukkan had yang dicetuskan dan had yang tidak dicetuskan. Ini menjadi bukti tentang lapisan risiko, iaitu persoalan yang berbeza daripada sama ada strategi itu menjana keuntungan. Dagangan simulasi sebelum menggunakan wang sebenar menerangkan perkara yang boleh dan tidak boleh dibuktikan oleh rekod simulasi, manakala sistem dagangan AI berbilang ejen menunjukkan sebab kuasa untuk menghentikan dagangan perlu diletakkan di luar setiap ejen apabila beberapa ejen boleh menghantar pesanan.

Soalan Lazim Pemutus Litar Bot Dagangan

Apakah pemutus litar dalam bot dagangan?

Peraturan dalam lapisan risiko yang menghentikan bot daripada menghantar pesanan baharu apabila had yang ditetapkan dicapai. Lazimnya, had itu ialah ambang kerugian harian atau penurunan daripada paras puncak ekuiti akaun. Peraturan ini berjalan secara bebas daripada strategi pada setiap pesanan, dan kekal tercetus sehingga keadaan itu dipulihkan.

Berapa kerapkah pasaran mengalami hari kejatuhan sebanyak 2%?

SPY mencatat 5 sesi dengan kejatuhan sekurang-kurangnya 2% pada 2019 dan 25 pada 2020, daripada kira-kira 250 hari dagangan setiap tahun. Perbezaan antara tahun yang tenang dengan tahun yang tertekan itu menunjukkan sebab had kerugian perlu ditentukur berdasarkan sejarah, bukannya intuisi.

Bagaimanakah anda menghalang bot daripada memasuki semula pasaran selepas henti rugi?

Tempoh bertenang selepas setiap henti rugi dan had dagangan harian bagi setiap simbol menukar gelung tanpa had kepada gelung yang mempunyai had. Penanda henti juga perlu dikekalkan dan disimpan di luar memori proses. Jika tidak, penyelia yang memulakan semula bot yang terhenti akan memberikannya keadaan baharu yang tidak dihentikan.

Bagaimanakah bot boleh mengetahui bahawa suapan harga telah menjadi lapuk?

Bot boleh menyemak usia setiap sebut harga sebelum menetapkan harga pesanan berdasarkan sebut harga itu. Bot juga perlu memantau isyarat denyut daripada suapan secara berasingan daripada data. Jurang semalaman menunjukkan magnitud perkara yang boleh disembunyikan oleh harga lapuk: pergerakan semalaman persentil ke-95 mencecah 4.41% pada TSLA antara Januari 2024 hingga Julai 2026.

Adakah bot dagangan kecil benar-benar memerlukan log audit?

Log pelaksanaan merekodkan perkara yang berlaku. Log keputusan merekodkan perkara yang dipercayai oleh bot sebagai perkara yang dibenarkan untuk dilakukannya. Itulah satu-satunya cara untuk membezakan strategi yang salah daripada semakan risiko yang tidak pernah dijalankan. Versi minimum yang berguna ialah log tambah sahaja, termasuk penolakan pesanan.


Setiap angka di atas datang daripada pertanyaan tersimpan menggunakan bar minit, dan setiap panel boleh dibuka untuk melihat SQL di sebaliknya. Jalankan pertanyaan yang sama terhadap senarai simbol anda sendiri di terminal Strasmore.

#risk-management#trading-bots#drawdown#position-sizing#automation