{"id":386,"date":"2025-06-14T23:00:48","date_gmt":"2025-06-14T15:00:48","guid":{"rendered":"https:\/\/khsci.com\/khQuant\/?page_id=386"},"modified":"2026-10-12T23:07:26","modified_gmt":"2026-10-12T15:07:26","slug":"chapter12","status":"publish","type":"page","link":"https:\/\/khsci.com\/khQuant\/chapter12\/","title":{"rendered":"3.1 \u6846\u67b6\u4ecb\u7ecd"},"content":{"rendered":"\n<style>\n.khq-web-manual{max-width:980px;margin:0 auto;padding:8px 0 36px;line-height:1.82;font-size:16px;color:#243042;word-break:break-word;}\n.khq-web-manual h2{font-size:1.45rem;line-height:1.4;margin:38px 0 14px;padding-top:8px;color:#12345f;border-top:1px solid #e7edf5;}\n.khq-web-manual h3{font-size:1.16rem;line-height:1.5;margin:24px 0 10px;color:#163b68;}\n.khq-web-manual blockquote{margin:18px 0;padding:14px 18px;border-left:4px solid #1e88e5;background:#f4f9ff;color:#36506f;border-radius:0 10px 10px 0;}\n.khq-web-manual code{background:#f3f6fa;border:1px solid #e6edf5;border-radius:5px;padding:.12em .36em;font-size:.92em;}\n.khq-web-manual pre{background:#0f172a;color:#e5edf7;border-radius:12px;padding:16px;overflow:auto;line-height:1.65;border:1px solid #24324a;}\n.khq-web-manual pre code{background:transparent;border:0;color:inherit;padding:0;font-size:.93em;white-space:pre;}\n.khq-tn .khq-tn-table{width:100%;overflow-x:auto;margin:16px 0 22px;}\n.khq-web-manual.khq-tn table{display:table!important;width:100%!important;max-width:100%;border-collapse:collapse!important;margin:0!important;font-size:.96em;border:1px solid #e2e8f0!important;table-layout:auto;}\n.khq-web-manual.khq-tn th,.khq-web-manual.khq-tn td{border:1px solid #e2e8f0!important;padding:10px 12px;vertical-align:top;}\n.khq-web-manual th{background:#f7fafc;color:#173b63;font-weight:600;}\n.khq-web-manual img{max-width:100%;height:auto;border-radius:10px;box-shadow:0 8px 28px rgba(15,35,60,.09);}\n.khq-web-manual a{color:#1167b1;text-decoration:none;border-bottom:1px solid rgba(17,103,177,.25);}\n.khq-web-manual a:hover{border-bottom-color:rgba(17,103,177,.8);}\n.khq-tn .khq-tn-ver{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;color:#5b6b7c;}\n.khq-tn .ver{display:inline-block;padding:2px 10px;border-radius:999px;font-weight:600;font-size:13px;line-height:1.6;}\n.khq-tn .ver-v2{background:#e8f3ff;color:#0b5cad;border:1px solid #b8d8fb;}\n.khq-tn .ver-v3{background:#fff1e6;color:#b1520a;border:1px solid #f8cfa8;}\n.khq-tn .ver-note{color:#6b7a8c;}\n.khq-tn .khq-tn-video{margin:6px 0 26px;border-radius:14px;overflow:hidden;background:#0f172a;box-shadow:0 10px 30px rgba(15,35,60,.12);}\n.khq-tn .khq-tn-video video{display:block;width:100%;aspect-ratio:16\/9;background:#000;}\n.khq-tn .khq-tn-video .cap{padding:8px 14px;color:#cbd6e4;font-size:13px;}\n.khq-tn .khq-tn-video.empty{background:linear-gradient(135deg,#eef4fb,#f7f9fc);border:1px dashed #b9cbe0;box-shadow:none;}\n.khq-tn .khq-tn-video.empty .ph{aspect-ratio:16\/9;max-height:300px;width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#4d6480;text-align:center;padding:16px;box-sizing:border-box;}\n.khq-tn .khq-tn-video.empty .play{width:54px;height:54px;border-radius:50%;background:#dbe7f5;color:#7b93b0;display:flex;align-items:center;justify-content:center;font-size:22px;padding-left:4px;box-sizing:border-box;}\n.khq-tn .khq-tn-video.empty span:last-child{font-size:13px;color:#7890ab;}\n.khq-tn .khq-tn-callout{margin:18px 0;padding:12px 16px 4px;border-radius:12px;border:1px solid;}\n.khq-tn .khq-tn-callout .lbl{font-weight:700;font-size:13px;margin-bottom:4px;letter-spacing:.04em;}\n.khq-tn .khq-tn-callout p{margin:0 0 10px;}\n.khq-tn .khq-tn-callout.v3{background:#fff8f1;border-color:#f6d3b0;}\n.khq-tn .khq-tn-callout.v3 .lbl{color:#b1520a;}\n.khq-tn .khq-tn-callout.tip{background:#f3f9ff;border-color:#cfe3f7;}\n.khq-tn .khq-tn-callout.tip .lbl{color:#0b5cad;}\n.khq-tn .khq-tn-callout.warn{background:#fff6f5;border-color:#f3c7c2;}\n.khq-tn .khq-tn-callout.warn .lbl{color:#b3261e;}\n.khq-tn .khq-tn-fig{margin:18px 0 22px;text-align:center;}\n.khq-tn .khq-tn-fig figcaption{margin-top:6px;color:#66758a;font-size:.9em;}\n.khq-tn .khq-tn-fig.pending .ph{border:1px dashed #c7d3e0;border-radius:10px;background:#f7f9fb;color:#8594a6;font-size:14px;padding:34px 16px;}\n.khq-tn p.q{margin:18px 0 4px;}\n.khq-tn .khq-tn-nav{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:40px;padding-top:18px;border-top:1px solid #e7edf5;}\n.khq-tn .khq-tn-nav a{display:block;padding:12px 14px;border:1px solid #e2e8f0;border-radius:12px;border-bottom:1px solid #e2e8f0;color:#163b68;font-weight:600;}\n.khq-tn .khq-tn-nav a:hover{border-color:#9cc3ea;background:#f7fbff;}\n.khq-tn .khq-tn-nav a span{display:block;font-size:12px;font-weight:400;color:#7a8a9c;margin-bottom:2px;}\n.khq-tn .khq-tn-nav a.next{text-align:right;}\n@media (max-width:768px){.khq-web-manual{font-size:15px;padding:0 2px 24px}.khq-web-manual h2{font-size:1.27rem}.khq-web-manual h3{font-size:1.08rem}.khq-web-manual pre{padding:13px;border-radius:10px}.khq-tn .khq-tn-nav{grid-template-columns:1fr}.khq-tn .khq-tn-nav a.next{text-align:left}}\n.khq-tn .khq-tn-figrow{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start;margin:8px 0 20px;}\n.khq-tn .khq-tn-figrow .khq-tn-fig{margin:0;}\n@media (max-width:640px){.khq-tn .khq-tn-figrow{grid-template-columns:1fr;}}\n.khq-tn .khq-tn-fig a{border:0;display:inline-block;cursor:zoom-in;}\n.khq-tn .khq-tn-fig img{max-width:100%;height:auto;border:1px solid #e2e8f0;}\n.khq-tn .khq-tn-v3{position:relative;margin:22px 0;padding:15px 18px 15px 24px;border-radius:14px;background:#fffaf5;border:1px solid #fbd9c2;overflow:hidden;}\n.khq-tn .khq-tn-v3::before{content:\"\";position:absolute;left:0;top:0;bottom:0;width:5px;background:linear-gradient(180deg,#ff8a00,#e52e71);}\n.khq-tn .khq-tn-v3.promo{background:linear-gradient(135deg,#fff6ec 0%,#ffeef4 100%);border-color:#f7c6b0;box-shadow:0 8px 26px rgba(229,46,113,.10);}\n.khq-tn .v3-head{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:6px;}\n.khq-tn .v3-badge{display:inline-block;background:linear-gradient(90deg,#ff8a00,#e52e71);color:#fff;border-radius:999px;padding:1px 11px;font-size:12.5px;font-weight:700;letter-spacing:.5px;line-height:1.8;white-space:nowrap;}\n.khq-tn .v3-title{font-weight:700;color:#8c2d10;font-size:1.04em;}\n.khq-tn .khq-tn-v3.promo .v3-title{font-size:1.12em;background:linear-gradient(90deg,#d95f00,#c41f5f);-webkit-background-clip:text;background-clip:text;color:transparent;}\n.khq-tn .v3-body{color:#4a3a33;}\n.khq-tn .v3-body p{margin:6px 0;}\n.khq-tn .v3-body ul{margin:6px 0 6px 1.2em;padding:0;}\n.khq-tn .v3-body .khq-tn-fig{margin:12px 0 4px;}\n.khq-tn .v3-body .khq-tn-fig img{border-color:#f3d2c2;}\n.khq-tn .v3-body .khq-tn-fig img{max-height:480px;width:auto;object-fit:contain;}\n.khq-tn .v3-body .khq-tn-figrow{margin:10px 0 0;}\n.khq-tn .v3-cta{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;}\n.khq-tn .v3-btn{display:inline-block;border-radius:999px;padding:7px 18px;font-weight:700;font-size:14.5px;line-height:1.5;text-decoration:none!important;border-bottom:0!important;}\n.khq-tn .v3-btn.primary{background:linear-gradient(90deg,#ff8a00,#e52e71);color:#fff!important;box-shadow:0 6px 16px rgba(229,46,113,.25);}\n.khq-tn .v3-btn.primary:hover{filter:brightness(1.06);}\n.khq-tn .v3-btn.ghost{background:#fff;color:#c2410c!important;border:1px solid #f5b58f!important;}\n.khq-tn .khq-tn-v3grid{margin:22px 0 26px;padding:20px;border-radius:18px;background:linear-gradient(135deg,#1d1433 0%,#3b1732 100%);color:#f4e9ef;}\n.khq-tn .v3-grid-head{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:14px;}\n.khq-tn .v3-grid-head b{font-size:1.2em;color:#fff;}\n.khq-tn .v3-grid-head .v3-sub{flex-basis:100%;color:#d9c3cf;font-size:.95em;}\n.khq-tn .v3-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;}\n.khq-tn .v3-tile{background:rgba(255,255,255,.06);border:1px solid rgba(255,160,120,.25);border-radius:12px;padding:14px;}\n.khq-tn .v3-ico{font-size:24px;line-height:1.2;}\n.khq-tn .v3-tt{font-weight:700;color:#ffb36b;margin:6px 0 4px;}\n.khq-tn .v3-td{font-size:.93em;color:#efe2ea;line-height:1.65;}\n.khq-tn .v3-v2{margin-top:8px;font-size:.82em;color:#a8909c;}\n.khq-tn .khq-tn-v3grid .v3-note{color:#c9aebb;font-size:.85em;margin:12px 0 0;}\n.khq-tn .khq-tn-v3grid .v3-btn.ghost{background:transparent;color:#ffcfae!important;border-color:rgba(255,190,150,.6)!important;}\n.khq-tn .khq-tn-v3end{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;margin:34px 0 8px;padding:18px 22px;border-radius:16px;background:linear-gradient(120deg,#1d1433 0%,#4a1636 100%);color:#f4e9ef;}\n.khq-tn .v3-end-l{flex:1 1 380px;}\n.khq-tn .v3-end-t{display:inline-block;margin-left:8px;font-weight:700;font-size:1.1em;color:#fff;}\n.khq-tn .khq-tn-v3end ul{list-style:none;margin:10px 0 0;padding:0;}\n.khq-tn .khq-tn-v3end li{position:relative;padding-left:22px;margin:4px 0;color:#efe2ea;font-size:.95em;}\n.khq-tn .khq-tn-v3end li::before{content:\"\u2713\";position:absolute;left:0;color:#ffb36b;font-weight:700;}\n.khq-tn .khq-tn-v3end .v3-note{color:#c9aebb;font-size:.82em;margin:8px 0 0;}\n.khq-tn .khq-tn-v3end .v3-cta{flex-direction:column;margin:0;}\n.khq-tn .khq-tn-v3end .v3-btn{text-align:center;}\n.khq-tn .khq-tn-v3end .v3-btn.ghost{background:transparent;color:#ffcfae!important;border-color:rgba(255,190,150,.6)!important;}\n.khq-tn .v3-cases{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:10px 0 8px;}\n.khq-tn .v3-case{display:block;background:#fff;border:1px solid #f5c7ab;border-radius:12px;padding:12px 14px;text-decoration:none!important;border-bottom:1px solid #f5c7ab!important;transition:box-shadow .15s,transform .15s;}\n.khq-tn .v3-case:hover{box-shadow:0 8px 20px rgba(229,46,113,.14);transform:translateY(-1px);}\n.khq-tn .v3-case .c-t{display:flex;align-items:center;gap:8px;font-weight:700;color:#b33a12;font-size:1.02em;}\n.khq-tn .v3-case .c-tag{font-size:11.5px;font-weight:700;color:#fff;background:linear-gradient(90deg,#ff8a00,#e52e71);border-radius:999px;padding:0 8px;line-height:1.7;}\n.khq-tn .v3-case .c-d{color:#5a4a42;font-size:.92em;line-height:1.65;margin-top:4px;}\n.khq-tn .v3-case .c-go{color:#c2410c;font-size:.9em;font-weight:700;margin-top:6px;}\n.khq-tn .v3-cases > p,.khq-tn .v3-cases > br{display:none;}\n.khq-tn .v3-warn{margin:12px 0 4px;padding:10px 14px;border-radius:10px;background:#fff4e5;border:1px dashed #f0a35e;color:#8a4b12;font-size:.93em;line-height:1.7;}\n.khq-tn .v3-warn b{color:#b45309;}\n@media (max-width:640px){.khq-tn .v3-cases{grid-template-columns:1fr;}}\n@media (max-width:900px){.khq-tn .v3-tiles{grid-template-columns:repeat(2,1fr);}}\n@media (max-width:600px){.khq-tn .v3-tiles{grid-template-columns:1fr;}.khq-tn .khq-tn-v3end .v3-cta{flex-direction:row;}}\n<\/style>\n<style>.khq-tn-ver .plat{display:inline-block;margin-left:6px;padding:1px 8px;border-radius:10px;font-size:.82em;background:#eef3f9;color:#2b4a6f;border:1px solid #d7e2ef}.khq-tn-ver .plat.no{background:#f6f6f6;color:#999;text-decoration:line-through;border-color:#e5e5e5}.khq-web-manual pre{white-space:pre-wrap}<\/style>\n<div class=\"khq-web-manual khq-tn\">\n<div class=\"khq-tn-ver\">\u9002\u7528\u7248\u672c <span class=\"ver ver-v2\">V2<\/span><span class=\"ver ver-v3\">V3<\/span><\/div>\n\n<div class=\"khq-tn-video\" data-tn=\"3.1\"><video controls preload=\"none\" playsinline poster=\"\/khQuant\/media\/tutorial-new\/tn-3.1.jpg?v=0f423965\" src=\"\/khQuant\/media\/tutorial-new\/tn-3.1.mp4?v=0f423965\">\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u89c6\u9891\u64ad\u653e\uff0c\u53ef\u4ee5<a href=\"\/khQuant\/media\/tutorial-new\/tn-3.1.mp4?v=0f423965\">\u4e0b\u8f7d\u89c6\u9891<\/a>\u89c2\u770b\u3002<\/video><\/div>\n\n\n<div class=\"khq-tn-callout tip\"><div class=\"lbl\">\u5148\u8bfb\u8fd9\u91cc\uff1a\u7c97\u8bfb\u5373\u53ef\uff0c\u7528\u65f6\u518d\u67e5<\/div><p>\u56de\u8c03\u51fd\u6570\u3001data \u5b57\u5178\u91cc\u7684\u5b57\u6bb5\u3001\u4ea4\u6613\u4fe1\u53f7\u7684\u683c\u5f0f\u7b49\u6846\u67b6\u89c4\u5219\u7684\u5b8c\u6574\u5b9a\u4e49\u90fd\u5df2\u7ecf\u5199\u8fdb khQuant Skill\uff08\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/khquant-skill\/\">3.3<\/a>\uff09\u3002\u7528 AI \u5199\u7b56\u7565\u65f6\uff0cAI \u4f1a\u81ea\u5df1\u53bb\u67e5\u8fd9\u4e9b\u89c4\u5219\uff0c\u4f60\u5e76\u4e0d\u9700\u8981\u6df1\u5165\u638c\u63e1\u6846\u67b6\u7ec6\u8282\u3002\u8fd9\u4e00\u7bc7\u7c97\u7565\u8bfb\u4e00\u904d\u3001\u77e5\u9053\u6709\u54ea\u4e9b\u4e1c\u897f\u5c31\u591f\u4e86\uff0c\u4ee5\u540e\u9700\u8981\u65f6\u518d\u628a\u5b83\u5f53\u624b\u518c\u67e5\u9605\u3002\u60f3\u76f4\u63a5\u8ba9 AI \u5e2e\u4f60\u5199\u7b56\u7565\uff0c\u770b <a href=\"https:\/\/khsci.com\/khQuant\/ai-strategy\/\">3.4<\/a>\uff1bV3 \u7528\u6237\u7684\u4e0a\u624b\u8def\u7ebf\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/cli\/\">2.2<\/a>\u3002<\/p><\/div>\n\n<p class=\"khq-tn-lead\" style=\"font-size:17px;line-height:1.75;color:#163b68;background:#f3f7fc;border-left:4px solid #2b6cb0;padding:12px 18px;border-radius:8px;margin:18px 0 26px;\"><strong>\u672c\u7bc7\u91cd\u70b9\uff1a<\/strong>\u672c\u7bc7\u8bb2\u7b56\u7565\u7531\u54ea\u4e9b\u6587\u4ef6\u7ec4\u6210\u3001\u6846\u67b6\u4ec0\u4e48\u65f6\u5019\u8c03\u7528\u4f60\u7684\u51fd\u6570\u3001\u4f20\u8fdb\u6765\u4ec0\u4e48\u6570\u636e\u3001\u8981\u8fd4\u56de\u4ec0\u4e48\u4fe1\u53f7\uff0c\u6700\u540e\u4ece\u96f6\u5199\u4e00\u4e2a\u53cc\u5747\u7ebf\u7b56\u7565\u3002<\/p>\n\n<p>\u672c\u7bc7\u662f\u7b2c 3 \u90e8\u5206\u300c\u7b56\u7565\u7f16\u5199\u300d\u7684\u7b2c\u4e00\u7bc7\u3002\u8bfb\u8fd9\u7bc7\u4e4b\u524d\uff0c\u6700\u597d\u5df2\u7ecf\u6309 <a href=\"https:\/\/khsci.com\/khQuant\/chapter4\/\">1.5 \u8dd1\u901a\u7b2c\u4e00\u4e2a\u56de\u6d4b<\/a> \u8dd1\u901a\u8fc7\u4e00\u6b21\u56de\u6d4b\uff0c\u5e76\u770b\u8fc7 <a href=\"https:\/\/khsci.com\/khQuant\/chapter6\/\">1.7 \u56de\u6d4b\u914d\u7f6e\u8be6\u89e3<\/a> \u548c <a href=\"https:\/\/khsci.com\/khQuant\/chapter7\/\">1.8 \u89e6\u53d1\u65b9\u5f0f\u4e0e\u76d8\u524d\u76d8\u540e<\/a>\u3002\u672c\u7bc7\u8bb2\u7b56\u7565\u6587\u4ef6\u600e\u4e48\u5199\u3001\u6846\u67b6\u600e\u4e48\u8c03\u7528\u5b83\uff0c\u51fd\u6570\u7684\u5b8c\u6574\u6e05\u5355\u653e\u5728 <a href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\">3.2 \u7b56\u7565\u5de5\u5177\u7bb1<\/a>\u3002<\/p>\n\n<h2>1 \u7b56\u7565\u7531\u54ea\u4e24\u4e2a\u6587\u4ef6\u7ec4\u6210<\/h2>\n<p>\u6253\u5f00\u7b56\u7565\u76ee\u5f55\u5c31\u80fd\u770b\u5230\uff0c\u81ea\u5e26\u7684\u6bcf\u4e2a\u793a\u4f8b\u90fd\u662f\u540c\u540d\u7684\u4e00\u5bf9\u6587\u4ef6\uff1a<code>.kh<\/code> \u662f\u56de\u6d4b\u914d\u7f6e\uff0c<code>.py<\/code> \u662f\u7b56\u7565\u4ee3\u7801\u3002<\/p>\n<figure class=\"khq-tn-fig\"><a href=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/v3\/v3-fw-files.webp?v=13985e28\" target=\"_blank\" rel=\"noopener\" title=\"\u70b9\u51fb\u67e5\u770b\u539f\u56fe\"><img decoding=\"async\" src=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/v3\/v3-fw-files.webp?v=13985e28\" width=\"700\" height=\"326\" alt=\"\u7b56\u7565\u76ee\u5f55\u91cc\u7684\u81ea\u5e26\u793a\u4f8b\uff1a\u6bcf\u4e2a\u7b56\u7565\u90fd\u662f\u540c\u540d\u7684 .kh + .py\" loading=\"lazy\"><\/a><figcaption>\u7b56\u7565\u76ee\u5f55\u91cc\u7684\u81ea\u5e26\u793a\u4f8b\uff1a\u6bcf\u4e2a\u7b56\u7565\u90fd\u662f\u540c\u540d\u7684 .kh + .py<\/figcaption><\/figure>\n<h3>1.1 <code>.py<\/code>\uff1a\u7b56\u7565\u4ee3\u7801<\/h3>\n<p>\u7b56\u7565\u6587\u4ef6\u5c31\u662f\u4e00\u4e2a\u666e\u901a\u7684 Python \u6587\u4ef6\u3002\u7b2c\u4e00\u884c\u901a\u5e38\u662f\uff1a<\/p>\n<pre><code>from khQuantImport import *<\/code><\/pre>\n<p>\u8fd9\u4e00\u884c\u628a\u6846\u67b6\u63d0\u4f9b\u7684\u5de5\u5177\u51fd\u6570\uff08<code>khGet<\/code>\u3001<code>khPrice<\/code>\u3001<code>khHas<\/code>\u3001<code>khMA<\/code>\u3001<code>khHistory<\/code>\u3001<code>generate_signal<\/code> \u7b49\uff09\u3001MyTT \u6307\u6807\u51fd\u6570\uff08<code>MA<\/code>\u3001<code>RSI<\/code>\u3001<code>MACD<\/code> \u7b49\uff09\u4ee5\u53ca <code>logging<\/code>\u3001<code>np<\/code>\u3001<code>pd<\/code>\u3001\u7c7b\u578b\u6ce8\u89e3\u7528\u7684 <code>Dict<\/code>\u3001<code>List<\/code> \u4e00\u6b21\u6027\u5bfc\u5165\u3002\u540e\u9762\u7684\u4f8b\u5b50\u90fd\u9ed8\u8ba4\u5199\u4e86\u8fd9\u4e00\u884c\u3002<\/p>\n<p>\u6587\u4ef6\u91cc\u4e0d\u9700\u8981\u5199\u4e3b\u7a0b\u5e8f\uff0c\u4e5f\u4e0d\u7528\u81ea\u5df1\u5faa\u73af\u884c\u60c5\u3002\u53ea\u8981\u6309\u7ea6\u5b9a\u7684\u540d\u5b57\u5199\u597d\u56de\u8c03\u51fd\u6570\uff0c\u6846\u67b6\u4f1a\u5728\u5408\u9002\u7684\u65f6\u5019\u8c03\u7528\u5b83\u4eec\u3002<\/p>\n\n<h3>1.2 <code>.kh<\/code>\uff1a\u56de\u6d4b\u914d\u7f6e<\/h3>\n<p><code>.kh<\/code> \u662f JSON \u683c\u5f0f\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4fdd\u5b58\u4e00\u6b21\u56de\u6d4b\u7684\u5168\u90e8\u53c2\u6570\u3002\u5728\u8f6f\u4ef6\u91cc\u70b9\u300c\u4fdd\u5b58\u914d\u7f6e\u300d\u5f97\u5230\u7684\u5c31\u662f\u5b83\uff0c\u4e00\u822c\u4e0d\u9700\u8981\u624b\u6539\u3002\u548c\u5199\u7b56\u7565\u5173\u7cfb\u6700\u5927\u7684\u51e0\u9879\u662f\uff1a<\/p>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u914d\u7f6e\u9879<\/th><th>\u542b\u4e49<\/th><th>\u5bf9\u7b56\u7565\u7684\u5f71\u54cd<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>strategy_file<\/code><\/td><td>\u5bf9\u5e94\u7684 <code>.py<\/code> \u6587\u4ef6<\/td><td>\u76f8\u5bf9\u8def\u5f84\u4ee5 <code>.kh<\/code> \u6240\u5728\u76ee\u5f55\u4e3a\u51c6<\/td><\/tr>\n<tr><td><code>backtest.start_time<\/code> \/ <code>end_time<\/code><\/td><td>\u56de\u6d4b\u533a\u95f4<\/td><td>\u51b3\u5b9a <code>khHandlebar<\/code> \u4ece\u54ea\u5929\u8dd1\u5230\u54ea\u5929<\/td><\/tr>\n<tr><td><code>backtest.init_capital<\/code><\/td><td>\u521d\u59cb\u8d44\u91d1<\/td><td>\u51b3\u5b9a <code>cash<\/code> \u7684\u8d77\u59cb\u503c<\/td><\/tr>\n<tr><td><code>backtest.trigger.type<\/code><\/td><td>\u89e6\u53d1\u65b9\u5f0f\uff1a<code>tick<\/code>\u3001<code>1m<\/code>\u3001<code>5m<\/code>\u3001<code>1d<\/code>\u3001<code>custom<\/code><\/td><td>\u51b3\u5b9a <code>khHandlebar<\/code> \u591a\u4e45\u88ab\u8c03\u7528\u4e00\u6b21<\/td><\/tr>\n<tr><td><code>backtest.trade_cost<\/code><\/td><td>\u4f63\u91d1\u3001\u5370\u82b1\u7a0e\u3001\u6ed1\u70b9\u7b49<\/td><td>\u5f71\u54cd\u6210\u4ea4\u4ef7\u548c\u53ef\u4e70\u6570\u91cf<\/td><\/tr>\n<tr><td><code>data.kline_period<\/code><\/td><td>\u884c\u60c5\u5468\u671f<\/td><td>\u8981\u548c\u89e6\u53d1\u65b9\u5f0f\u5bf9\u5e94<\/td><\/tr>\n<tr><td><code>data.dividend_type<\/code><\/td><td>\u590d\u6743\u65b9\u5f0f<\/td><td><code>khPrice<\/code>\u3001<code>khMA<\/code>\u3001<code>khHistory<\/code> \u9ed8\u8ba4\u90fd\u8ddf\u968f\u5b83<\/td><\/tr>\n<tr><td><code>data.stock_list<\/code><\/td><td>\u80a1\u7968\u6c60<\/td><td>\u5c31\u662f <code>init<\/code> \u6536\u5230\u7684 <code>stock_codes<\/code><\/td><\/tr>\n<tr><td><code>market_callback<\/code><\/td><td>\u76d8\u524d\u3001\u76d8\u540e\u56de\u8c03\u7684\u5f00\u5173\u548c\u65f6\u95f4<\/td><td>\u4e0d\u6253\u5f00\u65f6 <code>khPreMarket<\/code>\u3001<code>khPostMarket<\/code> \u4e0d\u4f1a\u88ab\u8c03\u7528<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>\u5404\u9879\u5728\u754c\u9762\u4e0a\u5bf9\u5e94\u54ea\u91cc\uff0c\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter6\/\">1.7<\/a>\u3002V3 \u7528\u6237\u4e5f\u53ef\u4ee5\u4e0d\u5f00\u754c\u9762\uff0c\u7528\u547d\u4ee4\u884c <code>kh run \u914d\u7f6e.kh<\/code> \u76f4\u63a5\u56de\u6d4b\uff0c\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/cli\/\">2.2 \u547d\u4ee4\u884c\u6a21\u5f0f\u4e0e AI \u667a\u80fd\u7b56\u7565\u7814\u7a76<\/a>\u3002<\/p>\n<div class=\"khq-tn-callout tip\"><div class=\"lbl\">\u63d0\u793a<\/div><p>\u5efa\u8bae\u628a <code>.py<\/code> \u548c <code>.kh<\/code> \u8d77\u540c\u6837\u7684\u540d\u5b57\u3001\u653e\u5728\u540c\u4e00\u4e2a\u6587\u4ef6\u5939\uff0c\u4f8b\u5982 <code>\u6211\u7684\u7b56\u7565.py<\/code> + <code>\u6211\u7684\u7b56\u7565.kh<\/code>\u3002\u8f6f\u4ef6\u81ea\u5e26\u7684\u6848\u4f8b\u90fd\u662f\u8fd9\u6837\u6210\u5bf9\u653e\u7684\u3002<\/p><\/div>\n\n<h2>2 \u56de\u8c03\u51fd\u6570\uff1a\u6846\u67b6\u4ec0\u4e48\u65f6\u5019\u8c03\u7528\u4f60\u7684\u4ee3\u7801<\/h2>\n<h3>2.1 \u4e00\u6b21\u56de\u6d4b\u91cc\u7684\u8c03\u7528\u987a\u5e8f<\/h3>\n<p>\u4ee5\u65e5 K \u7ebf\u89e6\u53d1\u3001\u6253\u5f00\u4e86\u76d8\u524d\u76d8\u540e\u56de\u8c03\u4e3a\u4f8b\uff0c\u4e00\u6b21\u56de\u6d4b\u7684\u8fc7\u7a0b\u662f\uff1a<\/p>\n<ol>\n<li>\u56de\u6d4b\u5f00\u59cb\u524d\uff1a\u8c03\u7528\u4e00\u6b21 <code>init(stock_codes, init_data)<\/code>\u3002<\/li>\n<li>\u6bcf\u4e2a\u4ea4\u6613\u65e5\uff1a\n  <ol>\n  <li>\u5148\u8c03\u7528 <code>khPreMarket(data)<\/code>\uff08\u9ed8\u8ba4 08:30:00\uff09\uff1b<\/li>\n  <li>\u6bcf\u5230\u4e00\u4e2a\u89e6\u53d1\u70b9\u8c03\u7528\u4e00\u6b21 <code>khHandlebar(data)<\/code>\uff0c\u65e5\u7ebf\u89e6\u53d1\u5c31\u662f\u6bcf\u5929\u4e00\u6b21\uff1b<\/li>\n  <li>\u5f53\u5929\u884c\u60c5\u7ed3\u675f\u540e\u8c03\u7528 <code>khPostMarket(data)<\/code>\uff08\u9ed8\u8ba4 15:30:00\uff09\u3002<\/li>\n  <\/ol>\n<\/li>\n<li>\u6240\u6709\u4ea4\u6613\u65e5\u8dd1\u5b8c\uff0c\u751f\u6210\u56de\u6d4b\u7ed3\u679c\u3002<\/li>\n<\/ol>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u51fd\u6570<\/th><th>\u662f\u5426\u5fc5\u987b<\/th><th>\u4ec0\u4e48\u65f6\u5019\u8c03\u7528<\/th><th>\u8fd4\u56de\u503c<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>init(stock_codes, init_data)<\/code><\/td><td>\u5fc5\u987b\u5199<\/td><td>\u56de\u6d4b\u5f00\u59cb\u524d\u4e00\u6b21<\/td><td>\u4e0d\u9700\u8981\u8fd4\u56de<\/td><\/tr>\n<tr><td><code>khHandlebar(data)<\/code><\/td><td>\u5fc5\u987b\u5199<\/td><td>\u6bcf\u4e2a\u89e6\u53d1\u70b9\u4e00\u6b21<\/td><td>\u4fe1\u53f7\u5217\u8868<\/td><\/tr>\n<tr><td><code>khPreMarket(data)<\/code><\/td><td>\u53ef\u9009<\/td><td>\u5f00\u542f\u76d8\u524d\u56de\u8c03\u540e\uff0c\u6bcf\u4e2a\u4ea4\u6613\u65e5\u5f00\u76d8\u524d\u4e00\u6b21<\/td><td>\u4fe1\u53f7\u5217\u8868<\/td><\/tr>\n<tr><td><code>khPostMarket(data)<\/code><\/td><td>\u53ef\u9009<\/td><td>\u5f00\u542f\u76d8\u540e\u56de\u8c03\u540e\uff0c\u6bcf\u4e2a\u4ea4\u6613\u65e5\u6536\u76d8\u540e\u4e00\u6b21<\/td><td>\u4fe1\u53f7\u5217\u8868<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n\n<h3>2.2 <code>init(stock_codes, init_data)<\/code>\uff1a\u5f00\u59cb\u524d\u8c03\u7528\u4e00\u6b21<\/h3>\n<ul>\n<li><code>stock_codes<\/code>\uff1a\u80a1\u7968\u6c60\u4ee3\u7801\u5217\u8868\uff0c\u4f8b\u5982 <code>&#91;'000001.SZ', '600000.SH']<\/code>\u3002<\/li>\n<li><code>init_data<\/code>\uff1a\u5305\u542b <code>__account__<\/code>\uff08\u521d\u59cb\u8d44\u91d1\uff09\u3001<code>__positions__<\/code>\uff08\u6b64\u65f6\u4e3a\u7a7a\uff09\u3001<code>__stock_list__<\/code>\u3001<code>__framework__<\/code> \u548c <code>__current_time__<\/code>\u3002\u6ce8\u610f\u8fd9\u91cc\u7684 <code>__current_time__<\/code> \u662f\u7535\u8111\u5f53\u524d\u7684\u65f6\u95f4\uff0c\u4e0d\u662f\u56de\u6d4b\u5f00\u59cb\u65e5\u671f\uff0c\u4e0d\u8981\u62ff\u5b83\u505a\u65e5\u671f\u5224\u65ad\u3002<\/li>\n<li>\u9002\u5408\u505a\u7684\u4e8b\uff1a\u6253\u5370\u53c2\u6570\u3001\u521d\u59cb\u5316\u5168\u5c40\u53d8\u91cf\u3001\u8bfb\u53d6\u5916\u90e8\u6587\u4ef6\u3001\u7528 <code>khAddExtraFields<\/code> \u767b\u8bb0\u8981\u9884\u52a0\u8f7d\u7684\u81ea\u5b9a\u4e49\u6307\u6807\uff08\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\">3.2<\/a>\uff09\u3002<\/li>\n<\/ul>\n<p>\u5373\u4f7f\u4ec0\u4e48\u90fd\u4e0d\u505a\uff0c\u4e5f\u8981\u5199\u4e0a <code>init<\/code>\uff0c\u51fd\u6570\u4f53\u5199 <code>pass<\/code> \u5373\u53ef\u3002\u6846\u67b6\u4f1a\u76f4\u63a5\u8c03\u7528\u5b83\uff0c\u7f3a\u4e86\u8fd9\u4e2a\u51fd\u6570\u6216\u8005\u53c2\u6570\u4e2a\u6570\u4e0d\u5bf9\uff08\u4f8b\u5982\u5199\u6210 <code>def init():<\/code>\uff09\uff0c\u56de\u6d4b\u4f1a\u5728\u5f00\u59cb\u65f6\u62a5\u9519\u9000\u51fa\u3002\u53c2\u6570\u540d\u53ef\u4ee5\u81ea\u5df1\u8d77\uff08\u5185\u7f6e\u6848\u4f8b\u91cc\u5199\u6210 <code>stocks=None, data=None<\/code>\uff09\uff0c\u4f46\u5fc5\u987b\u80fd\u63a5\u6536\u8fd9\u4e24\u4e2a\u53c2\u6570\uff1b\u672c\u6559\u7a0b\u7edf\u4e00\u5199 <code>stock_codes, init_data<\/code>\u3002<\/p>\n\n<h3>2.3 <code>khHandlebar(data)<\/code>\uff1a\u6bcf\u4e2a\u89e6\u53d1\u70b9\u8c03\u7528\u4e00\u6b21<\/h3>\n<p>\u8fd9\u662f\u5199\u4ea4\u6613\u903b\u8f91\u7684\u5730\u65b9\u3002\u8c03\u7528\u9891\u7387\u7531\u89e6\u53d1\u65b9\u5f0f\u51b3\u5b9a\uff1aTick \u89e6\u53d1\u6bcf\u7b14 tick \u4e00\u6b21\uff0c1 \u5206\u949f\/5 \u5206\u949f\u89e6\u53d1\u6bcf\u6839 K \u7ebf\u4e00\u6b21\uff0c\u65e5 K \u7ebf\u89e6\u53d1\u6bcf\u4e2a\u4ea4\u6613\u65e5\u4e00\u6b21\uff0c\u81ea\u5b9a\u4e49\u5b9a\u65f6\u89e6\u53d1\u5728\u6bcf\u4e2a\u8bbe\u5b9a\u65f6\u95f4\u70b9\u4e00\u6b21\uff08\u8be6\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter7\/\">1.8<\/a>\uff09\u3002<\/p>\n<ul>\n<li>\u53c2\u6570 <code>data<\/code>\uff1a\u5f53\u524d\u89e6\u53d1\u70b9\u7684\u65f6\u95f4\u3001\u5168\u90e8\u80a1\u7968\u7684\u884c\u60c5\u3001\u8d26\u6237\u3001\u6301\u4ed3\uff0c\u7ed3\u6784\u89c1\u7b2c 3 \u8282\u3002<\/li>\n<li>\u8fd4\u56de\u503c\uff1a\u4fe1\u53f7\u5217\u8868 <code>List&#91;Dict]<\/code>\u3002\u6ca1\u6709\u64cd\u4f5c\u5c31\u8fd4\u56de\u7a7a\u5217\u8868 <code>&#91;]<\/code>\uff0c\u4e0d\u8981\u8fd4\u56de\u5217\u8868\u4ee5\u5916\u7684\u7c7b\u578b\u3002<\/li>\n<\/ul>\n<p>\u67d0\u4e2a\u89e6\u53d1\u70b9\u4e0a\u5982\u679c\u80a1\u7968\u6c60\u91cc\u6240\u6709\u80a1\u7968\u90fd\u6ca1\u6709\u884c\u60c5\uff08\u4f8b\u5982\u5168\u90e8\u505c\u724c\uff09\uff0c\u6846\u67b6\u4f1a\u8df3\u8fc7\u8fd9\u4e00\u6b21\u8c03\u7528\uff0c\u5e76\u5728\u65e5\u5fd7\u91cc\u7ed9\u51fa\u8b66\u544a\u3002<\/p>\n\n<h3>2.4 <code>khPreMarket(data)<\/code>\uff1a\u76d8\u524d\u56de\u8c03<\/h3>\n<ul>\n<li>\u8981\u5728\u754c\u9762\u300c\u76d8\u524d\u76d8\u540e\u89e6\u53d1\u8bbe\u7f6e\u300d\u91cc\u52fe\u9009\u300c\u89e6\u53d1\u76d8\u524d\u56de\u8c03\u300d\uff08\u5373 <code>.kh<\/code> \u91cc <code>market_callback.pre_market_enabled<\/code> \u4e3a <code>true<\/code>\uff09\u624d\u4f1a\u88ab\u8c03\u7528\uff0c\u9ed8\u8ba4\u65f6\u95f4 08:30:00\u3002<\/li>\n<li><code>data<\/code> \u91cc\u7684\u884c\u60c5\u662f<strong>\u4e0a\u4e00\u4e2a\u4ea4\u6613\u65e5\u6700\u540e\u4e00\u6839 K \u7ebf<\/strong>\uff0c\u770b\u4e0d\u5230\u5f53\u5929\u5f00\u76d8\u540e\u7684\u4ef7\u683c\uff0c\u8fd9\u6837\u4e0d\u4f1a\u7528\u5230\u672a\u6765\u6570\u636e\u3002\u56de\u6d4b\u7b2c\u4e00\u5929\u6ca1\u6709\u4e0a\u4e00\u4e2a\u4ea4\u6613\u65e5\uff0c\u8fd9\u5929\u7684 <code>data<\/code> \u91cc\u6ca1\u6709\u4e2a\u80a1\u884c\u60c5\uff0c\u53ea\u6709\u65f6\u95f4\u3001\u8d26\u6237\u548c\u6301\u4ed3\uff0c\u4ee3\u7801\u91cc\u8981\u5224\u65ad\u3002<\/li>\n<li>\u8fd4\u56de\u7684\u4fe1\u53f7\u4f1a\u8f6c\u6210\u5f53\u5929\u6709\u6548\u7684\u9650\u4ef7\u6302\u5355\uff08\u6ca1\u5199 <code>order_type<\/code> \u65f6\u6309 <code>limit<\/code>\uff0c\u6ca1\u5199 <code>time_in_force<\/code> \u65f6\u6309 <code>day<\/code>\uff09\uff0c\u5f00\u76d8\u540e\u884c\u60c5\u6ee1\u8db3\u4ef7\u683c\u624d\u6210\u4ea4\uff0c\u5f53\u5929\u6536\u76d8\u4ecd\u672a\u6210\u4ea4\u5c31\u4f5c\u5e9f\u3002<\/li>\n<li>\u5e38\u89c1\u7528\u9014\uff1a\u6bcf\u5929\u9009\u80a1\u3001\u91cd\u7f6e\u5f53\u5929\u7684\u8ba1\u6570\u5668\u548c\u72b6\u6001\u53d8\u91cf\u3002<\/li>\n<\/ul>\n\n<h3>2.5 <code>khPostMarket(data)<\/code>\uff1a\u76d8\u540e\u56de\u8c03<\/h3>\n<ul>\n<li>\u8981\u52fe\u9009\u300c\u89e6\u53d1\u76d8\u540e\u56de\u8c03\u300d\uff08<code>market_callback.post_market_enabled<\/code>\uff09\u624d\u4f1a\u88ab\u8c03\u7528\uff0c\u9ed8\u8ba4\u65f6\u95f4 15:30:00\u3002<\/li>\n<li><code>data<\/code> \u91cc\u7684\u884c\u60c5\u662f\u5f53\u5929\u6700\u540e\u4e00\u6839 K \u7ebf\uff0c\u8d26\u6237\u548c\u6301\u4ed3\u662f\u5f53\u5929\u4ea4\u6613\u540e\u7684\u72b6\u6001\u3002<\/li>\n<li>\u8fd4\u56de\u7684\u4fe1\u53f7\u4e00\u5f8b\u8f6c\u6210<strong>\u4e0b\u4e00\u4e2a\u4ea4\u6613\u65e5<\/strong>\u7684\u9650\u4ef7\u6302\u5355\uff0c\u6709\u6548\u5230\u4e0b\u4e00\u4e2a\u4ea4\u6613\u65e5\u6536\u76d8\u3002\u56de\u6d4b\u6700\u540e\u4e00\u5929\u7684\u76d8\u540e\u4fe1\u53f7\u6ca1\u6709\u540e\u7eed\u884c\u60c5\uff0c\u4e0d\u4f1a\u6210\u4ea4\u3002<\/li>\n<li>\u5e38\u89c1\u7528\u9014\uff1a\u8bb0\u5f55\u5f53\u5929\u6301\u4ed3\u548c\u8d44\u4ea7\u3001\u8ba1\u7b97\u7b2c\u4e8c\u5929\u8981\u7528\u7684\u6570\u636e\u3001\u63d0\u524d\u6302\u597d\u6b21\u65e5\u7684\u5355\u3002<\/li>\n<\/ul>\n\n\n<h2>3 <code>data<\/code> \u5b57\u5178\u91cc\u6709\u4ec0\u4e48<\/h2>\n<h3>3.1 \u7ed3\u6784\u603b\u89c8<\/h3>\n<p><code>khHandlebar<\/code>\u3001<code>khPreMarket<\/code>\u3001<code>khPostMarket<\/code> \u6536\u5230\u7684 <code>data<\/code> \u7ed3\u6784\u76f8\u540c\uff1a<\/p>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u952e<\/th><th>\u7c7b\u578b<\/th><th>\u5185\u5bb9<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>\"__current_time__\"<\/code><\/td><td>dict<\/td><td>\u5f53\u524d\u65f6\u95f4<\/td><\/tr>\n<tr><td><code>\"__account__\"<\/code><\/td><td>dict<\/td><td>\u8d26\u6237\u8d44\u91d1<\/td><\/tr>\n<tr><td><code>\"__positions__\"<\/code><\/td><td>dict<\/td><td>\u6301\u4ed3\uff0c\u952e\u4e3a\u80a1\u7968\u4ee3\u7801<\/td><\/tr>\n<tr><td><code>\"__stock_list__\"<\/code><\/td><td>list<\/td><td>\u80a1\u7968\u6c60\u4ee3\u7801\u5217\u8868<\/td><\/tr>\n<tr><td><code>\"__framework__\"<\/code><\/td><td>\u5bf9\u8c61<\/td><td>\u6846\u67b6\u672c\u8eab\uff0c\u4e00\u822c\u7528\u4e0d\u5230\uff0c\u8bfb\u53d6\u56de\u6d4b\u914d\u7f6e\u65f6\u4f1a\u7528\uff08\u89c1\u7b2c 3.6 \u8282\uff09<\/td><\/tr>\n<tr><td>\u80a1\u7968\u4ee3\u7801\uff0c\u5982 <code>\"000001.SZ\"<\/code><\/td><td>pandas.Series<\/td><td>\u8fd9\u53ea\u80a1\u7968\u5f53\u524d\u8fd9\u6839 K \u7ebf\uff08\u6216\u8fd9\u7b14 tick\uff09\u7684\u884c\u60c5<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n\n<h3>3.2 \u65f6\u95f4\uff1a<code>__current_time__<\/code><\/h3>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u5b57\u6bb5<\/th><th>\u793a\u4f8b<\/th><th>\u5bf9\u5e94\u5199\u6cd5<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>date<\/code><\/td><td><code>\"2024-01-02\"<\/code><\/td><td><code>khGet(data, \"date\")<\/code><\/td><\/tr>\n<tr><td><code>time<\/code><\/td><td><code>\"09:31:00\"<\/code><\/td><td><code>khGet(data, \"time\")<\/code><\/td><\/tr>\n<tr><td><code>datetime<\/code><\/td><td><code>\"2024-01-02 09:31:00\"<\/code><\/td><td><code>khGet(data, \"datetime\")<\/code><\/td><\/tr>\n<tr><td><code>timestamp<\/code><\/td><td>Unix \u65f6\u95f4\u6233<\/td><td><code>khGet(data, \"timestamp\")<\/code><\/td><\/tr>\n<tr><td>\uff08\u7531 date \u6362\u7b97\uff09<\/td><td><code>\"20240102\"<\/code><\/td><td><code>khGet(data, \"date_num\")<\/code><\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p><code>date_num<\/code> \u5e38\u7528\u4f5c <code>khMA<\/code>\u3001<code>khHistory<\/code> \u7684\u622a\u6b62\u65e5\u671f\u53c2\u6570\uff0c\u7b2c 7 \u8282\u7684\u4f8b\u5b50\u4f1a\u7528\u5230\u3002<\/p>\n<p>\u5206\u949f\u6216 tick \u89e6\u53d1\u65f6\uff0c\u53ef\u4ee5\u6309\u65f6\u95f4\u6bb5\u63a7\u5236\u4ea4\u6613\uff1a<\/p>\n<pre><code>def khHandlebar(data: Dict) -&gt; List&#91;Dict]:\n    t = khGet(data, \"time\")              # \u4f8b\u5982 \"10:15:00\"\n    if not (\"10:00:00\" &lt;= t &lt;= \"14:30:00\"):\n        return &#91;]                        # \u8fd9\u4e2a\u65f6\u95f4\u6bb5\u4ee5\u5916\u4e0d\u4ea4\u6613\n    # \u2026\u2026\u4ea4\u6613\u903b\u8f91\u2026\u2026\n    return &#91;]<\/code><\/pre>\n<p>\u65e5 K \u7ebf\u89e6\u53d1\u65f6\uff0c<code>time<\/code> \u663e\u793a\u4e3a <code>09:30:00<\/code>\uff0c\u53ea\u662f\u65e5\u671f\u6807\u8bb0\uff0c\u4e0d\u4ee3\u8868\u771f\u5b9e\u65f6\u523b\uff0c\u4e0d\u8981\u7528\u5b83\u505a\u65f6\u6bb5\u5224\u65ad\u3002<\/p>\n\n<h3>3.3 \u884c\u60c5\uff1a\u4ee5\u80a1\u7968\u4ee3\u7801\u4e3a\u952e\u7684 Series<\/h3>\n<p>\u6bcf\u53ea\u80a1\u7968\u4e00\u4e2a <code>pandas.Series<\/code>\uff0c\u5305\u542b\u914d\u7f6e\u91cc <code>data.fields<\/code> \u9009\u7684\u5b57\u6bb5\uff0c\u9ed8\u8ba4\u6709 <code>open<\/code>\u3001<code>high<\/code>\u3001<code>low<\/code>\u3001<code>close<\/code>\u3001<code>volume<\/code>\u3001<code>amount<\/code>\u3001<code>preClose<\/code>\u3001<code>suspendFlag<\/code> \u7b49\u3002tick \u6570\u636e\u7684\u6700\u65b0\u4ef7\u5b57\u6bb5\u662f <code>lastPrice<\/code>\u3002<\/p>\n<p>\u76f4\u63a5\u5199 <code>data&#91;\"000001.SZ\"]&#91;\"close\"]<\/code> \u53ef\u4ee5\u53d6\u5230\uff0c\u4f46\u80a1\u7968\u5f53\u5929\u6ca1\u6709\u6570\u636e\u65f6\u4f1a\u51fa\u9519\u3002\u63a8\u8350\u7528 <code>khPrice<\/code>\uff1a<\/p>\n<pre><code>price = khPrice(data, \"000001.SZ\", \"open\")   # \u7b2c\u4e09\u4e2a\u53c2\u6570\u4e0d\u5199\u65f6\u53d6 close\nif price &lt;= 0:\n    return &#91;]                                # \u53d6\u4e0d\u5230\u65f6\u8fd4\u56de 0.0<\/code><\/pre>\n<div class=\"khq-tn-callout warn\"><div class=\"lbl\">\u6ce8\u610f<\/div><p>\u65e5 K \u7ebf\u89e6\u53d1\u65f6\uff0c<code>data<\/code> \u91cc\u5f53\u5929\u8fd9\u6839\u65e5\u7ebf\u662f\u5b8c\u6574\u7684\uff0c<code>high<\/code>\u3001<code>low<\/code>\u3001<code>close<\/code> \u90fd\u662f\u5168\u5929\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u7b56\u7565\u8bbe\u60f3\u662f\u300c\u5f00\u76d8\u65f6\u5224\u65ad\u3001\u5f00\u76d8\u65f6\u4e0b\u5355\u300d\uff0c\u5224\u65ad\u548c\u4e0b\u5355\u4ef7\u683c\u90fd\u53ea\u80fd\u7528 <code>open<\/code>\uff0c\u518d\u52a0\u4e0a\u524d\u51e0\u5929\u7684\u5386\u53f2\u6570\u636e\uff1b\u7528\u5f53\u5929\u7684 <code>close<\/code> \u505a\u5224\u65ad\u5c31\u7b49\u4e8e\u63d0\u524d\u77e5\u9053\u4e86\u6536\u76d8\u4ef7\uff0c\u56de\u6d4b\u7ed3\u679c\u4f1a\u865a\u9ad8\u3002\u8fd9\u4e5f\u662f\u7b2c 7 \u8282\u4f8b\u5b50\u7528\u5f00\u76d8\u4ef7\u7684\u539f\u56e0\u3002<\/p><\/div>\n\n<h3>3.4 \u8d26\u6237\uff1a<code>__account__<\/code><\/h3>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u5b57\u6bb5<\/th><th>\u542b\u4e49<\/th><th>\u5bf9\u5e94\u5199\u6cd5<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>cash<\/code><\/td><td>\u53ef\u7528\u8d44\u91d1<\/td><td><code>khGet(data, \"cash\")<\/code><\/td><\/tr>\n<tr><td><code>market_value<\/code><\/td><td>\u6301\u4ed3\u5e02\u503c<\/td><td><code>khGet(data, \"market_value\")<\/code><\/td><\/tr>\n<tr><td><code>total_asset<\/code><\/td><td>\u603b\u8d44\u4ea7<\/td><td><code>khGet(data, \"total_asset\")<\/code><\/td><\/tr>\n<tr><td><code>frozen_cash<\/code><\/td><td>\u51bb\u7ed3\u8d44\u91d1<\/td><td><code>data&#91;\"__account__\"]&#91;\"frozen_cash\"]<\/code><\/td><\/tr>\n<tr><td><code>benchmark<\/code><\/td><td>\u57fa\u51c6\u4ee3\u7801<\/td><td><code>data&#91;\"__account__\"]&#91;\"benchmark\"]<\/code><\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p><code>market_value<\/code> \u548c <code>total_asset<\/code> \u5728\u6bcf\u6b21\u8bb0\u5f55\u7ed3\u679c\u65f6\u6309\u6700\u65b0\u4ef7\u683c\u66f4\u65b0\uff1b\u5224\u65ad\u80fd\u4e0d\u80fd\u4e70\u3001\u80fd\u4e70\u591a\u5c11\uff0c\u4ee5 <code>cash<\/code> \u4e3a\u51c6\u3002<\/p>\n\n<h3>3.5 \u6301\u4ed3\uff1a<code>__positions__<\/code><\/h3>\n<p>\u952e\u662f\u80a1\u7968\u4ee3\u7801\uff0c\u503c\u662f\u8fd9\u53ea\u80a1\u7968\u7684\u6301\u4ed3\u4fe1\u606f\u3002\u6ca1\u6709\u6301\u4ed3\u7684\u80a1\u7968\u4e0d\u5728\u91cc\u9762\u3002\u5e38\u7528\u5b57\u6bb5\uff1a<\/p>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u5b57\u6bb5<\/th><th>\u542b\u4e49<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>volume<\/code><\/td><td>\u6301\u4ed3\u6570\u91cf\uff08\u80a1\uff09<\/td><\/tr>\n<tr><td><code>can_use_volume<\/code><\/td><td>\u53ef\u5356\u6570\u91cf\uff08\u80a1\uff09\u3002T+1 \u89c4\u5219\u4e0b\u5f53\u5929\u4e70\u5165\u7684\u90e8\u5206\u8981\u5230\u4e0b\u4e00\u4e2a\u4ea4\u6613\u65e5\u624d\u80fd\u5356<\/td><\/tr>\n<tr><td><code>avg_price<\/code><\/td><td>\u6301\u4ed3\u6210\u672c\u4ef7\uff08\u542b\u6ed1\u70b9\u7684\u6210\u4ea4\u5747\u4ef7\uff09<\/td><\/tr>\n<tr><td><code>current_price<\/code><\/td><td>\u6700\u8fd1\u4e00\u6b21\u8bb0\u5f55\u65f6\u7684\u4ef7\u683c<\/td><\/tr>\n<tr><td><code>market_value<\/code><\/td><td>\u6700\u8fd1\u4e00\u6b21\u8bb0\u5f55\u65f6\u7684\u6301\u4ed3\u5e02\u503c<\/td><\/tr>\n<tr><td><code>profit<\/code>\u3001<code>profit_ratio<\/code><\/td><td>\u6d6e\u52a8\u76c8\u4e8f\u548c\u76c8\u4e8f\u6bd4\u4f8b\uff0c\u5728\u6bcf\u6b21\u8bb0\u5f55\u7ed3\u679c\u540e\u624d\u66f4\u65b0\uff0c\u521a\u4e70\u5165\u7684\u90a3\u4e00\u6b21\u89e6\u53d1\u91cc\u8fd8\u6ca1\u6709<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>\u5224\u65ad\u6709\u6ca1\u6709\u6301\u4ed3\u7528 <code>khHas(data, code)<\/code>\uff0c\u5b83\u5728\u6301\u4ed3\u6570\u91cf\u5927\u4e8e 0 \u65f6\u8fd4\u56de <code>True<\/code>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u6309\u6210\u672c\u4ef7\u6b62\u635f\u7684\u5199\u6cd5\uff08\u7528\u5230\u7684 <code>generate_signal<\/code> \u89c1\u7b2c 4 \u8282\uff09\uff0c\u76c8\u4e8f\u6bd4\u4f8b\u81ea\u5df1\u7528\u5f53\u524d\u4ef7\u683c\u7b97\uff0c\u4e0d\u4f9d\u8d56 <code>profit_ratio<\/code> \u662f\u5426\u5df2\u66f4\u65b0\uff1a<\/p>\n<pre><code>def khHandlebar(data: Dict) -&gt; List&#91;Dict]:\n    signals = &#91;]\n    for code, pos in khGet(data, \"positions\").items():\n        price = khPrice(data, code, \"open\")\n        cost = pos.get(\"avg_price\", 0)\n        if price &lt;= 0 or cost &lt;= 0:\n            continue\n        if price \/ cost - 1 &lt; -0.05:                     # \u4e8f\u635f\u8d85\u8fc7 5%\n            signals.extend(generate_signal(data, code, price, 1.0, \"sell\", \"\u4e8f\u635f\u8d85\u8fc75%\u6b62\u635f\"))\n    return signals<\/code><\/pre>\n<p>\u8981\u77e5\u9053\u4e00\u53ea\u80a1\u7968\u73b0\u5728\u80fd\u5356\u591a\u5c11\uff0c\u8bfb\u6301\u4ed3\u91cc\u7684 <code>can_use_volume<\/code>\uff08\u53ef\u5356\u6570\u91cf\uff09\uff0c\u4f8b\u5982 <code>khGet(data, \"positions\")&#91;code].get(\"can_use_volume\", 0)<\/code>\u3002<\/p>\n\n<h3>3.6 \u5e38\u7528\u53d6\u503c\u51fd\u6570\u4e00\u89c8<\/h3>\n<p>\u4e0a\u9762\u5404\u5c0f\u8282\u7528\u5230\u7684\u53d6\u503c\u65b9\u6cd5\u6c47\u603b\u5982\u4e0b\uff0c\u5b8c\u6574\u7684\u51fd\u6570\u6e05\u5355\u548c\u66f4\u591a\u53c2\u6570\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\">3.2 \u7b56\u7565\u5de5\u5177\u7bb1<\/a>\u3002<\/p>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u5199\u6cd5<\/th><th>\u8fd4\u56de<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>khGet(data, \"first_stock\")<\/code><\/td><td>\u80a1\u7968\u6c60\u7b2c\u4e00\u53ea\u80a1\u7968\u4ee3\u7801<\/td><\/tr>\n<tr><td><code>khGet(data, \"stocks\")<\/code><\/td><td>\u80a1\u7968\u6c60\u5168\u90e8\u4ee3\u7801\uff08\u5217\u8868\uff09<\/td><\/tr>\n<tr><td><code>khGet(data, \"date\")<\/code> \/ <code>\"date_num\"<\/code> \/ <code>\"time\"<\/code> \/ <code>\"datetime\"<\/code><\/td><td>\u5f53\u524d\u65e5\u671f\u3001\u65f6\u95f4\u5b57\u7b26\u4e32<\/td><\/tr>\n<tr><td><code>khGet(data, \"cash\")<\/code> \/ <code>\"total_asset\"<\/code> \/ <code>\"market_value\"<\/code><\/td><td>\u8d26\u6237\u8d44\u91d1<\/td><\/tr>\n<tr><td><code>khGet(data, \"positions\")<\/code><\/td><td>\u5168\u90e8\u6301\u4ed3\uff08\u5b57\u5178\u7684\u526f\u672c\uff09<\/td><\/tr>\n<tr><td><code>khPrice(data, code, field)<\/code><\/td><td>\u5f53\u524d\u884c\u60c5\u7684\u67d0\u4e2a\u5b57\u6bb5\uff0c\u9ed8\u8ba4 <code>close<\/code>\uff0c\u53d6\u4e0d\u5230\u8fd4\u56de 0.0<\/td><\/tr>\n<tr><td><code>khHas(data, code)<\/code><\/td><td>\u662f\u5426\u6301\u6709\u8fd9\u53ea\u80a1\u7968<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>\u9700\u8981\u8bfb\u56de\u6d4b\u914d\u7f6e\u65f6\uff0c\u901a\u8fc7 <code>__framework__<\/code> \u62ff\u5230\u914d\u7f6e\u5b57\u5178\uff1a<\/p>\n<pre><code>def init(stock_codes, init_data):\n    cfg = init_data&#91;\"__framework__\"].config.config_dict\n    logging.info(f\"\u57fa\u51c6: {cfg&#91;'backtest']&#91;'benchmark']}\")\n    logging.info(f\"\u4f63\u91d1\u7387: {cfg&#91;'backtest']&#91;'trade_cost']&#91;'commission_rate']}\")<\/code><\/pre>\n\n<h2>4 \u4ea4\u6613\u4fe1\u53f7<\/h2>\n<h3>4.1 \u4fe1\u53f7\u5b57\u5178\u7684\u5b57\u6bb5<\/h3>\n<p>\u56de\u8c03\u51fd\u6570\u8fd4\u56de\u7684\u5217\u8868\u91cc\uff0c\u6bcf\u4e2a\u5143\u7d20\u662f\u4e00\u6761\u4fe1\u53f7\uff08\u4e00\u4e2a\u5b57\u5178\uff09\uff1a<\/p>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u5b57\u6bb5<\/th><th>\u5fc5\u586b<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>code<\/code><\/td><td>\u662f<\/td><td>\u80a1\u7968\u4ee3\u7801\uff0c\u5e26\u4ea4\u6613\u6240\u540e\u7f00\uff0c\u5982 <code>\"000001.SZ\"<\/code>\u3001<code>\"600036.SH\"<\/code><\/td><\/tr>\n<tr><td><code>action<\/code><\/td><td>\u662f<\/td><td><code>\"buy\"<\/code> \u6216 <code>\"sell\"<\/code><\/td><\/tr>\n<tr><td><code>price<\/code><\/td><td>\u662f<\/td><td>\u59d4\u6258\u4ef7\u683c\u3002\u5e02\u4ef7\u5355\u6309\u8fd9\u4e2a\u4ef7\u683c\uff08\u52a0\u6ed1\u70b9\uff09\u6210\u4ea4\uff1b\u53ea\u6709\u4e70\u5165\u4ef7\u9ad8\u4e8e\u5f53\u6839\u6700\u9ad8\u4ef7\u3001\u6216\u5356\u51fa\u4ef7\u4f4e\u4e8e\u5f53\u6839\u6700\u4f4e\u4ef7\u65f6\uff0c\u624d\u6539\u6309\u5f53\u524d\u4ef7\u6210\u4ea4\uff08K \u7ebf\u53d6\u5f00\u76d8\u4ef7\uff0ctick \u53d6\u6700\u65b0\u4ef7\uff09<\/td><\/tr>\n<tr><td><code>volume<\/code><\/td><td>\u662f<\/td><td>\u59d4\u6258\u6570\u91cf\uff0c<strong>\u5355\u4f4d\u662f\u80a1<\/strong>\uff0c\u4e0d\u662f\u624b<\/td><\/tr>\n<tr><td><code>reason<\/code><\/td><td>\u5426<\/td><td>\u4ea4\u6613\u539f\u56e0\uff0c\u4f1a\u5199\u8fdb\u65e5\u5fd7\u548c\u4ea4\u6613\u8bb0\u5f55\uff0c\u65b9\u4fbf\u590d\u76d8<\/td><\/tr>\n<tr><td><code>order_type<\/code><\/td><td>\u5426<\/td><td><code>\"market\"<\/code>\uff08\u5e02\u4ef7\uff0c\u9ed8\u8ba4\uff09\u3001<code>\"limit\"<\/code>\uff08\u9650\u4ef7\uff09\u3001<code>\"stop\"<\/code>\uff08\u6b62\u635f\uff09\u3001<code>\"stop_limit\"<\/code>\uff08\u6b62\u635f\u9650\u4ef7\uff09<\/td><\/tr>\n<tr><td><code>time_in_force<\/code><\/td><td>\u5426<\/td><td>\u6302\u5355\u6709\u6548\u671f\uff0c\u9ed8\u8ba4 <code>\"day\"<\/code>\uff08\u5f53\u65e5\u6709\u6548\uff09\uff1b<code>\"gtd\"<\/code> \u914d\u5408 <code>expire_date<\/code> \u6307\u5b9a\u5230\u671f\u65e5<\/td><\/tr>\n<tr><td><code>expire_date<\/code><\/td><td>\u5426<\/td><td><code>gtd<\/code> \u6302\u5355\u7684\u6700\u540e\u6709\u6548\u65e5<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p><code>timestamp<\/code> \u4e0d\u7528\u81ea\u5df1\u586b\uff0c\u6846\u67b6\u4f1a\u5199\u5165\u5f53\u524d\u89e6\u53d1\u70b9\u7684\u65f6\u95f4\u3002\u6b62\u635f\u5355\u8fd8\u8981\u586b <code>stop_price<\/code>\uff0c\u8fd9\u7c7b\u8fdb\u9636\u5b57\u6bb5\u7684\u7528\u6cd5\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\">3.2<\/a>\u3002<\/p>\n\n<h3>4.2 \u51e0\u6761\u89c4\u5219<\/h3>\n<ul>\n<li><strong>\u6570\u91cf\u6309\u80a1\u3001\u4e70\u5165\u6574\u767e\u3002<\/strong>\u60f3\u4e70 5 \u624b\u5c31\u5199 <code>\"volume\": 500<\/code>\u3002\u6846\u67b6\u4e0d\u4f1a\u66ff\u624b\u5199\u7684\u4fe1\u53f7\u53d6\u6574\uff0cA \u80a1\u4e70\u5165\u8bf7\u81ea\u5df1\u4fdd\u8bc1\u662f 100 \u7684\u6574\u6570\u500d\uff1b\u7528\u4e0b\u9762\u7684 <code>generate_signal<\/code> \u65f6\u4f1a\u81ea\u52a8\u6309\u6574\u767e\u8ba1\u7b97\u3002<\/li>\n<li><strong>\u5356\u51fa\u4e0d\u80fd\u8d85\u8fc7\u53ef\u5356\u6570\u91cf\u3002<\/strong>\u8d85\u51fa\u65f6\u8fd9\u6761\u4fe1\u53f7\u88ab\u62d2\u7edd\uff0c\u65e5\u5fd7\u91cc\u4f1a\u63d0\u793a\u300c\u53ef\u7528\u6301\u4ed3\u4e0d\u8db3\u300d\u3002T+1 \u4e0b\u5f53\u5929\u4e70\u7684\u5f53\u5929\u5356\u4e0d\u6389\uff1b\u80a1\u7968\u6c60\u5168\u90e8\u662f\u652f\u6301 T+0 \u7684 ETF \u65f6\u6846\u67b6\u4f1a\u81ea\u52a8\u5207\u6362\u4e3a T+0\u3002<\/li>\n<li><strong>\u4e70\u5165\u4e0d\u80fd\u8d85\u8fc7\u53ef\u7528\u8d44\u91d1\u3002<\/strong>\u8d44\u91d1\u4e0d\u591f\uff08\u542b\u624b\u7eed\u8d39\u548c\u6ed1\u70b9\uff09\u65f6\u8fd9\u6761\u4fe1\u53f7\u88ab\u62d2\u7edd\uff0c\u65e5\u5fd7\u63d0\u793a\u300c\u8d44\u91d1\u4e0d\u8db3\u300d\u3002<\/li>\n<li><strong>\u4e0d\u5199 <code>order_type<\/code> \u5c31\u662f\u5e02\u4ef7\u5355<\/strong>\uff0c\u5728\u5f53\u524d\u89e6\u53d1\u70b9\u7acb\u5373\u6210\u4ea4\u3002\u9650\u4ef7\u5355\u5728\u5f53\u6839 K \u7ebf\u80fd\u6210\u4ea4\u65f6\u7acb\u5373\u6210\u4ea4\uff0c\u5426\u5219\u8fdb\u5165\u6302\u5355\u961f\u5217\uff0c\u6309 <code>time_in_force<\/code> \u9ed8\u8ba4\u5f53\u5929\u6536\u76d8\u4f5c\u5e9f\u3002<\/li>\n<li><strong>\u8fd4\u56de\u7684\u662f\u5217\u8868\u3002<\/strong>\u4e00\u6b21\u53ef\u4ee5\u8fd4\u56de\u591a\u6761\u4fe1\u53f7\uff1b\u4e00\u6761\u90fd\u6ca1\u6709\u65f6\u8fd4\u56de <code>&#91;]<\/code>\u3002<\/li>\n<\/ul>\n<p>\u624b\u5199\u4fe1\u53f7\u7684\u4f8b\u5b50\uff1a<\/p>\n<pre><code># \u4ee5\u5f00\u76d8\u4ef7\u5e02\u4ef7\u4e70\u5165 500 \u80a1\uff085 \u624b\uff09\n{\"code\": \"000001.SZ\", \"action\": \"buy\", \"price\": 10.50, \"volume\": 500, \"reason\": \"\u793a\u4f8b\u4e70\u5165\"}\n\n# \u4f4e\u4e8e\u5f00\u76d8\u4ef7 1% \u6302\u9650\u4ef7\u4e70\u5355\uff0c\u5f53\u5929\u6ca1\u6210\u4ea4\u5c31\u4f5c\u5e9f\n{\"code\": \"000001.SZ\", \"action\": \"buy\", \"price\": 10.40, \"volume\": 500,\n \"order_type\": \"limit\", \"reason\": \"\u56de\u843d1%\u4f4e\u5438\"}<\/code><\/pre>\n\n<h3>4.3 \u7528 <code>generate_signal<\/code> \u751f\u6210\u4fe1\u53f7<\/h3>\n<p>\u81ea\u5df1\u7b97\u80a1\u6570\u8981\u8003\u8651\u8d44\u91d1\u3001\u624b\u7eed\u8d39\u3001\u6ed1\u70b9\u548c\u6574\u767e\uff0c\u6bd4\u8f83\u9ebb\u70e6\u3002\u4e00\u822c\u7528 <code>generate_signal<\/code>\uff1a<\/p>\n<pre><code>generate_signal(data, stock_code, price, ratio, action, reason=\"\")<\/code><\/pre>\n<ul>\n<li>\u4e70\u5165\u65f6\uff0c<code>ratio<\/code> \u4e0d\u5927\u4e8e 1 \u8868\u793a\u7528\u5f53\u524d\u53ef\u7528\u8d44\u91d1\u7684\u6bd4\u4f8b\uff08<code>1.0<\/code> \u4e3a\u5168\u90e8\uff0c<code>0.5<\/code> \u4e3a\u4e00\u534a\uff09\uff0c\u51fd\u6570\u6263\u9664\u624b\u7eed\u8d39\u548c\u6ed1\u70b9\u540e\u6309\u6574\u767e\u7b97\u51fa\u80a1\u6570\uff1b<code>ratio<\/code> \u5927\u4e8e 1 \u8868\u793a\u76f4\u63a5\u6307\u5b9a\u80a1\u6570\uff0c\u5fc5\u987b\u662f 100 \u7684\u6574\u6570\u500d\uff0c\u8d85\u8fc7\u8d44\u91d1\u4e0a\u9650\u65f6\u81ea\u52a8\u51cf\u5230\u6700\u5927\u53ef\u4e70\u91cf\u3002<\/li>\n<li>\u5356\u51fa\u65f6\uff0c<code>ratio<\/code> \u662f\u53ef\u5356\u6570\u91cf\u7684\u6bd4\u4f8b\uff0c\u7ed3\u679c\u5411\u4e0b\u53d6\u6574\u5230 100 \u80a1\uff1b<code>1.0<\/code> \u8868\u793a\u5168\u90e8\u53ef\u5356\u6301\u4ed3\uff0c\u540c\u6837\u53d6\u6574\uff0c\u96f6\u80a1\u4f1a\u88ab\u820d\u6389\u3002<\/li>\n<li>\u8fd4\u56de\u503c\u662f\u4e00\u4e2a<strong>\u5217\u8868<\/strong>\uff08\u6761\u4ef6\u4e0d\u6ee1\u8db3\u65f6\u4e3a\u7a7a\u5217\u8868\uff09\uff0c\u6240\u4ee5\u591a\u53ea\u80a1\u7968\u5408\u5e76\u4fe1\u53f7\u65f6\u8981\u7528 <code>signals.extend(...)<\/code>\uff0c\u4e0d\u80fd\u7528 <code>append<\/code>\u3002<\/li>\n<\/ul>\n\n<h3>4.4 \u6302\u5355\u4e0e\u64a4\u5355<\/h3>\n<p>\u9650\u4ef7\u5355\u3001\u6b62\u635f\u5355\u6ca1\u6210\u4ea4\u65f6\u4f1a\u7559\u5728\u6302\u5355\u961f\u5217\u91cc\u3002\u7b56\u7565\u53ef\u4ee5\u7528 <code>khGetPendingOrders(data)<\/code> \u67e5\u770b\u5f53\u524d\u6302\u5355\uff0c\u7528 <code>khCancelOrder<\/code>\u3001<code>khCancelOrdersByCode<\/code>\u3001<code>khCancelAllOrders<\/code> \u64a4\u5355\u3002\u8fd9\u4e9b\u51fd\u6570 V2\u3001V3 \u90fd\u6709\uff0c\u53c2\u6570\u548c\u7528\u6cd5\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\">3.2<\/a>\u3002\u521a\u5f00\u59cb\u5199\u7b56\u7565\u7528\u5e02\u4ef7\u5355\u5c31\u591f\u4e86\u3002<\/p>\n\n<h2>5 \u5728\u7b56\u7565\u91cc\u8f93\u51fa\u65e5\u5fd7<\/h2>\n<p>\u6846\u67b6\u5df2\u7ecf\u914d\u7f6e\u597d\u4e86 Python \u81ea\u5e26\u7684 <code>logging<\/code>\uff0c\u7b56\u7565\u91cc\u76f4\u63a5\u8c03\u7528\u5373\u53ef\uff08<code>from khQuantImport import *<\/code> \u5df2\u7ecf\u5bfc\u5165\u4e86\u5b83\uff09\u3002\u65e5\u5fd7\u4f1a\u663e\u793a\u5728\u8f6f\u4ef6\u7684\u8fd0\u884c\u65e5\u5fd7\u9762\u677f\uff0c\u540c\u65f6\u5199\u8fdb\u65e5\u5fd7\u6587\u4ef6\uff1b\u7528\u547d\u4ee4\u884c\u56de\u6d4b\u65f6\u8f93\u51fa\u5230\u7ec8\u7aef\u3002<\/p>\n<div class=\"khq-tn-table\"><table>\n<thead><tr><th>\u5199\u6cd5<\/th><th>\u754c\u9762\u663e\u793a<\/th><th>\u9002\u5408\u8f93\u51fa<\/th><\/tr><\/thead>\n<tbody>\n<tr><td><code>logging.info(\"...\")<\/code><\/td><td>INFO\uff0c\u9ed8\u8ba4\u6d45\u8272\u6587\u5b57<\/td><td>\u53c2\u6570\u3001\u5173\u952e\u53d8\u91cf\u3001\u6d41\u7a0b<\/td><\/tr>\n<tr><td><code>logging.warning(\"...\")<\/code><\/td><td>WARNING\uff0c\u6a59\u8272<\/td><td>\u6570\u636e\u7f3a\u5931\u3001\u8df3\u8fc7\u67d0\u53ea\u80a1\u7968\u7b49\u9700\u8981\u7559\u610f\u7684\u60c5\u51b5<\/td><\/tr>\n<tr><td><code>logging.error(\"...\")<\/code><\/td><td>ERROR\uff0c\u7ea2\u8272<\/td><td>\u51fa\u9519\uff0c\u9700\u8981\u68c0\u67e5<\/td><\/tr>\n<tr><td><code>logging.info(\"&#91;TRADE] ...\")<\/code><\/td><td>TRADE\uff0c\u84dd\u8272<\/td><td>\u60f3\u548c\u4ea4\u6613\u8bb0\u5f55\u653e\u5728\u4e00\u8d77\u770b\u7684\u5185\u5bb9<\/td><\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>\u6d88\u606f\u91cc\u53ea\u8981\u5305\u542b <code>&#91;TRADE]<\/code>\uff0c\u754c\u9762\u5c31\u4f1a\u628a\u5b83\u663e\u793a\u4e3a TRADE \u7c7b\u578b\u5e76\u53bb\u6389\u8fd9\u4e2a\u6807\u8bb0\uff0c\u53ef\u4ee5\u5728\u65e5\u5fd7\u9762\u677f\u7528\u300cTRADE\u300d\u590d\u9009\u6846\u5355\u72ec\u7b5b\u51fa\u6765\u3002<\/p>\n<pre><code>logging.info(f\"&#91;TRADE] {code} \u6ee1\u8db3\u4e70\u5165\u6761\u4ef6\uff0c\u5747\u7ebf\u5dee {diff:.2f}\")<\/code><\/pre>\n<p><code>logging.debug<\/code> \u7684\u5185\u5bb9\u4e0d\u4f1a\u51fa\u73b0\u5728\u754c\u9762\u7684\u8fd0\u884c\u65e5\u5fd7\u9762\u677f\u91cc\uff0c\u8c03\u8bd5\u65f6\u8bf7\u7528 <code>info<\/code>\u3002\u5728 <code>except<\/code> \u91cc\u8bb0\u5f55\u9519\u8bef\u65f6\uff0c\u52a0 <code>exc_info=True<\/code> \u53ef\u4ee5\u628a\u5b8c\u6574\u62a5\u9519\u5806\u6808\u5199\u8fdb\u65e5\u5fd7\u6587\u4ef6\uff1a<\/p>\n<pre><code>try:\n    ma = khMA(code, 20, end_time=khGet(data, \"date_num\"))\nexcept Exception as e:\n    logging.error(f\"{code} \u8ba1\u7b97\u5747\u7ebf\u51fa\u9519: {e}\", exc_info=True)<\/code><\/pre>\n<p>\u6bcf\u6b21\u89e6\u53d1\u90fd\u6253\u5370\u5927\u91cf\u65e5\u5fd7\u4f1a\u660e\u663e\u62d6\u6162\u56de\u6d4b\uff0c\u957f\u533a\u95f4\u56de\u6d4b\u65f6\u53ea\u5728\u5173\u952e\u4f4d\u7f6e\u8f93\u51fa\u3002\u65e5\u5fd7\u9762\u677f\u7684\u7528\u6cd5\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter8\/\">1.9<\/a>\u3002<\/p>\n\n<h2>6 \u6700\u5c0f\u6a21\u677f<\/h2>\n<p>\u4e0b\u9762\u8fd9\u4e2a\u6587\u4ef6\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884c\uff1a\u6bcf\u5929\u5728\u65e5\u5fd7\u91cc\u6253\u5370\u7b2c\u4e00\u53ea\u80a1\u7968\u7684\u5f00\u76d8\u4ef7\uff0c\u4e0d\u4ea4\u6613\u3002\u65b0\u5efa\u7b56\u7565\u65f6\u53ef\u4ee5\u4ece\u5b83\u5f00\u59cb\u6539\u3002<\/p>\n<pre><code># coding: utf-8\nfrom khQuantImport import *   # \u4e00\u884c\u5bfc\u5165\uff1a\u5de5\u5177\u51fd\u6570\u3001logging\u3001Dict\/List \u7b49\n\n\ndef init(stock_codes, init_data):\n    \"\"\"\u56de\u6d4b\u5f00\u59cb\u524d\u8c03\u7528\u4e00\u6b21\"\"\"\n    logging.info(f\"\u7b56\u7565\u542f\u52a8\uff0c\u80a1\u7968\u6c60\u5171 {len(stock_codes)} \u53ea\")\n\n\ndef khHandlebar(data: Dict) -&gt; List&#91;Dict]:\n    \"\"\"\u6bcf\u6b21\u89e6\u53d1\u8c03\u7528\u4e00\u6b21\uff0c\u8fd4\u56de\u4fe1\u53f7\u5217\u8868\"\"\"\n    signals = &#91;]\n    stock = khGet(data, \"first_stock\")       # \u80a1\u7968\u6c60\u7b2c\u4e00\u53ea\n    price = khPrice(data, stock, \"open\")     # \u5f53\u524d\u8fd9\u6839K\u7ebf\u7684\u5f00\u76d8\u4ef7\n    logging.info(f\"{khGet(data, 'date')} {stock} \u5f00\u76d8\u4ef7 {price:.2f}\")\n    return signals\n\n\ndef khPreMarket(data: Dict) -&gt; List&#91;Dict]:\n    \"\"\"\u76d8\u524d\u56de\u8c03\uff1a\u914d\u7f6e\u91cc\u5f00\u542f\u540e\u624d\u4f1a\u88ab\u8c03\u7528\"\"\"\n    return &#91;]\n\n\ndef khPostMarket(data: Dict) -&gt; List&#91;Dict]:\n    \"\"\"\u76d8\u540e\u56de\u8c03\uff1a\u914d\u7f6e\u91cc\u5f00\u542f\u540e\u624d\u4f1a\u88ab\u8c03\u7528\"\"\"\n    return &#91;]<\/code><\/pre>\n<p>\u4f7f\u7528\u6b65\u9aa4\uff1a\u628a\u5b83\u5b58\u4e3a <code>.py<\/code> \u6587\u4ef6\uff1b\u5728\u8f6f\u4ef6\u91cc\u9009\u4e2d\u8fd9\u4e2a\u7b56\u7565\u6587\u4ef6\uff0c\u6309 1.5 \u7684\u65b9\u6cd5\u8bbe\u597d\u56de\u6d4b\u533a\u95f4\u3001\u65e5\u7ebf\u6570\u636e\u548c\u65e5 K \u7ebf\u89e6\u53d1\uff0c\u80a1\u7968\u6c60\u81ea\u884c\u6dfb\u52a0\u4e00\u53ea\u5df2\u7ecf\u4e0b\u8f7d\u4e86\u65e5\u7ebf\u7684\u80a1\u7968\uff08\u968f\u5305\u914d\u7f6e\u9ed8\u8ba4\u7559\u7a7a\uff09\uff1b\u70b9\u300c\u5f00\u59cb\u8fd0\u884c\u300d\uff0c\u8fd0\u884c\u65e5\u5fd7\u91cc\u6bcf\u5929\u4f1a\u591a\u4e00\u884c\u5f00\u76d8\u4ef7\u3002\u786e\u8ba4\u80fd\u8dd1\u901a\u540e\uff0c\u70b9\u300c\u4fdd\u5b58\u914d\u7f6e\u300d\u5f97\u5230\u540c\u540d\u7684 <code>.kh<\/code>\u3002<\/p>\n<p>V3 \u8fd8\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u91cc\u7528 <code>kh strategy validate \u6587\u4ef6\u540d.py<\/code> \u5148\u68c0\u67e5\u7ed3\u6784\uff1a\u5fc5\u9700\u7684 <code>khHandlebar<\/code> \u5728\u4e0d\u5728\u3001<code>init<\/code> \u5199\u6ca1\u5199\uff0c\u4e24\u4e2a\u76d8\u524d\u76d8\u540e\u56de\u8c03\u662f\u53ef\u9009\u7684\uff0c\u7f3a\u4e86\u53ea\u662f\u63d0\u793a\uff1a<\/p>\n<figure class=\"khq-tn-fig\"><a href=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/v3\/v3-fw-validate.webp?v=fd760396\" target=\"_blank\" rel=\"noopener\" title=\"\u70b9\u51fb\u67e5\u770b\u539f\u56fe\"><img decoding=\"async\" src=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/v3\/v3-fw-validate.webp?v=fd760396\" width=\"1238\" height=\"182\" alt=\"kh strategy validate \u68c0\u67e5\u81ea\u5e26\u53cc\u5747\u7ebf\u793a\u4f8b\uff1a\u4e24\u4e2a\u56de\u8c03 OK\uff0c\u76d8\u524d\u76d8\u540e\u56de\u8c03\u53ef\u9009\" loading=\"lazy\"><\/a><figcaption>kh strategy validate \u68c0\u67e5\u81ea\u5e26\u53cc\u5747\u7ebf\u793a\u4f8b\uff1a\u4e24\u4e2a\u56de\u8c03 OK\uff0c\u76d8\u524d\u76d8\u540e\u56de\u8c03\u53ef\u9009<\/figcaption><\/figure>\n<p>\u5b83\u53ea\u67e5\u7ed3\u6784\u548c\u8bed\u6cd5\uff0c\u7b56\u7565\u903b\u8f91\u5bf9\u4e0d\u5bf9\u8fd8\u8981\u770b\u56de\u6d4b\u7684\u4ea4\u6613\u8bb0\u5f55\uff08\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/ai-strategy\/\">3.4<\/a> \u7b2c 4 \u8282\uff09\u3002<\/p>\n\n<h2 id=\"example\">7 \u5b8c\u6574\u4f8b\u5b50\uff1a\u4ece\u96f6\u5199\u4e00\u4e2a\u53cc\u5747\u7ebf\u7b56\u7565<\/h2>\n<p>\u8fd9\u4e00\u8282\u628a\u524d\u9762\u7684\u5185\u5bb9\u4e32\u8d77\u6765\uff0c\u5199\u4e00\u4e2a\u5b8c\u6574\u7684\u7b56\u7565\u3002\u4ee3\u7801\u548c V3 \u81ea\u5e26\u6848\u4f8b\u300c\u30101-MA\u7b56\u7565\u6848\u4f8b\u3011\u53cc\u5747\u7ebf\u7cbe\u7b80_\u4f7f\u7528khMA\u51fd\u6570\u300d\u300c\u30101-MA\u7b56\u7565\u6848\u4f8b\u3011\u53cc\u5747\u7ebf\u591a\u80a1\u7968_\u4f7f\u7528khMA\u51fd\u6570\u300d\u5199\u6cd5\u4e00\u81f4\uff08V2 \u5f00\u6e90\u7248\u7684 <code>strategies<\/code> \u76ee\u5f55\u91cc\u4e5f\u6709\u8fd9\u4e24\u4e2a\u6587\u4ef6\uff09\u3002\u4f8b\u5b50\u91cc\u7684\u53c2\u6570\u548c\u6807\u7684\u53ea\u7528\u6765\u6f14\u793a\u5199\u6cd5\uff0c\u4e0d\u6784\u6210\u4efb\u4f55\u6295\u8d44\u5efa\u8bae\u3002<\/p>\n\n<h3>7.1 \u7b56\u7565\u601d\u8def<\/h3>\n<p>\u53cc\u5747\u7ebf\u7b56\u7565\u7528\u4e24\u6761\u4e0d\u540c\u5468\u671f\u7684\u79fb\u52a8\u5e73\u5747\u7ebf\u5224\u65ad\u8d8b\u52bf\uff1a<\/p>\n<ul>\n<li>\u77ed\u671f\u5747\u7ebf\uff08\u4f8b\u5982 5 \u65e5\uff09\u5bf9\u4ef7\u683c\u53d8\u5316\u654f\u611f\uff0c\u957f\u671f\u5747\u7ebf\uff08\u4f8b\u5982 20 \u65e5\uff09\u66f4\u5e73\u6ed1\u3002<\/li>\n<li>\u77ed\u671f\u5747\u7ebf\u5728\u957f\u671f\u5747\u7ebf\u4e0a\u65b9\uff0c\u5e76\u4e14\u5f53\u524d\u6ca1\u6709\u6301\u4ed3\uff1a\u5168\u4ed3\u4e70\u5165\u3002<\/li>\n<li>\u77ed\u671f\u5747\u7ebf\u5728\u957f\u671f\u5747\u7ebf\u4e0b\u65b9\uff0c\u5e76\u4e14\u5f53\u524d\u6709\u6301\u4ed3\uff1a\u5168\u90e8\u5356\u51fa\u3002<\/li>\n<\/ul>\n<p>\u8fd9\u91cc\u6bd4\u8f83\u7684\u662f\u4e24\u6761\u7ebf\u7684\u4e0a\u4e0b\u4f4d\u7f6e\uff0c\u4e0d\u662f\u4e25\u683c\u7684\u300c\u521a\u521a\u7a7f\u8d8a\u300d\u90a3\u4e00\u5929\u3002\u56e0\u4e3a\u52a0\u4e86\u300c\u6709\u6ca1\u6709\u6301\u4ed3\u300d\u7684\u6761\u4ef6\uff0c\u6548\u679c\u4e0a\u5c31\u662f\u5728\u91d1\u53c9\u540e\u7b2c\u4e00\u6b21\u89e6\u53d1\u65f6\u4e70\u5165\u3001\u6b7b\u53c9\u540e\u7b2c\u4e00\u6b21\u89e6\u53d1\u65f6\u5356\u51fa\u3002<\/p>\n\n<h3>7.2 \u56de\u6d4b\u8bbe\u7f6e<\/h3>\n<ol>\n<li>\u7b56\u7565\u6587\u4ef6\uff1a\u9009\u4e2d\u4e0b\u9762\u7684\u5355\u80a1\u7968\u7248\u672c <code>.py<\/code>\u3002<\/li>\n<li>\u56de\u6d4b\u533a\u95f4\uff1a\u4efb\u9009\u4e00\u6bb5\uff0c\u4f8b\u5982\u4e00\u5e74\u3002<\/li>\n<li>\u6570\u636e\u5468\u671f\u9009 <code>1d<\/code>\uff0c\u89e6\u53d1\u65b9\u5f0f\u9009\u300c\u65e5 K \u7ebf\u89e6\u53d1\u300d\uff0c\u6bcf\u4e2a\u4ea4\u6613\u65e5\u8c03\u7528\u4e00\u6b21 <code>khHandlebar<\/code>\u3002\u65e5\u7ebf\u7b56\u7565\u7528 tick \u6216\u5206\u949f\u89e6\u53d1\u53ea\u4f1a\u66f4\u6162\uff0c\u7ed3\u679c\u4e0d\u4f1a\u66f4\u51c6\u3002<\/li>\n<li>\u590d\u6743\u65b9\u5f0f\u5efa\u8bae\u9009\u524d\u590d\u6743\uff0c<code>khMA<\/code> \u4f1a\u8ddf\u968f\u8fd9\u91cc\u7684\u8bbe\u7f6e\u3002<\/li>\n<li>\u80a1\u7968\u6c60\uff1a\u5355\u80a1\u7968\u7248\u53ea\u52a0\u4e00\u53ea\u80a1\u7968\u3002<\/li>\n<li>\u786e\u8ba4\u8fd9\u53ea\u80a1\u7968\u5728\u56de\u6d4b\u533a\u95f4<strong>\u4ee5\u53ca\u4e4b\u524d\u4e00\u6bb5\u65f6\u95f4<\/strong>\u7684\u65e5\u7ebf\u5df2\u7ecf\u4e0b\u8f7d\u5230\u672c\u5730\uff08\u6570\u636e\u7ba1\u7406\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter10\/\">1.4<\/a>\uff09\u3002\u957f\u671f\u5747\u7ebf\u8981\u7528\u5230\u56de\u6d4b\u5f00\u59cb\u65e5\u4e4b\u524d\u7684 K \u7ebf\uff0c\u4f8b\u5982 20 \u65e5\u5747\u7ebf\u81f3\u5c11\u8981\u524d 20 \u4e2a\u4ea4\u6613\u65e5\u7684\u6570\u636e\u3002<\/li>\n<\/ol>\n\n<h3>7.3 \u5355\u80a1\u7968\u7248\u672c<\/h3>\n<pre><code># coding: utf-8\nfrom khQuantImport import *  # \u5bfc\u5165\u6240\u6709\u91cf\u5316\u5de5\u5177\n\n# ==================== \u7b56\u7565\u53c2\u6570 ====================\nparams = {\n    'ma_short': 5,    # \u77ed\u671f\u5747\u7ebf\uff08\u5185\u7f6e\u6848\u4f8b\u91cc\u8fd9\u91cc\u662f\u968f\u673a\u6570\uff0c\u7814\u7a76\u65f6\u6539\u6210\u56fa\u5b9a\u503c\uff09\n    'ma_long': 20,    # \u957f\u671f\u5747\u7ebf\n}\n\ndef init(stock_codes, init_data):  # \u7b56\u7565\u521d\u59cb\u5316\u51fd\u6570\n    \"\"\"\u7b56\u7565\u521d\u59cb\u5316\"\"\"\n    logging.info(f\"=== \u53cc\u5747\u7ebf\u7b56\u7565\u542f\u52a8 ===\")\n    logging.info(f\"\u53c2\u6570: \u77ed\u671f\u5747\u7ebf={params&#91;'ma_short']}\u65e5, \u957f\u671f\u5747\u7ebf={params&#91;'ma_long']}\u65e5\")\n\ndef khHandlebar(data: Dict) -&gt; List&#91;Dict]:  # \u4e3b\u7b56\u7565\u51fd\u6570\n    \"\"\"\u7b56\u7565\u4e3b\u903b\u8f91\uff0c\u5728\u6bcf\u4e2aK\u7ebf\u6216Tick\u6570\u636e\u5230\u6765\u65f6\u6267\u884c\"\"\"\n    signals = &#91;]  # \u521d\u59cb\u5316\u4fe1\u53f7\u5217\u8868\n    stock_code = khGet(data, \"first_stock\")  # \u83b7\u53d6\u7b2c\u4e00\u53ea\u80a1\u7968\u4ee3\u7801\n    current_price = khPrice(data, stock_code, \"open\")  # \u83b7\u53d6\u5f53\u524d\u5f00\u76d8\u4ef7\n    current_date_str = khGet(data, \"date_num\")  # \u83b7\u53d6\u5f53\u524d\u65e5\u671f\u6570\u5b57\u683c\u5f0f\n\n    ma_s = params&#91;'ma_short']\n    ma_l = params&#91;'ma_long']\n\n    try:\n        ma_short = khMA(stock_code, ma_s, end_time=current_date_str)  # \u8ba1\u7b97\u77ed\u671f\u5747\u7ebf\n        ma_long = khMA(stock_code, ma_l, end_time=current_date_str)   # \u8ba1\u7b97\u957f\u671f\u5747\u7ebf\n    except ValueError:\n        # \u4e0a\u5e02\u4e0d\u4e45\u6216\u672c\u5730\u6570\u636e\u4e0d\u591f\uff0c\u5386\u53f2K\u7ebf\u4e0d\u8db3\u4ee5\u8ba1\u7b97\u5747\u7ebf\uff1a\u4eca\u5929\u4e0d\u64cd\u4f5c\n        return signals\n\n    has_position = khHas(data, stock_code)  # \u68c0\u67e5\u662f\u5426\u6301\u6709\u8be5\u80a1\u7968\n\n    if ma_short &gt; ma_long and not has_position:  # \u91d1\u53c9\u4e14\u65e0\u6301\u4ed3\n        signals = generate_signal(data, stock_code, current_price, 1.0, 'buy', f\"{ma_s}\u65e5\u7ebf({ma_short:.2f}) \u4e0a\u7a7f {ma_l}\u65e5\u7ebf({ma_long:.2f})\uff0c\u5168\u4ed3\u4e70\u5165\")  # \u751f\u6210\u4e70\u5165\u4fe1\u53f7\n\n    elif ma_short &lt; ma_long and has_position:  # \u6b7b\u53c9\u4e14\u6709\u6301\u4ed3\n        signals = generate_signal(data, stock_code, current_price, 1.0, 'sell', f\"{ma_s}\u65e5\u7ebf({ma_short:.2f}) \u4e0b\u7a7f {ma_l}\u65e5\u7ebf({ma_long:.2f})\uff0c\u5168\u4ed3\u5356\u51fa\")  # \u751f\u6210\u5356\u51fa\u4fe1\u53f7\n\n    return signals  # \u8fd4\u56de\u4ea4\u6613\u4fe1\u53f7\n\n# khPreMarket \u548c khPostMarket \u51fd\u6570\u7701\u7565\uff0c\u672c\u6b21\u7b56\u7565\u672a\u4f7f\u7528<\/code><\/pre>\n\n<h3>7.4 \u9010\u6bb5\u89e3\u91ca<\/h3>\n<p><strong>\u53c2\u6570\u653e\u5728 <code>params<\/code> \u5b57\u5178\u91cc\u3002<\/strong>\u628a\u5468\u671f\u5199\u5728\u6587\u4ef6\u5f00\u5934\uff0c\u6539\u53c2\u6570\u65f6\u4e0d\u7528\u5230\u903b\u8f91\u91cc\u53bb\u627e\u3002\u5185\u7f6e\u6848\u4f8b\u91cc\u8fd9\u4e24\u4e2a\u503c\u662f\u8fd9\u6837\u5199\u7684\uff1a<\/p>\n<pre><code>import random\nparams = {\n    'ma_short': random.randint(3, 10),   # \u77ed\u671f\u5747\u7ebf\uff1a\u5728\u4e00\u5b9a\u8303\u56f4\u5185\u968f\u673a\n    'ma_long': random.randint(15, 30),   # \u957f\u671f\u5747\u7ebf\uff1a\u5728\u4e00\u5b9a\u8303\u56f4\u5185\u968f\u673a\n}<\/code><\/pre>\n<p>\u8fd9\u6837\u6bcf\u6b21\u8fd0\u884c\u53c2\u6570\u90fd\u4f1a\u53d8\uff0c\u7ed3\u679c\u4e5f\u4f1a\u8ddf\u7740\u53d8\uff0c\u76ee\u7684\u662f\u907f\u514d\u6848\u4f8b\u88ab\u5f53\u6210\u63a8\u8350\u53c2\u6570\u3002\u81ea\u5df1\u7814\u7a76\u65f6\u8bf7\u50cf\u4e0a\u9762\u90a3\u6837\u6362\u6210\u56fa\u5b9a\u503c\uff0c\u5426\u5219\u4e24\u6b21\u56de\u6d4b\u4e4b\u95f4\u6ca1\u6cd5\u6bd4\u8f83\u3002\u5b9e\u9645\u7528\u4e86\u54ea\u7ec4\u53c2\u6570\uff0c<code>init<\/code> \u91cc\u4f1a\u6253\u5370\u5230\u65e5\u5fd7\u3002<\/p>\n<p><strong><code>init<\/code> \u53ea\u6253\u5370\u53c2\u6570\u3002<\/strong>\u8fd9\u4e2a\u7b56\u7565\u4e0d\u9700\u8981\u521d\u59cb\u5316\uff0c\u4f46 <code>init<\/code> \u4ecd\u7136\u8981\u5199\u3002<\/p>\n<p><strong>\u53d6\u6570\u636e\u3002<\/strong><code>khGet(data, \"first_stock\")<\/code> \u53d6\u80a1\u7968\u6c60\u7b2c\u4e00\u53ea\u80a1\u7968\uff0c\u5355\u80a1\u7968\u7b56\u7565\u5c31\u662f\u5b83\uff1b<code>khPrice(data, stock_code, \"open\")<\/code> \u53d6\u5f53\u5929\u5f00\u76d8\u4ef7\u4f5c\u4e3a\u4e0b\u5355\u4ef7\u683c\uff1b<code>khGet(data, \"date_num\")<\/code> \u53d6 <code>\"20240102\"<\/code> \u8fd9\u6837\u7684\u65e5\u671f\uff0c\u7ed9\u5747\u7ebf\u51fd\u6570\u5f53\u622a\u6b62\u65e5\u671f\u3002<\/p>\n<p><strong>\u7b97\u5747\u7ebf\u3002<\/strong><code>khMA(\u80a1\u7968\u4ee3\u7801, \u5468\u671f, end_time=\u622a\u6b62\u65e5\u671f)<\/code> \u4ece\u672c\u5730\u6570\u636e\u53d6\u6700\u8fd1 N \u6839\u65e5\u7ebf\u7684\u6536\u76d8\u4ef7\u6c42\u5e73\u5747\u3002\u5b83\u53d6\u7684\u6570\u636e<strong>\u4e0d\u5305\u542b <code>end_time<\/code> \u5f53\u5929<\/strong>\uff0c\u6240\u4ee5\u7b97\u51fa\u6765\u7684\u662f\u622a\u81f3\u524d\u4e00\u4e2a\u4ea4\u6613\u65e5\u7684\u5747\u7ebf\uff0c\u4e0d\u4f1a\u7528\u5230\u5f53\u5929\u6536\u76d8\u4ef7\u3002\u5386\u53f2\u6570\u636e\u4e0d\u8db3 N \u6839\u65f6 <code>khMA<\/code> \u4f1a\u629b\u51fa <code>ValueError<\/code>\uff0c\u7528 <code>try\/except<\/code> \u63a5\u4f4f\uff0c\u8fd9\u4e00\u5929\u4e0d\u64cd\u4f5c\u3002<\/p>\n<div class=\"khq-tn-callout warn\"><div class=\"lbl\">\u6ce8\u610f<\/div><p>\u65e7\u7248\u6559\u7a0b\u91cc\u5199\u7684 <code>MA(stock_code, 5, end_time=...)<\/code> \u73b0\u5728\u4e0d\u80fd\u7528\u4e86\u3002<code>MA<\/code> \u73b0\u5728\u662f MyTT \u7684\u6307\u6807\u51fd\u6570\uff0c\u53c2\u6570\u662f <code>MA(\u6536\u76d8\u4ef7\u5e8f\u5217, \u5468\u671f)<\/code>\uff0c\u8981\u5148\u7528 <code>khHistory<\/code> \u53d6\u51fa\u5386\u53f2\u6536\u76d8\u4ef7\u518d\u4f20\u8fdb\u53bb\uff08\u5185\u7f6e\u6848\u4f8b\u300c\u53cc\u5747\u7ebf\u591a\u80a1\u7968_\u4f7f\u7528MA\u51fd\u6570\u300d\u5c31\u662f\u8fd9\u79cd\u5199\u6cd5\uff09\u3002\u76f4\u63a5\u6309\u80a1\u7968\u4ee3\u7801\u7b97\u5747\u7ebf\u8bf7\u7528 <code>khMA<\/code>\u3002<\/p><\/div>\n<p><strong>\u5224\u65ad\u6301\u4ed3\u3002<\/strong><code>khHas(data, stock_code)<\/code> \u8fd4\u56de\u662f\u5426\u6301\u6709\u8fd9\u53ea\u80a1\u7968\uff0c\u907f\u514d\u91cd\u590d\u4e70\u5165\u3001\u7a7a\u4ed3\u5356\u51fa\u3002<\/p>\n<p><strong>\u751f\u6210\u4fe1\u53f7\u3002<\/strong>\u4e70\u5165\u65f6 <code>ratio=1.0<\/code> \u8868\u793a\u7528\u5168\u90e8\u53ef\u7528\u8d44\u91d1\uff0c<code>generate_signal<\/code> \u4f1a\u6263\u6389\u624b\u7eed\u8d39\u548c\u6ed1\u70b9\u540e\u6309\u6574\u767e\u7b97\u80a1\u6570\uff1b\u5356\u51fa\u65f6 <code>ratio=1.0<\/code> \u8868\u793a\u5356\u51fa\u5168\u90e8\u53ef\u5356\u6301\u4ed3\u3002\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u662f\u4ea4\u6613\u539f\u56e0\uff0c\u7528 f-string \u628a\u5f53\u65f6\u7684\u5747\u7ebf\u503c\u5199\u8fdb\u53bb\uff0c\u5728\u4ea4\u6613\u8bb0\u5f55\u91cc\u80fd\u770b\u5230\u6bcf\u7b14\u4ea4\u6613\u7684\u4f9d\u636e\u3002<\/p>\n<p><strong>\u8fd4\u56de\u4fe1\u53f7\u3002<\/strong>\u5355\u80a1\u7968\u7248\u53ea\u4f1a\u4ea7\u751f\u4e00\u6761\u4fe1\u53f7\uff0c\u6240\u4ee5\u76f4\u63a5\u628a <code>generate_signal<\/code> \u7684\u8fd4\u56de\u503c\u8d4b\u7ed9 <code>signals<\/code>\u3002\u4e24\u4e2a\u6761\u4ef6\u90fd\u4e0d\u6ee1\u8db3\u65f6\u8fd4\u56de\u7a7a\u5217\u8868\uff0c\u8fd9\u4e00\u5929\u4e0d\u64cd\u4f5c\u3002<\/p>\n\n<h3>7.5 \u6539\u6210\u591a\u80a1\u7968\u7248\u672c<\/h3>\n<p>\u628a\u540c\u6837\u7684\u903b\u8f91\u653e\u8fdb\u5faa\u73af\uff0c\u5bf9\u80a1\u7968\u6c60\u91cc\u6bcf\u53ea\u80a1\u7968\u5404\u5224\u65ad\u4e00\u6b21\uff1a<\/p>\n<pre><code># coding: utf-8\nfrom khQuantImport import *  # \u5bfc\u5165\u6240\u6709\u91cf\u5316\u5de5\u5177\n\nparams = {\n    'ma_short': 5,\n    'ma_long': 20,\n}\n\ndef init(stock_codes, init_data):  # \u7b56\u7565\u521d\u59cb\u5316\u51fd\u6570\n    \"\"\"\u672c\u7b56\u7565\u4e0d\u9700\u521d\u59cb\u5316\"\"\"\n    logging.info(f\"=== \u53cc\u5747\u7ebf\u7b56\u7565\u542f\u52a8 ===\")\n    logging.info(f\"\u53c2\u6570: \u77ed\u671f\u5747\u7ebf={params&#91;'ma_short']}\u65e5, \u957f\u671f\u5747\u7ebf={params&#91;'ma_long']}\u65e5\")\n\ndef khHandlebar(data: Dict) -&gt; List&#91;Dict]:  # \u4e3b\u7b56\u7565\u51fd\u6570\n    \"\"\"\u7b56\u7565\u4e3b\u903b\u8f91\uff0c\u652f\u6301\u591a\u53ea\u80a1\u7968\u7684\u53cc\u5747\u7ebf\u7b56\u7565\"\"\"\n    signals = &#91;]  # \u521d\u59cb\u5316\u4fe1\u53f7\u5217\u8868\n    stock_list = khGet(data, \"stocks\")  # \u83b7\u53d6\u80a1\u7968\u6c60\u5217\u8868\n    current_date_str = khGet(data, \"date_num\")  # \u83b7\u53d6\u5f53\u524d\u65e5\u671f\u6570\u5b57\u683c\u5f0f\n\n    ma_s = params&#91;'ma_short']\n    ma_l = params&#91;'ma_long']\n\n    for stock_code in stock_list:  # \u904d\u5386\u6bcf\u53ea\u80a1\u7968\n        current_price = khPrice(data, stock_code, \"open\")  # \u83b7\u53d6\u5f53\u524d\u5f00\u76d8\u4ef7\n        try:\n            ma_short = khMA(stock_code, ma_s, end_time=current_date_str)  # \u8ba1\u7b97\u77ed\u671f\u5747\u7ebf\n            ma_long = khMA(stock_code, ma_l, end_time=current_date_str)   # \u8ba1\u7b97\u957f\u671f\u5747\u7ebf\n        except ValueError:\n            # \u4e0a\u5e02\u4e0d\u4e45\u6216\u672c\u5730\u6570\u636e\u4e0d\u591f\uff0c\u5386\u53f2K\u7ebf\u4e0d\u8db3\u4ee5\u8ba1\u7b97\u5747\u7ebf\uff1a\u4eca\u5929\u5148\u8df3\u8fc7\u8fd9\u53ea\u80a1\u7968\n            continue\n\n        has_position = khHas(data, stock_code)  # \u68c0\u67e5\u662f\u5426\u6301\u6709\u8be5\u80a1\u7968\n\n        if ma_short &gt; ma_long and not has_position:  # \u91d1\u53c9\u4e14\u65e0\u6301\u4ed3\n            signals.extend(generate_signal(data, stock_code, current_price, 0.5, 'buy', f\"{stock_code&#91;:6]} \u91d1\u53c9\u4e70\u5165\"))\n\n        elif ma_short &lt; ma_long and has_position:  # \u6b7b\u53c9\u4e14\u6709\u6301\u4ed3\n            signals.extend(generate_signal(data, stock_code, current_price, 1, 'sell', f\"{stock_code&#91;:6]} \u6b7b\u53c9\u5356\u51fa\"))\n\n    return signals  # \u8fd4\u56de\u4ea4\u6613\u4fe1\u53f7\n\n# khPreMarket \u548c khPostMarket \u51fd\u6570\u7701\u7565\uff0c\u672c\u6b21\u7b56\u7565\u672a\u4f7f\u7528<\/code><\/pre>\n<p>\u548c\u5355\u80a1\u7968\u7248\u76f8\u6bd4\u6539\u4e86\u56db\u5904\uff1a<\/p>\n<ol>\n<li><strong>\u53d6\u6574\u4e2a\u80a1\u7968\u6c60\u3002<\/strong><code>khGet(data, \"stocks\")<\/code> \u8fd4\u56de\u80a1\u7968\u6c60\u5168\u90e8\u4ee3\u7801\uff0c\u4ee3\u66ff <code>first_stock<\/code>\u3002<\/li>\n<li><strong>\u5faa\u73af\u3002<\/strong>\u53d6\u4ef7\u683c\u3001\u7b97\u5747\u7ebf\u3001\u5224\u65ad\u6301\u4ed3\u90fd\u79fb\u5230 <code>for<\/code> \u5faa\u73af\u91cc\uff1b\u67d0\u53ea\u80a1\u7968\u6570\u636e\u4e0d\u591f\u65f6\u7528 <code>continue<\/code> \u8df3\u8fc7\u5b83\uff0c\u4e0d\u5f71\u54cd\u5176\u4ed6\u80a1\u7968\u3002<\/li>\n<li><strong>\u4e70\u5165\u6bd4\u4f8b\u6539\u6210 0.5\u3002<\/strong>\u5982\u679c\u6bcf\u53ea\u90fd\u5168\u4ed3\u4e70\uff0c\u7b2c\u4e00\u53ea\u4e70\u5b8c\u5c31\u6ca1\u94b1\u4e86\u3002<code>0.5<\/code> \u662f\u300c\u5f53\u524d\u53ef\u7528\u8d44\u91d1\u300d\u7684\u4e00\u534a\uff0c\u540c\u4e00\u5929\u6709\u591a\u53ea\u80a1\u7968\u6ee1\u8db3\u6761\u4ef6\u65f6\uff0c\u7b2c\u4e00\u53ea\u7528\u4e00\u534a\uff0c\u7b2c\u4e8c\u53ea\u7528\u5269\u4e0b\u7684\u4e00\u534a\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u60f3\u66f4\u5e73\u5747\u5730\u5206\u914d\u8d44\u91d1\uff0c\u53ef\u4ee5\u6309\u80a1\u7968\u6570\u91cf\u8ba1\u7b97\u6bd4\u4f8b\uff0c\u6216\u8005\u7528 <code>ratio<\/code> \u5927\u4e8e 1 \u7684\u5199\u6cd5\u76f4\u63a5\u6307\u5b9a\u80a1\u6570\u3002<\/li>\n<li><strong>\u7528 <code>extend<\/code> \u5408\u5e76\u4fe1\u53f7\u3002<\/strong><code>generate_signal<\/code> \u8fd4\u56de\u7684\u662f\u5217\u8868\uff0c\u5faa\u73af\u91cc\u8981\u7528 <code>signals.extend(...)<\/code> \u628a\u91cc\u9762\u7684\u4fe1\u53f7\u9010\u6761\u52a0\u8fdb\u603b\u5217\u8868\u3002\u7528 <code>append<\/code> \u4f1a\u53d8\u6210\u5217\u8868\u5957\u5217\u8868\uff0c\u6846\u67b6\u65e0\u6cd5\u8bc6\u522b\u3002<\/li>\n<\/ol>\n<p>\u56de\u6d4b\u8bbe\u7f6e\u4e0a\uff0c\u591a\u80a1\u7968\u7248\u53ea\u9700\u8981\u628a\u80a1\u7968\u6c60\u6362\u6210\u591a\u53ea\u80a1\u7968\uff08\u4f8b\u5982\u5bfc\u5165\u4e00\u4e2a\u6307\u6570\u6210\u5206\u80a1\u5217\u8868\uff09\uff0c\u5e76\u786e\u8ba4\u8fd9\u4e9b\u80a1\u7968\u7684\u65e5\u7ebf\u90fd\u5df2\u4e0b\u8f7d\u3002\u591a\u80a1\u7968\u7248\u53ea\u653e\u4e00\u53ea\u80a1\u7968\u4e5f\u80fd\u8fd0\u884c\uff0c\u533a\u522b\u53ea\u662f\u6bcf\u6b21\u4e70\u5165\u7528\u4e00\u534a\u8d44\u91d1\u3002<\/p>\n\n<h3>7.6 \u8fd0\u884c\u548c\u67e5\u770b\u7ed3\u679c<\/h3>\n<p>\u70b9\u300c\u5f00\u59cb\u8fd0\u884c\u300d\u540e\uff0c\u8fd0\u884c\u65e5\u5fd7\u91cc\u4f1a\u5148\u6253\u5370\u53c2\u6570\uff0c\u4e4b\u540e\u6bcf\u6b21\u4ea7\u751f\u4fe1\u53f7\u90fd\u6709\u4e00\u884c\u300c\u751f\u6210\u4e70\u5165\u4fe1\u53f7\u300d\u6216\u300c\u751f\u6210\u5356\u51fa\u4fe1\u53f7\u300d\uff0c\u540e\u9762\u9644\u5e26\u6570\u91cf\u3001\u4ef7\u683c\u548c\u539f\u56e0\u3002\u56de\u6d4b\u7ed3\u675f\u540e\u5728\u7ed3\u679c\u7a97\u53e3\u67e5\u770b\u6536\u76ca\u66f2\u7ebf\u3001\u4ea4\u6613\u8bb0\u5f55\u548c\u6bcf\u65e5\u7edf\u8ba1\uff0c\u8bfb\u6cd5\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter9\/\">1.10<\/a>\u3002\u4ea4\u6613\u8bb0\u5f55\u91cc\u7684\u300c\u539f\u56e0\u300d\u5c31\u662f <code>generate_signal<\/code> \u6700\u540e\u4e00\u4e2a\u53c2\u6570\u5199\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u56de\u6d4b\u7ed3\u679c\u4e0d\u4ee3\u8868\u672a\u6765\u6536\u76ca\uff0c\u4e0d\u6784\u6210\u6295\u8d44\u5efa\u8bae\u3002<\/p>\n<figure class=\"khq-tn-fig\"><a href=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/report-overview.webp?v=c73a7840\" target=\"_blank\" rel=\"noopener\" title=\"\u70b9\u51fb\u67e5\u770b\u539f\u56fe\"><img decoding=\"async\" src=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/report-overview.webp?v=c73a7840\" alt=\"\u56de\u6d4b\u7ed3\u679c\u7a97\u53e3\uff1a\u57fa\u672c\u4fe1\u606f\u3001\u6536\u76ca\u66f2\u7ebf\u548c\u4e0b\u65b9\u7684\u4ea4\u6613\u8bb0\u5f55\u7b49\u6807\u7b7e\u9875\uff08\u8bfb\u6cd5\u89c1 1.10\uff09\" loading=\"lazy\"><\/a><figcaption>\u56de\u6d4b\u7ed3\u679c\u7a97\u53e3\uff1a\u57fa\u672c\u4fe1\u606f\u3001\u6536\u76ca\u66f2\u7ebf\u548c\u4e0b\u65b9\u7684\u4ea4\u6613\u8bb0\u5f55\u7b49\u6807\u7b7e\u9875\uff08\u8bfb\u6cd5\u89c1 1.10\uff09<\/figcaption><\/figure>\n<p>\u7528\u547d\u4ee4\u884c\u8dd1\u65f6\uff08V3\uff09\uff0c\u7ed3\u679c\u76f4\u63a5\u6253\u5370\u5728\u7ec8\u7aef\u91cc\uff0cHTML \u62a5\u544a\u7684\u4f4d\u7f6e\u4e5f\u4f1a\u7ed9\u51fa\uff1a<\/p>\n<figure class=\"khq-tn-fig\"><a href=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/v3\/v3-linux-run.webp\" target=\"_blank\" rel=\"noopener\" title=\"\u70b9\u51fb\u67e5\u770b\u539f\u56fe\"><img decoding=\"async\" src=\"https:\/\/khsci.com\/khQuant\/wp-content\/uploads\/tutorial-new\/v3\/v3-linux-run.webp\" alt=\"\u547d\u4ee4\u884c kh run \u8dd1\u81ea\u5e26\u53cc\u5747\u7ebf\u793a\u4f8b\u7684\u8f93\u51fa\uff08\u6458\u81ea 2.5 \u7684\u5b9e\u62cd\uff09\" loading=\"lazy\"><\/a><figcaption>\u547d\u4ee4\u884c kh run \u8dd1\u81ea\u5e26\u53cc\u5747\u7ebf\u793a\u4f8b\u7684\u8f93\u51fa\uff08\u6458\u81ea 2.5 \u7684\u5b9e\u62cd\uff09<\/figcaption><\/figure>\n\n<h3>7.7 \u63a5\u4e0b\u6765<\/h3>\n<ul>\n<li>\u8bd5\u7740\u6362\u53c2\u6570\uff08\u4f8b\u5982 10 \u65e5\u548c 30 \u65e5\uff09\uff0c\u6bd4\u8f83\u7ed3\u679c\u6709\u4ec0\u4e48\u4e0d\u540c\uff1b\u628a <code>khMA<\/code> \u6362\u6210 <code>khHistory<\/code> \u52a0 MyTT \u7684 <code>EMA<\/code>\u3001<code>MACD<\/code> \u7b49\u6307\u6807\u3002\u51fd\u6570\u6e05\u5355\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\">3.2 \u7b56\u7565\u5de5\u5177\u7bb1<\/a>\u3002<\/li>\n<li>\u60f3\u8ba9 AI \u5e2e\u4f60\u5199\u7b56\u7565\u3001\u8dd1\u56de\u6d4b\u9a8c\u8bc1\uff0c\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/ai-strategy\/\">3.4 \u4f7f\u7528 AI \u7f16\u5199\u548c\u56de\u6d4b\u9a8c\u8bc1\u7b56\u7565<\/a>\u3002<\/li>\n<li>V3 \u7528\u6237\u53ef\u4ee5\u7528\u547d\u4ee4\u884c\u52a0 AI \u505a\u6279\u91cf\u53c2\u6570\u7814\u7a76\uff0c\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/cli\/\">2.2 \u547d\u4ee4\u884c\u6a21\u5f0f\u4e0e AI \u667a\u80fd\u7b56\u7565\u7814\u7a76<\/a>\u3002<\/li>\n<li>V3 \u81ea\u5e26\u7684\u5176\u4ed6\u6848\u4f8b\uff08RSI\u3001T+0 \u7f51\u683c\u3001\u81ea\u5b9a\u4e49\u6307\u6807\u3001\u65e5\u5185\u591a\u6b21\u89e6\u53d1\u7b49\uff09\u89c1 <a href=\"https:\/\/khsci.com\/khQuant\/examples\/\">3.5 V3 \u5185\u7f6e\u7b56\u7565\u4e00\u89c8<\/a>\u3002<\/li>\n<\/ul>\n\n<h2>\u5e38\u89c1\u95ee\u9898<\/h2>\n<p class=\"q\"><strong>\u95ee\uff1a\u7b56\u7565\u91cc\u6ca1\u5199 <code>init<\/code>\uff0c\u4e3a\u4ec0\u4e48\u4e00\u8fd0\u884c\u5c31\u62a5\u9519\uff1f<\/strong><br>\n\u7b54\uff1a\u6846\u67b6\u5728\u56de\u6d4b\u5f00\u59cb\u65f6\u76f4\u63a5\u8c03\u7528 <code>init(\u80a1\u7968\u6c60, data)<\/code>\u3002\u7f3a\u8fd9\u4e2a\u51fd\u6570\u4f1a\u62a5\u300chas no attribute &#8216;init&#8217;\u300d\uff0c\u5199\u6210\u4e0d\u5e26\u53c2\u6570\u7684 <code>def init():<\/code> \u4f1a\u62a5\u300ctakes 0 positional arguments but 2 were given\u300d\u3002\u5199\u6210 <code>def init(stock_codes, init_data): pass<\/code> \u5373\u53ef\u3002<\/p>\n<p class=\"q\"><strong>\u95ee\uff1a\u5199\u4e86 <code>khPreMarket<\/code>\uff0c\u4f46\u5b83\u4ece\u6765\u6ca1\u88ab\u8c03\u7528\uff1f<\/strong><br>\n\u7b54\uff1a\u76d8\u524d\u3001\u76d8\u540e\u56de\u8c03\u9ed8\u8ba4\u5173\u95ed\uff0c\u8981\u5728\u754c\u9762\u300c\u76d8\u524d\u76d8\u540e\u89e6\u53d1\u8bbe\u7f6e\u300d\u91cc\u52fe\u9009\uff0c\u6216\u5728 <code>.kh<\/code> \u7684 <code>market_callback<\/code> \u91cc\u628a <code>pre_market_enabled<\/code>\u3001<code>post_market_enabled<\/code> \u8bbe\u4e3a <code>true<\/code>\u3002\u53ea\u5f00\u5f00\u5173\u3001\u7b56\u7565\u91cc\u6ca1\u5199\u5bf9\u5e94\u51fd\u6570\u65f6\uff0c\u65e5\u5fd7\u4f1a\u63d0\u793a\u300c\u7b56\u7565\u6a21\u5757\u672a\u5b9e\u73b0\u300d\u3002<\/p>\n<p class=\"q\"><strong>\u95ee\uff1a\u8fd4\u56de\u4e86\u4fe1\u53f7\uff0c\u4ea4\u6613\u8bb0\u5f55\u91cc\u5374\u6ca1\u6709\u6210\u4ea4\uff1f<\/strong><br>\n\u7b54\uff1a\u5148\u770b\u8fd0\u884c\u65e5\u5fd7\u91cc\u7684\u8b66\u544a\u3002\u5e38\u89c1\u539f\u56e0\uff1a\u8d44\u91d1\u4e0d\u8db3\uff1b\u5356\u51fa\u6570\u91cf\u8d85\u8fc7\u53ef\u5356\u6570\u91cf\uff08T+1 \u4e0b\u5f53\u5929\u4e70\u5165\u7684\u4e0d\u80fd\u5f53\u5929\u5356\uff09\uff1b\u9650\u4ef7\u5355\u4ef7\u683c\u6ca1\u6709\u8fbe\u5230\uff0c\u6302\u5355\u5230\u671f\u4f5c\u5e9f\uff1b\u591a\u80a1\u7968\u5faa\u73af\u91cc\u7528\u4e86 <code>append<\/code> \u800c\u4e0d\u662f <code>extend<\/code>\u3002\u53e6\u5916 <code>generate_signal<\/code> \u5728\u8d44\u91d1\u4e0d\u591f\u4e70\u4e00\u624b\u6216\u6ca1\u6709\u53ef\u5356\u6301\u4ed3\u65f6\u4f1a\u8fd4\u56de\u7a7a\u5217\u8868\uff0c\u5e76\u5728\u65e5\u5fd7\u91cc\u8bf4\u660e\u539f\u56e0\u3002<\/p>\n<p class=\"q\"><strong>\u95ee\uff1a<code>volume<\/code> \u5199 5 \u662f 5 \u624b\u5417\uff1f<\/strong><br>\n\u7b54\uff1a\u4e0d\u662f\uff0c\u662f 5 \u80a1\u3002\u6570\u91cf\u5355\u4f4d\u4e00\u5f8b\u662f\u80a1\uff0c5 \u624b\u8981\u5199 500\u3002<\/p>\n<p class=\"q\"><strong>\u95ee\uff1a\u53cc\u5747\u7ebf\u6848\u4f8b\u6bcf\u6b21\u8dd1\u7684\u7ed3\u679c\u90fd\u4e0d\u4e00\u6837\uff1f<\/strong><br>\n\u7b54\uff1a\u5185\u7f6e\u6848\u4f8b\u7684\u5747\u7ebf\u5468\u671f\u662f\u7528 <code>random.randint<\/code> \u968f\u673a\u53d6\u7684\uff0c\u6bcf\u6b21\u8fd0\u884c\u90fd\u4e0d\u540c\uff0c\u65e5\u5fd7\u5f00\u5934\u4f1a\u6253\u5370\u672c\u6b21\u7528\u7684\u53c2\u6570\u3002\u7814\u7a76\u65f6\u628a <code>params<\/code> \u91cc\u7684\u503c\u6539\u6210\u56fa\u5b9a\u6570\u5b57\u3002<\/p>\n<p class=\"q\"><strong>\u95ee\uff1a<code>khMA<\/code> \u62a5\u300c\u6570\u636e\u91cf\u4e0d\u8db3\u300d\uff1f<\/strong><br>\n\u7b54\uff1a\u672c\u5730\u65e5\u7ebf\u4e0d\u591f N \u6839\u3002\u56de\u6d4b\u5f00\u59cb\u65e5\u4e4b\u524d\u4e5f\u9700\u8981\u6709\u8db3\u591f\u7684\u5386\u53f2\u6570\u636e\uff0c\u4f8b\u5982 20 \u65e5\u5747\u7ebf\u9700\u8981\u56de\u6d4b\u5f00\u59cb\u524d\u81f3\u5c11 20 \u4e2a\u4ea4\u6613\u65e5\u7684\u65e5\u7ebf\u3002\u8865\u4e0b\u8f7d\u66f4\u65e9\u7684\u6570\u636e\uff0c\u6216\u8005\u50cf\u6848\u4f8b\u90a3\u6837\u7528 <code>try\/except<\/code> \u8df3\u8fc7\u6570\u636e\u4e0d\u8db3\u7684\u65e5\u5b50\u3002<\/p>\n<p class=\"q\"><strong>\u95ee\uff1a\u65e5\u7ebf\u89e6\u53d1\u65f6\uff0c\u80fd\u4e0d\u80fd\u7528\u5f53\u5929\u7684\u6536\u76d8\u4ef7\u5224\u65ad\u3001\u5f53\u5929\u4e70\u5165\uff1f<\/strong><br>\n\u7b54\uff1a\u7a0b\u5e8f\u4e0a\u80fd\u53d6\u5230\uff0c\u4f46\u8fd9\u662f\u7528\u4e86\u672a\u6765\u6570\u636e\uff1a\u5f00\u76d8\u65f6\u5e76\u4e0d\u77e5\u9053\u6536\u76d8\u4ef7\u3002\u6309\u5f00\u76d8\u51b3\u7b56\u5c31\u7528\u5f00\u76d8\u4ef7\u548c\u524d\u51e0\u5929\u7684\u6570\u636e\uff1b\u60f3\u7528\u6536\u76d8\u4ef7\u5224\u65ad\uff0c\u53ef\u4ee5\u5728\u76d8\u540e\u56de\u8c03\u91cc\u5224\u65ad\uff0c\u4fe1\u53f7\u4f1a\u8f6c\u6210\u4e0b\u4e00\u4e2a\u4ea4\u6613\u65e5\u7684\u6302\u5355\u3002<\/p>\n\n<p style=\"color:#888;font-size:.9em;\">\u672c\u7bc7\u57fa\u4e8e V3.4.1.10 \u548c\u5f00\u6e90 V2 \u7f16\u5199\u3002<\/p>\n\n<nav class=\"khq-tn-nav\"><a class=\"prev\" href=\"https:\/\/khsci.com\/khQuant\/troubleshooting\/\"><span>\u4e0a\u4e00\u7bc7<\/span>\u9644\u5f55 B \u6392\u9519\u603b\u8868<\/a><a class=\"next\" href=\"https:\/\/khsci.com\/khQuant\/chapter13\/\"><span>\u4e0b\u4e00\u7bc7<\/span>3.2 \u7b56\u7565\u5de5\u5177\u7bb1<\/a><\/nav>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>\u9002\u7528\u7248\u672c V2V3 \u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u89c6\u9891\u64ad\u653e\uff0c\u53ef\u4ee5\u4e0b\u8f7d\u89c6\u9891\u89c2\u770b\u3002 \u5148\u8bfb\u8fd9\u91cc\uff1a\u7c97\u8bfb\u5373\u53ef\uff0c\u7528\u65f6\u518d\u67e5 \u56de\u8c03\u51fd\u6570\u3001da [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template\/caidan.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-386","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages\/386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/comments?post=386"}],"version-history":[{"count":17,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages\/386\/revisions"}],"predecessor-version":[{"id":1011,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages\/386\/revisions\/1011"}],"wp:attachment":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/media?parent=386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}