From 4d02a9d8954356e25d947f67c40ddf281f4d868e Mon Sep 17 00:00:00 2001 From: mike Date: Wed, 15 Jul 2026 07:38:28 +0800 Subject: [PATCH] =?UTF-8?q?v4.5.5:=20=E5=8D=95=E5=B8=81=E7=A7=8D=E4=B8=8A?= =?UTF-8?q?=E9=99=90=2075%=20=C3=97=20=E8=B4=A6=E6=88=B7=E6=80=BB=E8=B5=84?= =?UTF-8?q?=E4=BA=A7=20(=E7=94=A8=E6=88=B7=E5=8E=9F=E8=AF=9D=202026-07-13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - get_account_info 加 used_margin / total_capital (free + 所有币种占用) - recommend_position 用 single_coin_cap_pct=0.75 (config 可调) - 算每个币种当前已用保证金, 加仓时还可用 = cap - 已用 - 新开 / 加仓都遵循 75% 上限 (有区别: 新开 = 75% cap, 加仓 = cap - 已用) - 之前 balance_utilization=0.45 (算 free 的 45%) 被替换 测试 (SKHYNIX 持仓 0.216 张 0.58): - 加仓 SKHYNIX: 0.64 (75% × 08.26 cap - 0.58 已用) - 新开 BTC: 7.42 (75% × 08.26 cap) - 新开 ETH: 7.74 (同上) --- .../callback_handler.cpython-311.pyc | Bin 6817 -> 0 bytes .../__pycache__/config_loader.cpython-311.pyc | Bin 1566 -> 0 bytes .../cost_performance.cpython-311.pyc | Bin 10412 -> 0 bytes .../okx_position_advisor.cpython-311.pyc | Bin 36529 -> 0 bytes .../__pycache__/signal_db.cpython-311.pyc | Bin 20804 -> 0 bytes .../signal_tracker.cpython-311.pyc | Bin 16693 -> 0 bytes .../scripts/okx_position_advisor.py | 131 ++++++++++++------ 7 files changed, 85 insertions(+), 46 deletions(-) delete mode 100644 okx-auto-position/scripts/__pycache__/callback_handler.cpython-311.pyc delete mode 100644 okx-auto-position/scripts/__pycache__/config_loader.cpython-311.pyc delete mode 100644 okx-auto-position/scripts/__pycache__/cost_performance.cpython-311.pyc delete mode 100644 okx-auto-position/scripts/__pycache__/okx_position_advisor.cpython-311.pyc delete mode 100644 okx-auto-position/scripts/__pycache__/signal_db.cpython-311.pyc delete mode 100644 okx-auto-position/scripts/__pycache__/signal_tracker.cpython-311.pyc diff --git a/okx-auto-position/scripts/__pycache__/callback_handler.cpython-311.pyc b/okx-auto-position/scripts/__pycache__/callback_handler.cpython-311.pyc deleted file mode 100644 index 74346cf458c30d5484d6099c15922e0c70938429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6817 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 Wr%rxv==xAfdkQ3?TA^E8{{II*mipWP diff --git a/okx-auto-position/scripts/__pycache__/config_loader.cpython-311.pyc b/okx-auto-position/scripts/__pycache__/config_loader.cpython-311.pyc deleted file mode 100644 index c4e8f22066777ad0adeba46ae60865a08b501765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1566 zcma)6UuYa<5T9>%lTCJ$OH3}-w|CiO@AlZ; zBaK{el`2iSHuX=_Qwl~Xv2BX=sfta(M;|>oP!bIp1zBxh)Z#<@~*ijhp5h?#n_$ zYu-a1EzKtl{eO70t`LA#T!Dn&D8GV{ui^?MDN^AAB-<#bw9^*UBr4L@3nVF1ZUSO$ zg?G_UI%_FZ&t;;jnM>=Ls9`Epv!q84uIyR{r)@JAeSGi1#^O?K!L8j`c=Y4VTKTh$ z#Sd%OzWZyfRJ(t1>x-M4U*FwaTiRUyK-yxrkH04eKj?q11_1@wiW}o<`(uRb;Ou1s z;OxZ?5YFu-mH{X6Mb>{W6r#*os?+J{Q81YEjX2C|EoQY4FSuM`|RYRGL4^C-TRhcM|o@1X3d_HhdT$g*?ajOeY)TZl!UEl|5p%U)6 zaA@;5&AAY;xu8l-7s~7te z$Li~k_GJr(qvs7>v-)B&&SF`5JUU=oingY*=JEI$ZO#*^mR8W&7%e4Z@E zix1DEV#g7XAnEWzf2rRc`(2JKCN3qeCdzMA zsSE1Sf%QmHQ%$8T_V?#;rtJxN#hJpHF!db9p<6j6t9fmyR9ZJQ^kakV_pa5+G?qgU zQiN%&Dt?$x+Fs3?v|wnjS;x@E=(d*-u#*X?3p^3(z(4}h?RGUke?+=VnMLE0Q69dL z_-gda(ObiJ6Zb~%jQ;RS<;2PAiIbJ1r>aL!{WM>RoU2C8xpH0L2+qJBNFaB)VqFl( Rp*rkA2Tz9Cl?Q?!_rLGnT?YUF diff --git a/okx-auto-position/scripts/__pycache__/cost_performance.cpython-311.pyc b/okx-auto-position/scripts/__pycache__/cost_performance.cpython-311.pyc deleted file mode 100644 index 3fceedd83e0cd955ee0f0321900e648d74317ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10412 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%0DO*$8))du2 zwy$xqGl{B6w_x2OzSfpvwx*e_LiTglP!@l5+OQI~TxOW+Xc_+9ty>M-FHv2*3hZ|< z+so}y?X0aT{=$vM8^aT)-)fy`P1zi2n`41u46R=yiFVGG*<5bjO#_lDaW2S8maMqT{ue$EW=85ge&Pn=a&%~}& z^@eoyhPWoK$>nR9wmAixbJ8`n=6&}chCgfk)bX2<-;YeUbqQ@V z+4421^2T&|BQz>J;Z1B!S=XekYf?-@nrRTSpKQknhLyAShLnA6+P?O?^VmLZs22?N zrN&Qx%Dg{q-Y=NNTQ!>lTPA-R4MULe_&W;O}TCNkc4CZ7|mJK;0+toWT`cBPqJ zLiU3%DOv@qGg$=$K5~$vVtPbjiV){^h8Y^d={7XvqzMK&HU0fLM0D0?^g~13=OMFLmC!XPZIs{or z;JAoD1afc>RKy|zLrJ_uJiyZ8uQWhu$TmLWCBcjb%#M*!F6eddE zrs)NZp4PxiD?scNT^6z8-wb7lkiWbWQ-u7@P{s)Po1x?shd>qi+%=kG>+cv>P8(MW zt9GZ1U1?)iM8BZX(B23kjY+}rD0=6Cf#%c4cnM9*-JC{xRO*d z^g2wFNaYH;ae-2jHan)t#KEFene3tMH0-^|q`4X|WwOPJmojPCN`q%XCSx?EF-Jqw e>RLfv3$KGjx?kRNaZiN&EvP9?9VC;{^?w1_?<1oC diff --git a/okx-auto-position/scripts/__pycache__/signal_tracker.cpython-311.pyc b/okx-auto-position/scripts/__pycache__/signal_tracker.cpython-311.pyc deleted file mode 100644 index a99779e030f24e78aebc23229d854bd808b9e97d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16693 zcmdseYj6{1mS{_ANv*eJ8)KVS`-u$(^A0$K#K9&Qj7e-0g0sXC>NW_!NJ}DM_7S3TO!Rk)(?bMPhn3VzjxI#_r3NsqcL;EuMPf;p7Ra|l0T4y-%} zziKRxKL;C*=|jMkpAme)F?FuyS2t3}n>*LwxVbWZ4OgC>8>i(ezNgK`->0}rC{dM7 z;nu!SV_KY*W~hc-HK$Sc$JI#Xxpmn#-lwiHb5|yEKwg{m^4g>yu{O2x+WfyiW^Gh; za`v{f6nZUF<=V63R*$)}9LlP(WW%Cm5lhr%H!fPX;*m3_an*&wd2QA%)@DCYu+B;- zZzfn;%9r!2_zJ%ALnGh@{G>;w19f}}?E5Bu1%agmmIK_(uOhp@g|C1ew5nG_!R@W` z{yp)CS*(%wuUxg-D%^$^@MO98In-v6p0~+8V;%hEsp;`TwGijXW~l{$zCOQvBX$@77JdH3FXpzx-cQm%jMt(3@uSgX`n>KYMrj#}~1= z4XkINzuPPH@m!bBd$Ql%>#Jv{KK=Q;ro+(mbokS$_kTQfD~u+t5SpB9WSN?q zS~X$NP<{pRDC#spX{_T1rkQzi`%rJ6IyOZ44VgO7mJ$w9T}mH83bt9-+EJrT8_&1} zzTfXlGyFMNx~_qq8YXRQe75WPhK~JdgOr=r_w{gIA#L=%*6a22Thm6^vwq&=PwRYs zA+2j0cs*?q243&#c6)I3KY}I35SL5p-zg5I8_w~O@l-&pb@PhZ=5?e+I|kL^xas*{%LP~&fwuO7V+YE04v zDT^a?@Ed4^Qf)PEGudj~0N83}dnrnNriQ2>70=1VmZS&x0HkLn5Dk`G5INK>Vma6- zZL9lLKnXJ|KYQDn8akTTj)rGjn%L%jZ0q3;w&|tj_Kx=XM~SUgs$p#}$2PZiG(FeU z#y;QHe5j%A7<;hk7~629<8X5;w0o$jwWC&515by~@9sOpb~L@zLHcSv($X@g5F8p_ zSgM5YeBX(I-X%+TIew}9Uj8gExKHw#2`n@MARvQ03(K?M___ekh4YJNpXu*iAafuf zAfh4e`F)Gz_qm0W-u^{07wdH(;P=3>kmlUjw6EbvO9#6ax{`?DTJ;14_v>AL{+yo_ zS9Yl8NwX4O0xdEJDnrixJ7I;qp^IQ1S=_EOg4eUqzAwC^GHLgpKO-%^vVse&W^-#} z(@S#>nU_0<7$Ng4WEi~AB_X)d6dtz2t@F=gwN$*8mCDz$%K7>OI+uA|*OFb&-SZ`T z#^KiJ2rW(9_;b7`;O8acn>GNF_IdpRp|MEbSRoH!+UV`~`n$Lj0xB=4YWbc500h{Q zKU^QF4>hJ}=GS!LUAl0VDl1~XrpolDZxKKgz&;J7H@$W6&4X_ox_Bsbh!9_)02`(} zIb4r&K@uUq5$JnK@@olN79+oYMJ)x6h^>)FO>E-|*UjYPS6wDZ1vNo!P#2_w`k*0b z3^GAe&}_Lw$A15i;j%`la7pxiqm%+7wA7{1+w!~&kop)C2q*(W4Oc3ZHYw!lBO^JlX`_6|1;qNat{((Alh-%UJs|YC{laog z)O&gde0+^HZIHGjZIEbIn#S!&Gnws3TQYPAm~YxDN66UIW;q6fPuo=6kv3yg+K#jd z!%__QKV@DP4aPesR^2gw*(@II5?|#- zHxDp*w0l;kF`v?WZPM$#nr|tDvl6r;6?>cxdhYBNUwBzOeo8cXzc$hO9%u(4j0~Yw zO$}-0tpjf!c%$WFONjhQl+kb|;5)^09uv$l^EeDVVz(GMjx z7nIn+e^e+#F8NSSZbms)N-a%4{z!sJMABL|a|j=c$S71&riQ`_n7gnN!D;|CW}zIz z6$mO3R3TW4pc+990$i`OQI?6Nvyay4%(-V}slz6pe2EYWTcF4b@bmqD0RORLzx-D9 zo$YrT?`;3P4o~|*a@t$SX>TE?9pE2)+Bwn0<7q!hPWwr6+5tY!Y4_wRh=`%&l;45C zl2VX1s9o%oqx8}}$MWzvYUq#-+Ek<_7=ZH3l?#G8!Qs!LPC=bo@deWx8klqe#E=J< zKb;!+(Y;%j=G&15uP9jF-qg~xw}V~B?rS@IXbJJ*=>Dd*CRuP`pJJb88(JG>AzO)N zG_I#|)hwl_!)=YA7C(C|E0VK~P3?QxmgYmv9qeXOuJt25;h(}9m_VB8=KY>i1O2>E zhEbaHdi)>JIoOUYEUg2>h!5E;;jra+a=e9IP=bTsH(da7QQ2%Csl8MS ze4>b%1rFwlR*9x!Kq|`$;2@S2zh|hG6<2q@S3g!iYohebtQlE}!aY(&D@04>+uNc# zWQgHi@dA;qB<$pWG=gn~Ma)I8>Bl6(Lkc?li4ad|@3GKJ*aqVko&YchV;l;`$dqq4 zlo`On^$1XLnn5Dr$vvki%M+^c3kWPpHFQDUQdA?T?bfOJ_G8fv8d}XA4~#;3=F$yL zdyxv#jdQduLMe!jAyJAPgRW#u9tjn& z@H2Y`s}Kj2srkWd%Wd4_<+h#%JJhI-i!)v{Q?o1km#5)S-j4UoC778AdLwcI1{)J&DV4!m*y<$ zlp1Sb6BL#`FTZ+sYWQu*1#<7!Wr@jxcjmztqv$^&PLb)6kq2K)fOR>5O4iJWKLS2H z_15kCmnS6I4ABsC(b^+5AhkC=_LuiR_{j{1mGB6V>Y1+4;SyjVRr39?>j!lkH+MhO zR0h!bAbEn&(uCwItpkKk>)a=NHO3rVvw8vox+I8tpQe#brcH!dqIDPSQK#JfC;7Bl z`gWZGvn;kvkTHXfPCPN-*iep(&<;hu2S49!0Emnwu^sUp3Cp^qWnHLo(&Ct(Fz+z2RpXk3b6wK8F4UZ|6kvgMF;o17tM-^Z<){%IHIugDSaZTw8QPc1 zD~jz(!Nieei@N43aQr%aA$>7|k|rimpx z;++7puVaVE?3l!y?ePNuvae&i$ZVgF=4dP_~n3kXPkmJ-zY#+-bHIIEaAMg;nvh<7X#=iNeNYVdEQzL(O6Tq|qrFi&BoZXt(HSgEw|o`rZmkUxZBC zq|p)GCK{K+n{qT`*=BgLEPf|?r7uFJIc0K1J3t79H|01H+aWqmz#HEueaF4h7a-U? zNEX6l$FpJP#GjyvNyl*RyqTak}h~dbFgxeqn12$8e@O+?N6CyAjBg6YcPSRGVgwR=0TuuCoo9V2l=ZdqI0kzG-UIdftrSQ9X zNbo2Q$V!1^gP!Y6kc|OqkAdQYP_^?2(*t%jSFuplUqqWw$_&Pp;D7P3vm=u|F3JKB z+lMkNNjxJGp=8ZV>-__Mcdt+fyCbXukhbB~jV{@(z=6xb-S6RhdwDKRzwYh#r48Us z@bSL1iB#-DkAUP@@Ch$tBL@&{MnKvmM!{Dx`U(OxiU@856$mN;Kuejs3BX3P$vSA7 zG?b>XfY6L(85l#C0JnY8M)%p1*gMFas9O?Cj?jpqG6blK2`vE92KO1bu)@_?q{*Z1 zBkaQrJ=}-z`-GjC@GK^1{ArC(8oLMMMvnJ@i-hx`Y=%23KeF=z)wqnygtXKP#csmS z_X?~q%BHgOV$x`vrL1~j-uWZJOF?istg?bCG1y9BFdH*EsgAl78p}_ZP*+(N6b<8umeNG=2Tw(mCAQ2LB!sf z$g54})rO5JOJ39+-W}eJeV+^;2p@#?bJAl-)7HU*e-J@zR97B5AJ>?KR_? zunt>aAGU|>5qqpW!K}jIusvn5M_rem2tR>sb%&e7FsYbpxD`Xg@Jrd8(ao2RhL4hY zh7X1hMh?a{C#)+mID8Nrt&UiJ&6M0_N>YW(W6Wqzs$f~Pd$c)~Uzl3H8Y4ZUt+N)x zO7koQ;A_fYvV4mGq8X4!*(<)O&39h7ZNFuYX=3Zg?BlNS zCvKJ`infYHTfc08Vl~6ouyxYn47JP`eh{yT@PlkZE&K#2HS0j}C#X5A@#TRVoXQe! zPLmVX%FNCHdIf41^fe&e>heQiq~`S5Iw*wXwgK9SHkTcM_@U#B@*PPX#|#j zy)0;exfj9+mV-`I1br4~=LdPfIfQIaP zR$`x^>pb}7-#~TgHs|gw)7P$JJs!#kuL77s`WL{<9$)=cH1}oi|NQT#-unIwGV1`^ z!Bm-3BcIG%i_f65CV*V6V_rV0#5yq5 zRl%|wBrbzAUchC1s97&yQxA2ZKnl-5s75O^z(?=`$hG4Mdm&-4TGrrX;t%WyZkjG+ z!eihl`cOX%QL~h8jUfvrt+rVm1qAG+$de+|5PL1YZ0y{)=IUTM2q*e^b)BRDY~`V24QVha$w|9<%1?Gb1MS4s#Vz_lXgB=$&qV~135EcD=uAJnt3 zaL5JI^yvX_e~n3Exu>wwX#@lViJ0&zmNH072VdR;mZG#-`gXx(R3B>R8HOtxCkqx@ zci{pQM4O54yRh28b*(F7FD9%NNoz%@2{>=`2$*f)jq&k)V}0Y#C0B2ocfG=_eNlvX{goJG;BF{dN_N{KbW zhA0o(VF+vb@jTX~)@1SOtz^B$`vxbqV0g!R^7D9?Z8`cPXs$O6YI7OrNkhbBrbP=e zXUtL#G@)@!PF&BKa&K{S=3I@Mv*h08279g*bsRPGQ0t=Vm}Ef)y&kFDyoa*|wZK&D zgy}e-btkY37qE>yg}UVfbt@pO1oP}L_GQ_zBdePKPYjXoaLeOpTAlaIb!7l;EDDrD zG0EjNJsg@I8&$iX;z`cLTV0ZP+=__$1Ut&H1yuuS?l~gt;(;)~biXiA++ZiC=dTIpgAX9 zX(y8WLuPlcyYB?&-ZNN(GCg=sWVzng652eoYQp~hUpNVL}A8xZ`UpXuRBf1fX{>+|*laGy)-yl~z5B)0cD08o^W5Tg&M zpZ5{gmP3?ZC0Tsmz-jM%GyL*JmPLp_tvs?400`|(SXU>ltASoxoM>oYn{rf%j;cx9 zQz_dPxQ}7m7HayPfpRU62CiIq=fV$$Mu)_8jqrZSiO%+fvpwl-2Ps>RlDFPGOoPz7 zIh9`!?Hqk7%*c{?*pzZEyQYgZT=T^@|HLz1J<;~jhD6oQWYx~ZnqA2?yAnn9$)fs% zvp%d(F}4xwC2Pvs7j=o&K6s-6=^HyIeF5Gw-6_3oxn-HipUD3*4-&pSrsRoTuZr$d z$u6&w^0iKDGJi_}n9Tx)vN}h0UD_2rlCZ2uT2_ek3PK0dOcz{^1D&-?=!dl;-V^-) zm%sU8ec(w*VA(V0{c!bQE1S6zsQhmPT#_KZ4|eAEXH(JPsT)6?diN*n{$tNKv75JS z+O#RK{So!$>&5fy2M#@=rgS-Henqx-p#LPhd6P5%_K8g!cd{F{Zilg;uD{e=Bu1}l zaj<-;3i81tCj|dZg)D{OgKlPM0BNHy&mMc zv?a5`a9^BA9B}h+23=e;NQ-BXKoW84tFiCl|1C+EzCiB5139QY2Oa|U8Q~m6;NNE? zssP4+q%h+!wkfllYHEH~R8Ue>Z zu53$&45XjrLKL}5LOg851xp+a#8p6!J&}9J0Yn_@clYsKUGQ%_=Yat9^8INV{*~cu zS`RnsL9U|Ve}ce6=jr2e{B!#5-T}BH`VNjwPrT3)O=!XXD-jGMs3Q5~QYTqWA|Dgn z&JfSO0WQ$X?-7uf0~w%vS7C?XtZOv0v{6IPQV5)s#u2jPUy3Rc)o+SgC92;^bAGrY zQZu|hvR*8DGGTr)WSpgG4UiNCSgSCqfaf(Xjcb-tgDQ2DcidyQ_JawgCCRjiObaO>+M5#0 zz9h3xWcJAk#}mveN#+%ic|}fmI>9`XWS$Y3XXJ#f31(Z8*(NgEQj9aKi!gA%z!I^9 zEt6(jq&m7evOctT65OEPyTqv!+Z)>(*WF;=J2ZA^{Dr$KH;OAard$Q1MX}P+6(9@e z1RVw8K(u}IrI>s4<%FX&=_n1;a;IxV`i7CUcn7(Clel_QZYMeYIm<+6S$xO%j)Zed(zykQzYG3nL1P+#-9i{{ z0258PNzChuz7|_C`klBZF2p^_?_kZh@ zWbx%c6OW%xzT6|FB&_{OYrjZdKzXGv5RA>XD068|culN5)*jElQS{#NvE$?JyQ}KN zRdtKZz>ya@7t=&8z&hm@Mz=ZUt@6wf7@=S1c?dBcvy4Wj)RyyJz^cLI!b7{65{eeZNgUxaN(rEr4j zOfsEf=EYrotQA3I7wu*6f@j~pE@@wvVAdy@^ 0: + c = float(p.get('contracts', 0)) + if abs(c) > 0.001: + # OKX 不直接返 margin, 但返 notional / leverage = 保证金 + notional = float(p.get('notional', 0)) or 0 + leverage = float(p.get('leverage', 1)) or 1 + margin = notional / leverage if notional > 0 else 0 + # 如果 notional 拿不到, 用 contracts * ct_val * price / leverage 估算 + # (position_value 字段也常用) + if margin == 0: + pv = float(p.get('positionValue', 0)) or 0 + margin = pv / leverage if pv > 0 else 0 active.append({ 'symbol': p['symbol'], 'side': p['side'], @@ -70,11 +81,18 @@ def get_account_info(exchange): 'entry': float(p['entryPrice']) if p.get('entryPrice') else 0, 'pnl': float(p.get('unrealizedPnl', 0)), 'liq': float(p.get('liquidationPrice', 0)) if p.get('liquidationPrice') else 0, + 'margin': margin, }) + used_margin += abs(margin) + + # 账户总资产 = 可用 USDT + 所有持仓占用保证金 + total_capital = usdt_free + used_margin return { 'usdt_free': usdt_free, 'usdt_total': usdt_total, + 'used_margin': used_margin, + 'total_capital': total_capital, 'positions': active, } @@ -203,8 +221,25 @@ def recommend_position(symbol, side, leverage, exchange, acct_info): if leverage < 1: leverage = 1 - # Position sizing: use 45% of available balance - avail_margin = acct_info['usdt_free'] * cfg('position_sizing', 'balance_utilization', 0.45) + # Position sizing: 单币种上限 75% × 账户总资产 - 当前同币种已用 + # 用户原话: "只持仓一种币的时候, 最多加仓到账户资金的 75%" + single_coin_cap_pct = cfg('position_sizing', 'single_coin_max_pct', 0.75) + base = symbol.split('/')[0] # e.g. 'BTC' from 'BTC/USDT:USDT' + + # 当前同币种已用保证金 + same_coin_margin = 0.0 + for p in acct_info.get('positions', []): + if p['symbol'].startswith(base): + same_coin_margin += abs(p['margin']) + + # 单币种总上限 (基于账户总资产) + total_cap = acct_info.get('total_capital', acct_info['usdt_free']) + single_coin_cap = total_cap * single_coin_cap_pct + # 还可加仓 = 上限 - 已用 + single_coin_avail = max(0, single_coin_cap - same_coin_margin) + + # 同时考虑 free 余额 (不能超过 free) + avail_margin = min(acct_info['usdt_free'], single_coin_avail) margin_per_contract = ct_val * price / leverage if margin_per_contract <= 0: @@ -486,50 +521,54 @@ def execute_order(exchange, rec): results['steps'].append({'step': 'cancel_old_algos', 'status': 'ok', 'cancelled': cancelled}) time.sleep(0.5) # wait for cancellation to propagate - # 5. Set SL-only via conditional algo order (v4.5.0: 不设止盈, 靠平仓信号平仓) - try: - # 用单腿 conditional algo, 只挂止损 - # 多头: 价格跌破 SL 时市价平仓 - # 空头: 价格涨破 SL 时市价平仓 - if side == 'sell': - # Short: SL trigger above entry - algo_params = { - 'instId': inst_id, - 'tdMode': 'cross', - 'side': 'buy', # buy to close short - 'posSide': 'net', - 'ordType': 'conditional', - 'sz': str(contracts), - 'slTriggerPx': str(rec['sl_price']), - 'slOrdPx': '-1', - 'slTriggerPxType': 'last', - 'reduceOnly': 'true', - } - else: - # Long: SL trigger below entry - algo_params = { - 'instId': inst_id, - 'tdMode': 'cross', - 'side': 'sell', # sell to close long - 'posSide': 'net', - 'ordType': 'conditional', - 'sz': str(contracts), - 'slTriggerPx': str(rec['sl_price']), - 'slOrdPx': '-1', - 'slTriggerPxType': 'last', - 'reduceOnly': 'true', - } + # 5. SL/TP 挂单 - OKX 专属 (长桥 SDK 不支持 algo order) + # 长桥端: 跳过此步, 靠 time_in_force=Day 让日内单自动平仓 + # OKX 端: 用 conditional algo 设单腿 SL (v4.5.0) + is_okx = 'OKX' in str(type(exchange)) + if not is_okx: + # 长桥: 跳过 SL, 靠日内规则自动平 + results['steps'].append({'step': 'sl_only', 'status': 'skipped', 'msg': 'longbridge 不支持 algo order, 靠 time_in_force=Day 自动平仓'}) + else: + # OKX: 设单腿 SL conditional algo + try: + if side == 'sell': + # Short: SL trigger above entry + algo_params = { + 'instId': inst_id, + 'tdMode': 'cross', + 'side': 'buy', # buy to close short + 'posSide': 'net', + 'ordType': 'conditional', + 'sz': str(contracts), + 'slTriggerPx': str(rec['sl_price']), + 'slOrdPx': '-1', + 'slTriggerPxType': 'last', + 'reduceOnly': 'true', + } + else: + # Long: SL trigger below entry + algo_params = { + 'instId': inst_id, + 'tdMode': 'cross', + 'side': 'sell', # sell to close long + 'posSide': 'net', + 'ordType': 'conditional', + 'sz': str(contracts), + 'slTriggerPx': str(rec['sl_price']), + 'slOrdPx': '-1', + 'slTriggerPxType': 'last', + 'reduceOnly': 'true', + } - resp = exchange.private_post_trade_order_algo(algo_params) - if resp.get('data') and resp['data'][0].get('algoId'): - algo_id = resp['data'][0]['algoId'] - # v4.5.0: 只设 SL, tp 标记为 None - results['algo'] = {'id': algo_id, 'sl': rec['sl_price'], 'tp': None} - results['steps'].append({'step': 'sl_only', 'status': 'ok', 'algo_id': algo_id}) - else: - results['steps'].append({'step': 'sl_only', 'status': 'warn', 'msg': str(resp)}) - except Exception as e: - results['steps'].append({'step': 'sl_only', 'status': 'error', 'msg': str(e)}) + resp = exchange.private_post_trade_order_algo(algo_params) + if resp.get('data') and resp['data'][0].get('algoId'): + algo_id = resp['data'][0]['algoId'] + results['algo'] = {'id': algo_id, 'sl': rec['sl_price'], 'tp': None} + results['steps'].append({'step': 'sl_only', 'status': 'ok', 'algo_id': algo_id}) + else: + results['steps'].append({'step': 'sl_only', 'status': 'warn', 'msg': str(resp)}) + except Exception as e: + results['steps'].append({'step': 'sl_only', 'status': 'error', 'msg': str(e)}) # 5. Verify position try: