From bb3aecc6ae1187474888ba368b3f966a51968266 Mon Sep 17 00:00:00 2001 From: gavindiaz Date: Fri, 3 Jul 2026 18:17:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8C=87=E6=A0=87=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=E4=BC=A0=E9=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API使用指南.md | 87 +++++++ Alpha Trend.ex5 | Bin 0 -> 20056 bytes Alpha Trend.mq5 | 231 ++++++++++++++++++ Program.cs | 47 ++++ README.md.md | 44 ++++ bin/Debug/net8.0/Mt5Bridge.dll | Bin 54272 -> 58368 bytes bin/Debug/net8.0/Mt5Bridge.exe | Bin 151552 -> 151552 bytes bin/Debug/net8.0/Mt5Bridge.pdb | Bin 25776 -> 26536 bytes obj/Debug/net8.0/Mt5Bridge.AssemblyInfo.cs | 2 +- .../net8.0/Mt5Bridge.AssemblyInfoInputs.cache | 2 +- obj/Debug/net8.0/Mt5Bridge.dll | Bin 54272 -> 58368 bytes obj/Debug/net8.0/Mt5Bridge.pdb | Bin 25776 -> 26536 bytes obj/Debug/net8.0/apphost.exe | Bin 151552 -> 151552 bytes obj/Debug/net8.0/ref/Mt5Bridge.dll | Bin 9216 -> 9728 bytes obj/Debug/net8.0/refint/Mt5Bridge.dll | Bin 9216 -> 9728 bytes 延迟测试.py | 53 ++++ 16 files changed, 464 insertions(+), 2 deletions(-) create mode 100644 Alpha Trend.ex5 create mode 100644 Alpha Trend.mq5 create mode 100644 延迟测试.py diff --git a/API使用指南.md b/API使用指南.md index 2a462d5..56fb23c 100644 --- a/API使用指南.md +++ b/API使用指南.md @@ -305,6 +305,93 @@ for d in deals: --- +### 11. 全局变量(MQL5 信号桥) + +> 让 MQL5 指标/EA 把信号写出来,Python 通过 Bridge 读取。不用翻译 MQL5 代码。 + +#### 列出所有全局变量 + +``` +GET /gvar +``` + +```python +gvars = api("/gvar") +print(gvars) +# {"data": [{"name": "AT_Trend_XAUUSDc", "value": 1}, ...], "count": 5} +``` + +#### 读取指定变量 + +``` +GET /gvar/{name} +``` + +```python +trend = api("/gvar/AT_Trend_XAUUSDc")["value"] +print(f"趋势方向: {'多头' if trend == 1 else '空头'}") +``` + +#### 写入变量 + +``` +POST /gvar/{name} +``` + +Body: `{"value": 75.5}` + +```python +def set_gvar(name, value): + return api_post(f"/gvar/{name}", {"value": value}) + +set_gvar("MY_RSI", 75.5) +``` + +#### 删除变量 + +``` +DELETE /gvar/{name} +``` + +--- + +## MQL5 指标 → Python 完整流程 + +### 第一步:改指标源码,加一行输出 + +```mql5 +// 在 OnCalculate 末尾加 +int last = rates_total - 1; +GlobalVariableSet("MY_SIGNAL_" + _Symbol, signal_value); +``` + +### 第二步:Python 读取信号 + +```python +def read_signal(): + try: + return api(f"/gvar/MY_SIGNAL_XAUUSDc")["value"] + except: + return None + +signal = read_signal() +print(f"指标信号: {signal}") +``` + +### 第三步:根据信号做决策 + +```python +def on_tick(): + signal = read_signal() + if signal != 1: + return # 没信号,不动 + + if not bridge.has_position("XAUUSDc"): + bid, ask = bridge.tick("XAUUSDc") + bridge.buy("XAUUSDc", 0.01, ask, sl=ask - 50, tp=ask + 100) + print("指标发出买入信号,已开多") +``` + ## 完整策略模板 ```python diff --git a/Alpha Trend.ex5 b/Alpha Trend.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4323303865f0493a327902f7f91e83e3f4264aeb GIT binary patch literal 20056 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
~W>D6I}AyIR>wob;F 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 literal 0 HcmV?d00001 diff --git a/Alpha Trend.mq5 b/Alpha Trend.mq5 new file mode 100644 index 0000000..3a41627 --- /dev/null +++ b/Alpha Trend.mq5 @@ -0,0 +1,231 @@ +//+-------------------------------------------------------------------------------------------------------+ +//| Alpha Trend.mq5 | +//| Copyright © 2022, Centaur | +//| https://www.mql5.com/en/users/centaur | +//| | +//|For screenshots and extra info: | +//| https://forex-station.com/viewtopic.php?p=1295492109&sid=16f4baa8018e53a3e71fb54b6b29977b#p1295492109 | +//| | +//+-------------------------------------------------------------------------------------------------------+ +#property copyright "Copyright © 2022, Centaur" +#property link "https://www.mql5.com/en/users/centaur" +#property version "1.00" +#property indicator_chart_window +#property indicator_buffers 16 +#property indicator_plots 3 +//--- plot alpha line and offset line +#property indicator_label1 "Alpha Line;Offset Line" +#property indicator_type1 DRAW_FILLING +#property indicator_color1 clrDodgerBlue,clrTomato +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 +//--- plot Buy Signal +#property indicator_label2 "Buy Signal" +#property indicator_type2 DRAW_ARROW +#property indicator_color2 clrDodgerBlue +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 +//--- plot Sell Signal +#property indicator_label3 "Sell Signal" +#property indicator_type3 DRAW_ARROW +#property indicator_color3 clrTomato +#property indicator_style3 STYLE_SOLID +#property indicator_width3 1 +//--- enumerations +enum ENUM_YES_NO + { + Yes, + No + }; +//--- input parameters +input int inp_length = 14; // Length +input double inp_atr_multiplier = 1.0; // ATR Multiplier +input ENUM_APPLIED_PRICE inp_price = PRICE_CLOSE; // Applied Price +input ENUM_YES_NO inp_change_calc = No; // Use volume data ? +input ENUM_YES_NO inp_signals = Yes; // Show Signals ? +//--- indicator plot buffers +double Alpha[]; +double Offset[]; +double Buy_Signal[]; +double Sell_Signal[]; +//--- indicator calculation buffers +double TR[]; +double ATR[]; +double RSI[]; +double MFI[]; +double UpTrend[]; +double DownTrend[]; +double Alpha_Calc[]; +double Buy_Signal_Calc[]; +double Sell_Signal_Calc[]; +double Buy_BarCount[]; +double Sell_BarCount[]; +double Arrows[]; +//--- indicator variables +int length; +double atr_multiplier; +int TR_Handle; +int RSI_Handle; +int MFI_Handle; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- check input parameters + length = inp_length < 1 ? 1 : inp_length; + atr_multiplier = inp_atr_multiplier < 0.1 ? 0.1 : NormalizeDouble(inp_atr_multiplier, 1); +//--- indicator buffers mapping + SetIndexBuffer(0, Alpha, INDICATOR_DATA); + SetIndexBuffer(1, Offset, INDICATOR_DATA); + SetIndexBuffer(2, Buy_Signal, INDICATOR_DATA); + SetIndexBuffer(3, Sell_Signal, INDICATOR_DATA); + SetIndexBuffer(4, TR, INDICATOR_CALCULATIONS); + SetIndexBuffer(5, ATR, INDICATOR_CALCULATIONS); + SetIndexBuffer(6, RSI, INDICATOR_CALCULATIONS); + SetIndexBuffer(7, MFI, INDICATOR_CALCULATIONS); + SetIndexBuffer(8, UpTrend, INDICATOR_CALCULATIONS); + SetIndexBuffer(9, DownTrend, INDICATOR_CALCULATIONS); + SetIndexBuffer(10, Alpha_Calc, INDICATOR_CALCULATIONS); + SetIndexBuffer(11, Buy_Signal_Calc, INDICATOR_CALCULATIONS); + SetIndexBuffer(12, Sell_Signal_Calc, INDICATOR_CALCULATIONS); + SetIndexBuffer(13, Buy_BarCount, INDICATOR_CALCULATIONS); + SetIndexBuffer(14, Sell_BarCount, INDICATOR_CALCULATIONS); + SetIndexBuffer(15, Arrows, INDICATOR_CALCULATIONS); +//--- set indicator accuracy + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); +//--- set indicator name display + string prices = inp_price == PRICE_OPEN ? "Open" : inp_price == PRICE_HIGH ? "High" : inp_price == PRICE_LOW ? "Low" : inp_price == PRICE_CLOSE ? "Close" : inp_price == PRICE_MEDIAN ? "Median" : inp_price == PRICE_TYPICAL ? "Typical" : inp_price == PRICE_WEIGHTED ? "Weighted" : " "; + string short_name = "Alpha Trend (" + IntegerToString(length) + ", " + DoubleToString(atr_multiplier, 1) + ", " + prices + ", " + EnumToString(inp_change_calc) + ", " + EnumToString(inp_signals) + ")"; + IndicatorSetString(INDICATOR_SHORTNAME, short_name); +//--- sets drawing lines to empty value + PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE); +//--- initialize buffers + ArrayInitialize(Alpha, EMPTY_VALUE); + ArrayInitialize(Offset, EMPTY_VALUE); + ArrayInitialize(Buy_Signal, EMPTY_VALUE); + ArrayInitialize(Sell_Signal, EMPTY_VALUE); + ArrayInitialize(TR, 0.0); + ArrayInitialize(ATR, 0.0); + ArrayInitialize(RSI, 0.0); + ArrayInitialize(MFI, 0.0); + ArrayInitialize(UpTrend, 0.0); + ArrayInitialize(DownTrend, 0.0); + ArrayInitialize(Alpha_Calc, 0.0); + ArrayInitialize(Buy_Signal_Calc, 0.0); + ArrayInitialize(Sell_Signal_Calc, 0.0); + ArrayInitialize(Buy_BarCount, 0.0); + ArrayInitialize(Sell_BarCount, 0.0); + ArrayInitialize(Arrows, 0.0); +//--- setting a code from the Wingdings charset as the property of PLOT_ARROW + PlotIndexSetInteger(1, PLOT_ARROW, 225); + PlotIndexSetInteger(2, PLOT_ARROW, 226); +//--- Set the vertical shift of arrows in pixels + PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 20); + PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, -20); +//--- create handles + TR_Handle = iATR(_Symbol, _Period, 1); + RSI_Handle = iRSI(_Symbol, _Period, length, inp_price); + MFI_Handle = iMFI(_Symbol, _Period, length, VOLUME_TICK); +//--- initialization succeeded + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[]) + { +//--- check period + if(length <= 1 || length > rates_total) + return(0); +//--- latest data copy + int copy; + if(prev_calculated > rates_total || prev_calculated <= 0) + copy = rates_total; + else + { + copy = rates_total - prev_calculated; + //--- last value is always copied + copy++; + } +//--- populate buffers + if(CopyBuffer(TR_Handle, 0, 0, copy, TR) <= 0) + return(0); + if(CopyBuffer(RSI_Handle, 0, 0, copy, RSI) <= 0) + return(0); + if(CopyBuffer(MFI_Handle, 0, 0, copy, MFI) <= 0) + return(0); +//--- calculate start position + int bar; + if(prev_calculated == 0) + bar = 0; + else + bar = prev_calculated - 1; +//--- main loop + for(int i = bar; i < rates_total && !_StopFlag; i++) + { + if(i > length) + { + //--- calculate alpha trend + ATR[i] = fSMA(i, length, TR); + UpTrend[i] = low[i] - ATR[i] * atr_multiplier; + DownTrend[i] = high[i] + ATR[i] * atr_multiplier; + Alpha_Calc[i] = (inp_change_calc == No ? RSI[i] >= 50 : MFI[i] >= 50) ? UpTrend[i] < Alpha_Calc[i - 1] ? Alpha_Calc[i - 1] : UpTrend[i] : DownTrend[i] > Alpha_Calc[i - 1] ? Alpha_Calc[i - 1] : DownTrend[i]; + //--- plot alpha trend + Alpha[i] = NormalizeDouble(Alpha_Calc[i], _Digits); + Offset[i] = NormalizeDouble(Alpha_Calc[i - 2], _Digits); + //--- plot buy and sell signals + Buy_Signal_Calc[i] = Alpha[i] > Offset[i] && Alpha[i - 1] <= Offset[i - 1] ? 1.0 : 0.0; + Sell_Signal_Calc[i] = Alpha[i] < Offset[i] && Alpha[i - 1] >= Offset[i - 1] ? 1.0 : 0.0; + Buy_BarCount[i] = fBarsSince(i, Buy_Signal_Calc); + Sell_BarCount[i] = fBarsSince(i, Sell_Signal_Calc); + Arrows[i] = Buy_BarCount[i] > Sell_BarCount[i] ? 1.0 : -1.0; + Buy_Signal[i] = inp_signals == No ? EMPTY_VALUE : Arrows[i] == -1.0 && Arrows[i - 1] == 1.0 ? Offset[i] : EMPTY_VALUE; + Sell_Signal[i] = inp_signals == No ? EMPTY_VALUE : Arrows[i] == 1.0 && Arrows[i - 1] == -1.0 ? Offset[i] : EMPTY_VALUE; + } + } +//--- write signals to GlobalVariable for Mt5Bridge + int last = rates_total - 1; + GlobalVariableSet("AT_Alpha_" + _Symbol, Alpha[last]); + GlobalVariableSet("AT_Offset_" + _Symbol, Offset[last]); + GlobalVariableSet("AT_Trend_" + _Symbol, Arrows[last]); + GlobalVariableSet("AT_Buy_" + _Symbol, Buy_Signal_Calc[last]); + GlobalVariableSet("AT_Sell_" + _Symbol, Sell_Signal_Calc[last]); +//--- return value of prev_calculated for next call + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Function: Simple Moving Average (SMA) | +//+------------------------------------------------------------------+ +double fSMA(const int _position, const int _period, const double &_input[]) + { + double result = 0.0; + double sum = 0.0; + for(int k = 0; k < _period; k++) + sum += _input[_position - k]; + result = sum / _period; + return(result); + } +//+------------------------------------------------------------------+ +//| Function: Count bars since last event greater than zero | +//+------------------------------------------------------------------+ +double fBarsSince(const int _position, const double &_input[]) + { + int result = 0; + while(_input[_position - result] == 0.0) + result++; + return(result); + } +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/Program.cs b/Program.cs index 688919c..02890b4 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,5 @@ using MtApi5; +using Microsoft.AspNetCore.Mvc; using System.Reflection; var builder = WebApplication.CreateBuilder(args); @@ -305,6 +306,47 @@ app.MapGet("/history/deals", (string date_from, string date_to, string? symbol, return new { data = dealList, count = dealList.Count, format = "json" }; }); +app.MapGet("/gvar", (HttpContext context) => +{ + var mt = context.RequestServices.GetRequiredService(); + var total = mt.GlobalVariablesTotal(); + var vars = new List(); + for (int i = 0; i < total; i++) + { + var name = mt.GlobalVariableName(i) ?? ""; + var value = mt.GlobalVariableGet(name); + vars.Add(new { name, value }); + } + return Results.Ok(new { data = vars, count = vars.Count, format = "json" }); +}); + +app.MapGet("/gvar/{name}", (HttpContext context, string name) => +{ + var mt = context.RequestServices.GetRequiredService(); + if (!mt.GlobalVariableCheck(name)) + return Results.NotFound(new { detail = $"GlobalVariable '{name}' not found" }); + var value = mt.GlobalVariableGet(name); + return Results.Ok(new { name, value }); +}); + +app.MapPost("/gvar/{name}", async (HttpContext context, string name) => +{ + var mt = context.RequestServices.GetRequiredService(); + var body = await context.Request.ReadFromJsonAsync(); + if (body == null) return Results.BadRequest("Invalid body"); + mt.GlobalVariableSet(name, body.value); + return Results.Ok(new { name, value = body.value }); +}); + +app.MapDelete("/gvar/{name}", (HttpContext context, string name) => +{ + var mt = context.RequestServices.GetRequiredService(); + if (!mt.GlobalVariableCheck(name)) + return Results.NotFound(new { detail = $"GlobalVariable '{name}' not found" }); + mt.GlobalVariableDel(name); + return Results.Ok(new { deleted = name }); +}); + app.Run(); DateTime MtTimeToDateTime(long mtTime) @@ -352,6 +394,11 @@ class TradeRequestBody public TradeRequestDto request { get; set; } = new(); } +class GvarSetDto +{ + public double value { get; set; } +} + class MtConnectionService : BackgroundService { private readonly MtApi5Client _client; diff --git a/README.md.md b/README.md.md index e7212c3..3e1d77e 100644 --- a/README.md.md +++ b/README.md.md @@ -431,6 +431,50 @@ GET /history/deals?date_from={from}&date_to={to}&symbol={symbol} **示例:** `/history/deals?date_from=2026-07-01&date_to=2026-07-03&symbol=XAUUSDc` +### 全局变量(MQL5 信号桥) + +让 MQL5 指标/EA 将信号写入 GlobalVariable,Python 通过 Bridge 读取。无需翻译 MQL5 代码。 + +``` +GET /gvar +GET /gvar/{name} +POST /gvar/{name} +DELETE /gvar/{name} +``` + +**列出所有全局变量:** +``` +GET /gvar +``` + +**读取指定变量:** +``` +GET /gvar/{name} +``` + +**写入变量:** +``` +POST /gvar/{name} +Body: {"value": 75.5} +``` + +**删除变量:** +``` +DELETE /gvar/{name} +``` + +**MQL5 侧(指标末尾加一行):** +```mql5 +int last = rates_total - 1; +GlobalVariableSet("MY_SIGNAL_" + _Symbol, Alpha[last]); +``` + +**Python 侧读取:** +```python +resp = requests.get(f"{BRIDGE}/gvar/MY_SIGNAL_XAUUSDc", headers=HEADERS) +signal = resp.json()["value"] +``` + --- ## 七、调用示例 diff --git a/bin/Debug/net8.0/Mt5Bridge.dll b/bin/Debug/net8.0/Mt5Bridge.dll index f79b3e1e74c978f0038997ed37f4d8f992e8041c..b30033ccf79f66b67cba37a59c270869f3ab2197 100644 GIT binary patch delta 22937 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%0AvqjVER{#m6#Bn@i|y(yGl$&iicIa00V+j?aC2 z?B~#p7Te|1{O8bSi!Cg7f^D-{PQnNFfW=-x+UL-2i`o4JVEZg~Bw7OYjLFiDH!w5j z&`TzjC3FtO$C=4+rst8T#$>#N=F^)N<3#7v$P>F0T|g&T?D9g*zkp7%*c%Ba*i@4t zLawoZmI(VZr8&g;^rl5Q#6lW~NBPcGx{&@X%$&nT^jC{T1Dbyk9kAGO7>h-8&| zr+)55beS-7Szbi@Cz+k#F0G)~PU`N`3fei@jPR{Ly~lnr?X~D_VaW@FE-z`lg~nQx z-L%kU!ZzY5@HBrbtv+2cg&RCV(PhFiw9s~j|9A9&#qP8H#=nMkPBr_qIO|5&TH0%| z6_61tN z{$;VrzWM&kh+p`4$IS4hz?>GF6r1l~PeF@KiKW1DEp}J-eE;QXDzWGvvs3=dslsBn z>FfPh&=8Al(>H>Rw%8kqyXZ=)vDk-+0N5!OyS#9{|0=?XktB0%;YP4?EcSKQdjHjQ zp2hx~wGk|xvS<}5ub~Sqb|NaTp%#e%!v1p6g-xdwMn9Mep?gp1u^epWf6T@?T3;)43NJdOz~0|2k?EwlRA_ z(LVq6v|89YN$q;NOxPNH3bh|~)6d{`Yw(u*y#EH;X0Z>HxBWNKM;4o|e(JxO-kl-$ zzcq9~)dRQC*E7wAr`q(uZM1oo$!@Uu16$}aoG`P~f7xBrRfv6l|z zia>v`lfck_)6G*f-Ku2Mr|7l$-KI~`0b!=)emZ2;vE_bxrlH$%KSXR?JVC28%ix2^ zuW^8($+xQ&+7V_;{!!=(oo#Z`IK!~f0yOAd-Hv9c_H*rXaHLURSla1xpiVy68#J{D zUk<=q5#cq=Q;x6r&?7#=d%zON9vYM&^3nnL@sSfYeo`U#j&c|mBZSGr(TR<+;8Y{K zgn1Vsb(#?6Fvmc4P!npM)BzVRdI2_Wx&f^`vsOBhGtEf$D#3Ai;CsaC32O9J|dgh?-VCtl+A-iNS-SjCm9@>HA{&%Muork1< z%_p~YiXY1Z#$T4h-!XHl%%4r>Pm_>#nLl0T&ye|Z^laR#?Tv*z9-QK@CC6iCqiRfz zCLOR#w{=RNg}{ac!_gl;8R_gX50Tm9-tKt0sj`xL>(9q3>8)vuv&JV=un0@ltUU_T zSUyLo{y#OlWk&rHpcP3gG+lPn9hf);X8@e;-9Uxzma$hJ#B6#N-#mX7pP4+1$xhG3m$HJyj~6*W7d~E_TNJ>DX^bNTs|6X-hTaIaG%Q5Y2Ii{U0$F#HMn0B@t z)6SM-+SzhUJ6n!vXUj2dog{|?ZFFFv$O}bY#&VjL30Wl-t3+Na@>-Fv6!}V#@kD^$ zUn}w^kvECFRphNA?+|&1$U8;eDRP~R!9u}hf~y46Yo)kS@LIu5f?EZ52<{Y&D11;E zQ69r#ZA9VY<_P}q>J%U!H%AmcZjLB?+#FH(xH+QmadSlB0`A5G`M5cu@NsiO;ltE~!pF@Cg^!yP3LiIDihZTR$IX=r zA2(MjeB4~A@Nsjc!pF^(l2E0>$IU|(KCB(8@M-fDqs7l?@iSWdjE21z_I%u2 zqwwi*jl!qRH42|L*C^Z5IBu>{__(=7;p65Sg^!zS(7>xqmIjj*K5m{2%_N#Gfv2P2 zShfluH%~`^Q-C}|(-l5$o{n^#Kt67sE*+STM5Bdw+_ z+FFsX6uee&li*gt9fFh8>&v!jJ4N2hnAY|Sc|q_s!Aa`6;5O|Z8lN4&Iq%$}E9?)_ zx}x9P+vR%DPV=&MKu+TAEcov!ye2)W9jxw&ve%$`0ReP;| z0Gj9V&d^RRg$L~EcKR@jRsDd^BD_xRO8?*?d%IFp_6cxg^gH{H%I76VfQKVCy#q;P z>!&M^`-_0hnGOhd=;D+D`;C12Spbz@S>D40Nq%IDeqEAvv{CClh%8b&f@Gw8P zSpO$tHR~N|dZ2J8RKp{W0_*%w>iDPnPKBxx%}O0ZtpG!^Pj>vMOeo*s7!3_R;Z*m;9(8n(H{R}8fka;dE{_Iig|f>y z;8?HnD=f>bSy6BojaIAt9gZ5b9iu6>t4qnL*xoCvbWRrklawK8-(3`x?1IVzu{=jm zIS^sohqQu9L6EU3aFH{pR2Virs7!=B9gRzo#Jy3QK3mf2!1?yQ&JH>!azF5`!d<{C z{Es>7Q2V-bwmQr>Y|K{OWjNfBz#X&)Z9C|nrD<-qB$Dg;5wo}hPQNTHc6HFL{-kRe zOpk+{9bN2N1-aC*RvNb|@A+6 z?}W`^Bi*5lEnTe7vQ5wW#JyL&Iq?IKXL>(yjMhOTjS|mN+lA!=JRNjhsX}|j#S7}V zqOqRW)XR+#db`qOoDO*dw&ES?uotl#T-7p|Z2d?c=SsOQ4xj6~48!d6~h=)Fla-;gbs@NTjF)u+%swioq&-Y?Z^ zd?rwg&xTip$|${tj`;e}Z|Lp30eIf63=Y6|$c_c(;i~`x@bUNAzzVtrIE3y6j-rQw zZ$RXvRU4M!ry`vui~)PmJb4b9zpl!oga^X{*$(k=iw=P3CSE{T9*RA^JO@ zUz@v6^zEX5O7u@bKQHf)=sQIJq3Az^erq~UQ6*oM^DP#+RJ{U$OI4nlYSD}n%{bB2 zil$X?jp)~iev4@C5I^lAKP7U9$RCQV*d&%sVu_rtmZDa$RdB71`@KcvcELk79@q|% z@#R(?WQ`rgMJ^V3tjN_O*9x`@ZV_x3>=0D!+_qS-IxR)5V5{I3!L4>qqFv+;K}F|g zn$G%Sk;m$sO0~#yM6MONMdVhIH;cSQid-#ntzau-I<&>Zt8t5{+C^>`xkKa*kw5Zq zFvZK3idT{oxme_Ck*h_n6}eXA7B8pLDwUPn$ zi~f*kIz-bU8pS86_#_pPi$$&$xmx6QUxqFTbpSVp$SLgWNwB{Wv#8qv=YxehXtfQ;+^W>M`E+%FY}M5dS|5xW8|;vy$vl8R`?ie`>r zi{M(+Dxu9H?-Se)4Q^K=eOVf|RaIf91-DVOze!8w90f{B*gTjhvp%Pc^$SW_-yRc6Ka zW8jkVFYrA#9P)hyJP`XQ(CPmXsK$-}5Bu45UN*bVl3;dm{jR~TCq&uxF$TMCDrMIl zF?Rhz8N0qA`wQT%Fnj(!z@C!{_B^zlJ%=UfWMFpy=WOpvFDFDf_mL7{et-k~q;r5X z;v8T`lml=BeD^oT3B4U*`~6~H9Ax{^f$oGR2iV?7u>A>Q|7w8k=LdLf?u@bh^cd{Z zIMn3;-zB)g)!E#GK?&}`rwQ)C4xM}OOGoELk8))B*`c$aPZR9t?>-Lyh>z1$Z>1iBlX6P@#8*z%L@+VEC;E$M}hkOUU2ze_|r90_w zknaNG5R_hqybY-0$l+DU_X1VgPOn4W0aWqN6ubfXKA=kX(_4@q0IE0zcn9)BK$Y6g zqW3^{0#$mL-iN#ksNxSFJ0R}{;vk(qg#0K_#TP<9hWt1%n;udsfIF4`IPKgGIfovB zoJ)^G&ZT{s?;Fode{3V|SS_X9q&=)1&^olQHJd%lKG;6dey+X2zRcccf6D%neVP8O z{k`*q*M3*7d$Ic-_iOI2-8r5S zo|8QLJg<0;_i8PCB;E6801kH@SSek)3Eo0XqbR#{Q@n4APVLgLP;X;I`?=?8S?yZ~P-F1`>@uzr?IZDa8cZ!d0JjHAO6}wr#qT7RyX^swzzXd-^H^p06 zD*f--lUd$AI2k{>@n3(To8rAYeze^bZ%5HDbqTSL4!9!0PmB3K47Oh1m{@q} z1G`804pwtE;sDg1Bx4JtxQ>nI&wLI5QU|E2!XkMh}?PHK1AQh2!!YvNgzbqWduTWr;Gq@%=u{^ z`Vifm&m$0`&t#!RtN;-!K*S0Vp*wOpK*S0Vu>wS_01>q3A&$Tw3M{cpWTax4Voo$h z4Fx<>F$88mF&dDTOk;Gt^fZP!=DCVl4zeu=+4P#sb+)C?wGzz5P_pA(I!heqA^~=s zYfV8e)r;R;1Z2Otv?`Ai%(X@!m(m@%JOcP*5y?2;T3q=wLFTHE2IkZ%Gqib1z1F7u z!``Nxt$(g;Fuqs*V>s2b9a-voj#4$(S*DJ3ey*JD%&0T8&y{BP=gKYaE$UvBZ@V8> zkM%sE&c^SBo;TD-J@2V+dpgulJb%aU6E=0YH#6s=UG_!G#vFTYCbXizZP1W8nTi#s zmCUGJxV(OPZPWR422pj>ipBF-KBa!yf>hlJ%NrKf)i-8VuQ+C4ms$0NwGGSa8(}@U zp=lY4(PKuOd+xw<2Mwmtqfe=ASUe^%X70J?X5L>hx_oY`ZUy3fip&EmXs&#hjZ zTD)RWYI)Q26-(*|4W5%Jx;Q&(IT_O1$@GhdC{3Bxi`QnGF^=t3jiAS7)Rkvuo?20) z49lFkvLrM7; z%+;%pcg(L}c5Yq$!urg!t6$VuXuB+3s%RHrxY}-SdE917C#@Z>_$Sman_9ngc|&7; z-L(3~3)-45S)v3dEKJR}>UALDk1G*kL_2 zL2A3^@|jAgce`;5>gQ!XzGBf)>Za+bWtr2i92n?rT~puIeB~9YbHW9+jnnFv)hx^C z*F0k;-+oQlO8(gmjdnLj=A7%BmSqNCe=sxmidbgO^;%}Y4f&bk8%FuL9}V;Br!=N6 zXy7Gq(hXz$6PGPpVzuG1Yiqt?fST-`07in)LoRw(Ol!OUrdGvvLTz1J@|NS2wt1Vp z9%WSK?Ar@RTtKz>2yZza;p6zTkT}la2H}fear`#pA6-}p9>*hoJ#6anxn4bF%dV|% z+ZZL`J_g^|V;_xpw(pjYLA%A!E<%guw$1lUwT&#E03Rv5GH|>Z(xL%4S3Jk@w>L^w zANXDjn`J1^L%AHRj+C}9tB<+{n~ESk#vFAnpu~XsC)aQCx=7 zDe8u3^k`@_Qgv_z3s8qn51pao74q}~pFK{YRy*#Cp;j;cw-iD6YfwXrLQCy&Rmsl| z1{4?s@xQ4r#9#I*p{33M28Px6hYrA}WUgq-(~3i_#hH8C68^rS*8aXw>!7%_S(>^3 zvE0lLZ4;E5%<(&Om5G_Nc9xeprEW#2b2;e+V6L=5Up82C#vEjtG&$7b%| znV%S8j|S@%w}u(PKV+bU=HT8HZ0RrtDvA;?vzn9nYG>Ygx2mC*Euoe>LrZ1$T90#} zzb*F!TdToCEw}od_>*Lm_}>;MRl1q)jB_hruyv9~isG}A>ht+H%mVJ-0{oL=YBc1~ zd{ATDf~}`#mOOl7;0$;~n^`El!Pc|G8D&>E^VY*>7v9OaIeGw~56c+0tnb+}C%|24ZB`1gDq5Q} z?%jQq=FE`YtNoWCx+~ba-t5g)nSHxw`!|}p>rCBEnTkCXh3#nXu|-3b4ku^h_4*t> zjGu}VrBF+IX4#$!<>}1kJz2ordrk@7%ERCewr=5JKzU~-_DH{U$Z&*~Vy&Tf`REnr zuVFzhGO(};QDUBb4uIE(Ra~X|ylBlmQhYAt&Ed_KPD2YVwVErc&%w29&U07ihz48U z!suPX`R>A_@JX;L9Gep%0mn}-WU{oX!l7iw`u;wyz4V&|nI&?(DAq7sd#80-l%rRom+ z6D%zq3@@W%HY#MwSn-~diL47$t-$YOWMB>=r_zkEZN=X|;Rj1H^TOVK(cb{VWL39WGOWd^0s z%U0$!4vg1!K2}ZUoX1o48e5XQnZG{1xzC{C_4UJt4yvk~J9ysQW2=S^t*;w0ysG}# zfkUf?&8r$R_`JEp2h~>%&Rq9Iot99jDD&16`O47D_fPyb%d6n4cKA`G8!iQ}{P$knnv_$fu>U#ut@#1JZ$YqrI6l5`g}XD+R@7~ME2BSK5_mE1?!C3EUm4f- z@2|g(pA~*HQ}yh$!IrYAQwiVWPkie8>)z;pU|rd!g?E03_MJc8e?f|GERLx^|IqgO zvpH&;?**6bltK6_+j{&roQC2tqzbq9xilCb2hOEq!G_{LegGMQ`YK4r;xBlHLK+5( kDrg7epZwzws?Kt6 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 diff --git a/bin/Debug/net8.0/Mt5Bridge.exe b/bin/Debug/net8.0/Mt5Bridge.exe index eae3425950719bb3e882cf0f7a4cecedb3f853de..5ab86cbb98f6bed981967dba8f5199512e4eb511 100644 GIT binary patch delta 97 zcmWNIu?>JQ3gkfhCFI}*>ponli_aic(?VpuF-@&dFdt%n4@n}Er zC$dh1erwT^+0d6m8andV-5A&M;>i=+^j^OS*s|>0ULsS@D|J3z$VF*d2J{8?0bRf^ zi4w>I#u`MY1Fymk0G0v{zy#z0(m4)}uoI{T4gyWU3E&KH9=HPB2EG6u0)Gac0pA0rG$wz*0)zokz+fN& z7z0cIQh;n=h8;8?Se)h_#Bx_FcK5|}NQ(_mXPOFp4tQiR4Fx7-Awe;j7W<=g_r4 zcia2bm%S&q)tn`&8~apz2Ioq zB}j);IxQVK{wM#mE-v|JbXxK|b@{JA|3atVgtnj4Ipl4LHUQEYJA+Fbp(n%sfu>E+ zWw1km^MEI`ToZs#VR!2x&=;W1TKqBeMc5WiZ)URp$05t|4Ui-Z0LH*hg6|USNUeh` zz+b_R(sU>8+pVSlVok?kQb)k?wU$2^dI@4F(7#6CA<%M-!~N;9&e05~=vR?|eT&}L z^iXKogO&qV5Fe%$km(XVLd)N-Y1!F=V6OqLB0fsXm-TQB`gKjeE5DNKaE#U*F&MSz zvCz?oJ<{Td(DFJj12+&KujQ}M^h9XcUB_xV2|5h+VBj<4PuB9&p>G0HG;NnTyM=^q zhwMn7LnmtqbD;0&^hmt9dpezq0pHi@PMHT>erTDzT&mh-8^9i}HDsV0EU{GW59l{pDdmaex{jV z#Wj&0bO5%2;*n!??JFj_4cqQX7Z5PhKOnqlE!dm>1ooj>U|(8_s2}Zu-9sC7HEg1C zfXV8*!4}x=1!q7F8E8G&OxqFlqDXL0t*`vTnBrW$s-%~l7DBi;DyFyp8*upzSp9Of z!p~IZ%5>XOnh3`P{Bn3I+E(`oYy(MYqpO06K7s8?Ig(C$T=_BxtT5OfWS3Nf>-8F` zP;#`SZky>^N)h$WlnB#%DR;1i+`|&Ok6(T?3QXr{^xx-E)5}PKsWrV!6r9=xyC9W% z8_Aw(3pUb+X|`Y!?ErgHRay-^z0*6v(dnIbxZ={gAl^x*KA4$w8~FOvvEZnTS>V2z zHQ?IJPH;$87kG9S^)=G&EE_m1do1|F>{;NO*$(iRU{89ST?4ysP8WE5jxEGU)?8bN znV!J*qF%WUcvP^}OhstCXnk%MT;9{Vkn}ZdFXCxxyY~{q^87{1)M%fp9?SEWs!x4# zxlo<#o2^#+Ub7|j^11Za7soCXR(9Tt9diD5V(Q9M4K4nw8k61#7N3 zjkKrphO?uY$?h>z~()?wTh$L;mp5znW~ z`1DJz{yPWs!Mbwhqr@=9+=p0MX&}q#vOsKR?3~Z+Z&1vRzY&M6G+_l=PQUa-V{op* z9HX^6SB1MBtF2nw&)u#G)!GPmyH?9vJHV~iY5D84e0v|a-yY^}9h!D%+8N^ZJ8kZE zz01GQ;9TF|?bx6tY|s))w2mcOyi^-NscQg=b9Jn{UwM?)#z|{*mJfI9ty;aUwh;I; zox9YTdGSUZxolP|^A;rjg`EQxXCXVk;|*+aJn-O>Of$~7(g>w=sRjEe55-FzrEU22*H?M8 z7E5j3oG1zZQLV|J*{>mh8-{bkOl~OWhTkd;$CN{Zl!k0egDEx|Sx%E`n;ji+kq`G% z4iC39o*5V;UVk-rc2qzMf8?ip6k=&Qv|^xmE$Y_U#rFMt^g1_(b8`|mFXQGKZhpqc zb}7wQlw+An^CHX9-6^q>oq!n_ui(F{DETM~Q*e-ZDc+bQe1|J5m|_)kAVn)UauDk& zGlcK|6$x^REW~m*&=lYNzTyt%)-l{##;qT7>+jfp(#$7EE3G#zt;1sC%i#tXtz8z~V9r5A#wqR$i8b2qzhkTk~*=Cf8|B(@|h0 z;JDWlO!5)Z-S)J$*9W!NN3_3$M>+LF8Yll);%-62k<9#_q9)BvjJp3O`utc%cOOOZ Xp$xN!wPcb~@>xVF1`<&!{{{aW5%G%- delta 3196 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%0AvqjVER{#m6#Bn@i|y(yGl$&iicIa00V+j?aC2 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 kDrg7epZwzws?Kt6 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 diff --git a/obj/Debug/net8.0/Mt5Bridge.pdb b/obj/Debug/net8.0/Mt5Bridge.pdb index 25e0765e74c78dc45c8ce5b1a5e910235e64d3b3..b6a0e8fc6539b68141c88a6b8d6f425b4f8b9ca3 100644 GIT binary patch delta 3882 zcmZu!3sh9s6+P!MGYnq^Wr8xmi1HCo8$W1LVgkfhCFI}*>ponli_aic(?VpuF-@&dFdt%n4@n}Er zC$dh1erwT^+0d6m8andV-5A&M;>i=+^j^OS*s|>0ULsS@D|J3z$VF*d2J{8?0bRf^ zi4w>I#u`MY1Fymk0G0v{zy#z0(m4)}uoI{T4gyWU3E&KH9=HPB2EG6u0)Gac0pA0rG$wz*0)zokz+fN& z7z0cIQh;n=h8;8?Se)h_#Bx_FcK5|}NQ(_mXPOFp4tQiR4Fx7-Awe;j7W<=g_r4 zcia2bm%S&q)tn`&8~apz2Ioq zB}j);IxQVK{wM#mE-v|JbXxK|b@{JA|3atVgtnj4Ipl4LHUQEYJA+Fbp(n%sfu>E+ zWw1km^MEI`ToZs#VR!2x&=;W1TKqBeMc5WiZ)URp$05t|4Ui-Z0LH*hg6|USNUeh` zz+b_R(sU>8+pVSlVok?kQb)k?wU$2^dI@4F(7#6CA<%M-!~N;9&e05~=vR?|eT&}L z^iXKogO&qV5Fe%$km(XVLd)N-Y1!F=V6OqLB0fsXm-TQB`gKjeE5DNKaE#U*F&MSz zvCz?oJ<{Td(DFJj12+&KujQ}M^h9XcUB_xV2|5h+VBj<4PuB9&p>G0HG;NnTyM=^q zhwMn7LnmtqbD;0&^hmt9dpezq0pHi@PMHT>erTDzT&mh-8^9i}HDsV0EU{GW59l{pDdmaex{jV z#Wj&0bO5%2;*n!??JFj_4cqQX7Z5PhKOnqlE!dm>1ooj>U|(8_s2}Zu-9sC7HEg1C zfXV8*!4}x=1!q7F8E8G&OxqFlqDXL0t*`vTnBrW$s-%~l7DBi;DyFyp8*upzSp9Of z!p~IZ%5>XOnh3`P{Bn3I+E(`oYy(MYqpO06K7s8?Ig(C$T=_BxtT5OfWS3Nf>-8F` zP;#`SZky>^N)h$WlnB#%DR;1i+`|&Ok6(T?3QXr{^xx-E)5}PKsWrV!6r9=xyC9W% z8_Aw(3pUb+X|`Y!?ErgHRay-^z0*6v(dnIbxZ={gAl^x*KA4$w8~FOvvEZnTS>V2z zHQ?IJPH;$87kG9S^)=G&EE_m1do1|F>{;NO*$(iRU{89ST?4ysP8WE5jxEGU)?8bN znV!J*qF%WUcvP^}OhstCXnk%MT;9{Vkn}ZdFXCxxyY~{q^87{1)M%fp9?SEWs!x4# zxlo<#o2^#+Ub7|j^11Za7soCXR(9Tt9diD5V(Q9M4K4nw8k61#7N3 zjkKrphO?uY$?h>z~()?wTh$L;mp5znW~ z`1DJz{yPWs!Mbwhqr@=9+=p0MX&}q#vOsKR?3~Z+Z&1vRzY&M6G+_l=PQUa-V{op* z9HX^6SB1MBtF2nw&)u#G)!GPmyH?9vJHV~iY5D84e0v|a-yY^}9h!D%+8N^ZJ8kZE zz01GQ;9TF|?bx6tY|s))w2mcOyi^-NscQg=b9Jn{UwM?)#z|{*mJfI9ty;aUwh;I; zox9YTdGSUZxolP|^A;rjg`EQxXCXVk;|*+aJn-O>Of$~7(g>w=sRjEe55-FzrEU22*H?M8 z7E5j3oG1zZQLV|J*{>mh8-{bkOl~OWhTkd;$CN{Zl!k0egDEx|Sx%E`n;ji+kq`G% z4iC39o*5V;UVk-rc2qzMf8?ip6k=&Qv|^xmE$Y_U#rFMt^g1_(b8`|mFXQGKZhpqc zb}7wQlw+An^CHX9-6^q>oq!n_ui(F{DETM~Q*e-ZDc+bQe1|J5m|_)kAVn)UauDk& zGlcK|6$x^REW~m*&=lYNzTyt%)-l{##;qT7>+jfp(#$7EE3G#zt;1sC%i#tXtz8z~V9r5A#wqR$i8b2qzhkTk~*=Cf8|B(@|h0 z;JDWlO!5)Z-S)J$*9W!NN3_3$M>+LF8Yll);%-62k<9#_q9)BvjJp3O`utc%cOOOZ Xp$xN!wPcb~@>xVF1`<&!{{{aW5%G%- delta 3196 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 diff --git a/obj/Debug/net8.0/refint/Mt5Bridge.dll b/obj/Debug/net8.0/refint/Mt5Bridge.dll index e7ef212758b3b28b4cefea482df98aff0cda1984..458234e58ab7540f41df93c7fab1a1225b7de329 100644 GIT binary patch delta 3359 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 diff --git a/延迟测试.py b/延迟测试.py new file mode 100644 index 0000000..077a5d3 --- /dev/null +++ b/延迟测试.py @@ -0,0 +1,53 @@ +import requests +import time +import statistics + +BRIDGE = "http://61.164.252.86:13485" +KEY = "UiHMqtaYLZzwBdcuS4RFmEGhgDO8N2eI" +HEADERS = {"X-API-Key": KEY} + +N = 20 # 测试次数 + +def test(name, func): + times = [] + for i in range(N): + t0 = time.perf_counter() + try: + func() + except Exception as e: + print(f" ❌ {name} 失败: {e}") + return + t1 = time.perf_counter() + times.append((t1 - t0) * 1000) + print(f" #{i+1:2d}: {times[-1]:.1f} ms", end="\r") + + print(f"\n{'='*50}") + print(f"{name}") + print(f" 最小: {min(times):.1f} ms") + print(f" 最大: {max(times):.1f} ms") + print(f" 平均: {statistics.mean(times):.1f} ms") + print(f" 中位: {statistics.median(times):.1f} ms") + +print(f"测试 {N} 次,请稍候...\n") + +# 1. 健康检查 +test("健康检查 /health", lambda: requests.get(f"{BRIDGE}/health", headers=HEADERS).raise_for_status()) + +# 2. 账户信息 +test("账户信息 /account", lambda: requests.get(f"{BRIDGE}/account", headers=HEADERS).raise_for_status()) + +# 3. 实时 Tick +test("实时 Tick /tick", lambda: requests.get(f"{BRIDGE}/symbols/XAUUSDc/tick", headers=HEADERS).raise_for_status()) + +# 4. 持仓查询 +test("持仓查询 /positions", lambda: requests.get(f"{BRIDGE}/positions", headers=HEADERS).raise_for_status()) + +# 5. 品种信息 +test("品种信息 /symbols", lambda: requests.get(f"{BRIDGE}/symbols/XAUUSDc", headers=HEADERS).raise_for_status()) + +# 6. K 线数据 +test("K 线 /rates (100根 H1)", lambda: requests.get(f"{BRIDGE}/rates/from-pos", headers=HEADERS, params={ + "symbol": "XAUUSDc", "timeframe": "TIMEFRAME_H1", "start_pos": 0, "count": 100 +}).raise_for_status()) + +print(f"\n总结: 你的网络 → MT5 云端 往返延迟") \ No newline at end of file