程序库: Expert - 页 13 1...678910111213 新评论 hini 2025.06.14 17:15 #121 fxsaber #:如果有问题,请提供准备好的 mq5 文件以供播放。#define MT4ORDERS_LIBRARY #include "../../utils/MT4Orders.mqh" // #define REPORT_BROWSER // 在浏览器启动时创建报告 - 需要 DLL 权限。 #define TESTER_CUSTOM // 在用户测试器中运行智能交易系统 #include "../../utils/fxsaber/Tester/Tester.mqh" //https://www.mql5.com/zh/code/24848 #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID) #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define KEY_B 66 #define KEY_S 83 #define KEY_C 67 input int In1 = 1; input group "label1" input double In2 = 2.0; // void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam ) { if (id == CHARTEVENT_KEYDOWN) { switch ((int)lparam) { case KEY_B: // 购买 OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0); break; case KEY_S: // 出售 OrderSend(_Symbol, OP_SELL, 1, Bid, 100, 0, 0); break; case KEY_C: // 关闭 for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL)) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100); } } } void OnTick() { //Print(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE)); } void OnTimer() { /* Comment(REPORT::OrdersToString(_Symbol, 0, 5)); */ } int OnInit() { Print(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE)); Print(_Symbol, " In2 = ", In2); return(INIT_SUCCEEDED); } // void OnDeinit( const int ) {} // void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { } //+------------------------------------------------------------------+ 示例代码使用了 Tester 库的代码。启动后,变量 In2 为 0,而不是 2。也就是说,分组后无法检索所有输入参数。 fxsaber 2025.06.17 07:43 #122 hini #:这种情况似乎没有考虑到。当参数是组时,没有特定值,获得的值将为空,因此不会获得组后的参数。 下面的代码表明一切处理正确。 input int In1 = 1; input group "label1" input double In2 = 2.0; #include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003 int GetAmountExperts() { int Res = 0; for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart)) Res += (ChartGetString(Chart, CHART_EXPERT_NAME) != ""); return(Res); } void OnInit() { if (GetAmountExperts() < 2) { MqlParam Params[]; string Names[]; const int Size = EXPERT::Parameters(0, Params, Names) - 1; ArrayPrint(Params); ArrayPrint(Names); for (uint i = Size; (bool)i--;) EXPERT::AddInputName(Params[i + 1], Names[i]); Params[Size].string_value = "7"; EXPERT::Run(ChartOpen(_Symbol, _Period), Params); } } 结果。 [type] [integer_value] [double_value] [string_value] [0] 14 0 0.00 "Scripts\Test6.ex5" [1] 14 1 1.00 "1" [2] 14 0 0.00 null [3] 14 2 2.00 "2.0" "In1" null "In2" 通过 Expert.mqh 启动智能交易系统。 hini 2025.06.17 14:36 #123 input bool InRun = true; input group "label1" input double In2 = 2.0; #include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003 int GetAmountExperts() { int Res = 0; for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart)) Res += (ChartGetString(Chart, CHART_EXPERT_NAME) != ""); return(Res); } void OnInit() { if (InRun) { MqlParam Params[]; string Names[]; const int Size = EXPERT::Parameters(0, Params, Names) - 1; ArrayPrint(Params); ArrayPrint(Names); int nameSize = ArraySize(Names); for (int i = nameSize-1; i >= 0; i--) { if (Names[i] == "InRun") Params[i+1].string_value = "false"; EXPERT::AddInputName(Params[i + 1], Names[i]); } ArrayPrint(Params); ArrayPrint(Names); /Params[Size].string_value = "7"; EXPERT::Run(ChartOpen(_Symbol, _Period), Params); return; } Print("In2 = ", In2); } GetAmountExperts 函数不知为何运行了很长时间,却没有任何结果。我稍微修改了代码,请重新运行。你不应该给 In2 参数赋值 7(你会看到值是 0,而不是 2)。 fxsaber 2025.06.17 17:53 #124 hini #:我稍微修改了代码,请重新运行。 这是一份堪称典范的错误报告:运行简洁的代码后,立即显示了错误。 已更正,谢谢。 hini 2025.06.18 01:38 #125 fxsaber #:这是一份堪称典范的错误报告:运行了简洁的代码,立即显示出一个错误。我已更正,谢谢。我明白了,如果出现问题,我会以同样的格式提交报告。 hini 2025.12.25 03:24 #126 如果加载了脚本,输入参数似乎无法更改。 //Test1.ex5 #property script_show_inputs input string str = "test1" ; //void OnInit() { void OnStart () { Print (str); } // 使用指定的输入参数启动智能交易系统 #property script_show_inputs #include "Expert.mqh" input bool CurrentChart = false ; // 在当前(true)/新(false)图表上运行 EA string GetMyName( void ) { return ( StringSubstr ( MQLInfoString ( MQL_PROGRAM_PATH ), StringLen ( TerminalInfoString ( TERMINAL_DATA_PATH ) + "\\MQL5\\" ))); } bool RunExpert( const long Chart ) { MqlParam Params[ 2 ]; Params[ 0 ].string_value = "Experts\\Advisors\\Test1.ex5" ; // 专家顾问的第一个输入参数 Params[ 1 ].type = TYPE_STRING ; Params[ 1 ].string_value = "Hello World!" ; return (EXPERT::Run(Chart, Params)); } #define NAME __FILE__ void OnStart () { union UNION { double Double; long Long; } Chart; if (CurrentChart) { Chart.Long = ChartID (); GlobalVariableSet (NAME, Chart.Double); MqlParam Params[ 1 ]; // 自我路径(脚本) Params[ 0 ].string_value = GetMyName(); // 在新图表上,我们启动自己 EXPERT::Run( ChartOpen ( _Symbol , _Period ), Params); } else if ( GlobalVariableCheck (NAME)) { Chart.Double = GlobalVariableGet (NAME); GlobalVariableDel (NAME); RunExpert(Chart.Long); ChartClose (); } else // 运行智能交易系统(使用非默认参数)的最简单方法不是在当前图表上运行 RunExpert( ChartOpen ( _Symbol , _Period )); } //+------------------------------------------------------------------+ fxsaber 2025.12.25 13:03 #127 hini #:如果加载了脚本,输入参数似乎无法更改。 MT5 的架构就是这样,无法为脚本设置输入参数值,也无法读取它们。 这个库有个好听的名字。 hini 2025.12.25 16:32 #128 fxsaber #:MT5 的结构就是这样,您无法为脚本设置输入参数值,也无法读取它们。该库有一个响亮的名字。 好的 fxsaber 2026.01.01 17:27 #129 关于交易、自动交易系统和测试交易策略的论坛图书馆:专家fxsaber, 2018.11.16 09:19 AM. 库的另一个应用实例 更多关于框架模式的话题,当优化启动时,无需设置优化间隔。 #include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003 input group "Params" input int inRange1 = 0; input double inRange2 = 0; // 检查是否设置了优化间隔。 bool OptimizationIsCorrect() { bool Res = false; if (MQLInfoInteger(MQL_FRAME_MODE)) { MqlParam Parameters[]; string Names[]; EXPERT::Parameters(0, Parameters, Names); for (uint i = ArraySize(Names); !Res && (bool)i--;) { long S[4]; ParameterGetRange(Names[i], Res, S[0], S[1], S[2], S[3]); } } return(Res); } void OnTesterInit() { if (!OptimizationIsCorrect()) { Alert("no optimized parameter selected, please check input(s) to be optimized and set start, step and stop values"); ChartClose(); } } void OnTesterDeinit() {} 如果没有这样的解决方案,框架模式下的智能交易系统就会一直挂在图表上。这在测试仪自动化时尤为重要。 1...678910111213 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如果有问题,请提供准备好的 mq5 文件以供播放。
这种情况似乎没有考虑到。当参数是组时,没有特定值,获得的值将为空,因此不会获得组后的参数。
下面的代码表明一切处理正确。
结果。
通过 Expert.mqh 启动智能交易系统。
GetAmountExperts 函数不知为何运行了很长时间,却没有任何结果。我稍微修改了代码,请重新运行。你不应该给 In2 参数赋值 7(你会看到值是 0,而不是 2)。
我稍微修改了代码,请重新运行。
这是一份堪称典范的错误报告:运行简洁的代码后,立即显示了错误。
已更正,谢谢。
这是一份堪称典范的错误报告:运行了简洁的代码,立即显示出一个错误。
我已更正,谢谢。
如果加载了脚本,输入参数似乎无法更改。
如果加载了脚本,输入参数似乎无法更改。
MT5 的架构就是这样,无法为脚本设置输入参数值,也无法读取它们。
这个库有个好听的名字。
MT5 的结构就是这样,您无法为脚本设置输入参数值,也无法读取它们。
该库有一个响亮的名字。
关于交易、自动交易系统和测试交易策略的论坛
图书馆:专家
fxsaber, 2018.11.16 09:19 AM.
库的另一个应用实例