mql5语言的特点、微妙之处以及技巧 - 页 231 1...224225226227228229230231232233234235236237238...247 新评论 rrb1002 2023.02.23 22:59 #2301 对不起,我是初学者......那么,我应该重点开发哪一种代码?4还是5?也许我不太明白--我是否应该只选择交易功能较强的 5? Fernando Carreiro 2023.02.23 23:05 #2302 @rrb1002 #: 对不起,我是初学者......那么,我应该重点开发哪一种代码?4还是5?也许我不太明白--我是否应该只选择交易功能较强的 5? 选择权在你,但如果有人告诉我,旧版本已不再开发,所有最新开发都在新版本上,我想我的选择会很明显(除非有其他情况影响)。 编辑:不过,鉴于您的个人资料显示您在美国,这可能还取决于您打算使用哪些经纪商以及他们提供哪些平台。 fxsaber 2023.03.13 08:28 #2303 交易、自动交易系统和交易策略测试论坛 mql5 语言的特殊性、微妙之处和工作技巧 fxsaber, 2023.01.07 23:01 有两种类型的经纪人,在美国/欧洲翻译时间。因此,滚动时间会发生变化。 经纪商类型可以自动确定。 // Вычисление типа брокера (USA/Europe). bool IsEuropeBroker() { MqlCalendarValue Value[1]; CalendarValueHistoryByEvent(840030016, Value, D'2022.11.03', D'2022.11.05'); return(Value[0].time == ChartNewsTime(Value[0].time)); // https://www.mql5.com/ru/forum/357793/page5#comment_44225999 } void OnStart() { Print(AccountInfoString(ACCOUNT_SERVER) + " - " + (IsEuropeBroker() ? "Europe" : "USA")); } 在某些经纪商上运行的结果。 RannForex-Server - Europe MetaQuotes-Demo - Europe FXOpen-MT5 - USA Alpari-MT5 - Europe Tickmill-Live - USA ICMarketsSC-MT5-2 - USA Darwinex-Live - USA 目前,脚本产生的结果大相径庭。在完全了解 MT5-calendar 的特殊性之前,我不建议使用它。 fxsaber 2023.03.31 11:35 #2304 MQL5 中一个非常简单的技术可以免费加快回溯测试的速度 - 按类型记忆头寸/订单索引。 加快之前发布的快速代码 的一个例子。 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006 input int inAmountMagics = 50; // Сколько ТС эмулировать // Для каждой ТС открываем позицию и отложку. MT4-код для лаконичности. void OnInit() { MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)) for (int i = 0; i < inAmountMagics; i++) { OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i); OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i); } } #define MAX_ORDERS 100 // Индексы позиций/ордеров по типам. struct TYPE_INDEXES { int Index[OP_SELLSTOP + 1][MAX_ORDERS]; int Amount[OP_SELLSTOP + 1]; // Заполнение индексов. void Fill( void ) { ::ArrayInitialize(this.Amount, 0); for (int i = ::PositionsTotal() - 1; i >= 0; i--) if (::PositionGetTicket(i)) { const int Type = (int)PositionGetInteger(POSITION_TYPE); this.Index[Type][this.Amount[Type]++] = i; } for (int i = ::OrdersTotal(true) - 1; i >= 0; i--) if (::OrderGetTicket(i)) { const int Type = (int)OrderGetInteger(ORDER_TYPE); this.Index[Type][this.Amount[Type]++] = i; } return; } }; #undef MAX_ORDERS // Сбор информации с нужных позиций/ордеров. Максимально быстрый MT5-код. double CountOrders( const int Type, const int Magic, const TYPE_INDEXES &TypeIndexes ) { double Res = 0; if (Type <= OP_SELL) { for (int i = TypeIndexes.Amount[Type] - 1; i >= 0; i--) if (PositionGetTicket(TypeIndexes.Index[Type][i]) && PositionGetInteger(POSITION_MAGIC) == Magic) Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) + PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL); } else for (int i = TypeIndexes.Amount[Type] - 1; i >= 0; i--) if (OrderGetTicket(TypeIndexes.Index[Type][i]) && OrderGetInteger(ORDER_MAGIC) == Magic) Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) + OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL); return(Res); } // Число для контроля корректности альтернативных реализаций. double OnTesterValue = 0; double OnTester() { return(OnTesterValue); } void OnTick() { TYPE_INDEXES TypeIndexes; // Индексы позиций/ордеров по типам. TypeIndexes.Fill(); // Заполнение индексов. // Симулируем работу по всем ТС. for (int i = 0; i < inAmountMagics; i++) OnTesterValue += CountOrders(POSITION_TYPE_BUY, i, TypeIndexes) + CountOrders(POSITION_TYPE_SELL, i, TypeIndexes) + CountOrders(ORDER_TYPE_BUY_LIMIT, i, TypeIndexes) + CountOrders(ORDER_TYPE_SELL_LIMIT, i, TypeIndexes); } 按类型分割头寸/订单是有意义的。 三金德道 2023.04.14 16:35 #2305 请问MQL4的EA怎么转成MQL5的 fxsaber 2023.05.08 09:34 #2306 如果你需要一个虚数零来表示任何二倍。 void OnStart() { double d = 1; Print(d + d * 1 e-17 == d); // true Print(d * 1 e-17); } Slava 2023.05.08 11:09 #2307 fxsaber #: 如果您需要为任何二进制数设置虚零,请使用 DBL_EPSILON。 DBL_EPSILON 条件 1.0+DBL_EPSILON != 1.0 成立的最小数字。 2.2204460492503131e-016 fxsaber 2023.05.08 11:20 #2308 Slava #: DBL_EPSILON 满足条件 1.0+DBL_EPSILON != 1.0 的最小数字。 2.2204460492503131e-016 谢谢 amrali 2023.05.09 00:50 #2309 DBL_EPSILON 满足条件 1.0+DBL_EPSILON != 1.0 的最小数字 2.2204460492503131e-016 请原谅我用英语发表评论,我不会说俄语。 这意味着 d * (1 + DBL_EPSILON) != d d * (1 + 0.5 * DBL_EPSILON) == d因为 DBL_EPSILON 是相对误差率。relative 表示相对于数字的大小。 在 1.0 时,误差率 = 1 * 2.2204460492503131e-016 (DBL_EPSILON) 当误差为 d 时,误差率 = d * DBL_EPSILON 。 计算机无法区分 d 和 d * (1 + 0.5*DBL_EPSILON),因此将两者编码为相同的二进制。因此,精确(二进制)比较的结果为 true == fxsaber 2023.05.09 01:33 #2310 Slava #: DBL_EPSILON 满足条件 1.0+DBL_EPSILON != 1.0 的最小数字。 2.2204460492503131e-016 这个解释很糟糕,因为 void OnStart() { double d = 1 e5; Print(d + d * 0.1 == d * (1 + 0.1)); // false } 1...224225226227228229230231232233234235236237238...247 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对不起,我是初学者......那么,我应该重点开发哪一种代码?4还是5?也许我不太明白--我是否应该只选择交易功能较强的 5?
选择权在你,但如果有人告诉我,旧版本已不再开发,所有最新开发都在新版本上,我想我的选择会很明显(除非有其他情况影响)。
编辑:不过,鉴于您的个人资料显示您在美国,这可能还取决于您打算使用哪些经纪商以及他们提供哪些平台。交易、自动交易系统和交易策略测试论坛
mql5 语言的特殊性、微妙之处和工作技巧
fxsaber, 2023.01.07 23:01
有两种类型的经纪人,在美国/欧洲翻译时间。因此,滚动时间会发生变化。
经纪商类型可以自动确定。
在某些经纪商上运行的结果。
RannForex-Server - Europe MetaQuotes-Demo - Europe FXOpen-MT5 - USA Alpari-MT5 - Europe Tickmill-Live - USA ICMarketsSC-MT5-2 - USA Darwinex-Live - USA
目前,脚本产生的结果大相径庭。在完全了解 MT5-calendar 的特殊性之前,我不建议使用它。
MQL5 中一个非常简单的技术可以免费加快回溯测试的速度 - 按类型记忆头寸/订单索引。
加快之前发布的快速代码 的一个例子。
按类型分割头寸/订单是有意义的。
如果您需要为任何二进制数设置虚零,请使用 DBL_EPSILON。
DBL_EPSILON
条件 1.0+DBL_EPSILON != 1.0 成立的最小数字。
2.2204460492503131e-016
DBL_EPSILON
满足条件 1.0+DBL_EPSILON != 1.0 的最小数字。
2.2204460492503131e-016
谢谢
DBL_EPSILON
满足条件 1.0+DBL_EPSILON != 1.0 的最小数字
2.2204460492503131e-016
请原谅我用英语发表评论,我不会说俄语。
这意味着
因为 DBL_EPSILON 是相对误差率。relative 表示相对于数字的大小。
在 1.0 时,误差率 = 1 * 2.2204460492503131e-016 (DBL_EPSILON)
当误差为 d 时,误差率 = d * DBL_EPSILON 。
计算机无法区分 d 和 d * (1 + 0.5*DBL_EPSILON),因此将两者编码为相同的二进制。因此,精确(二进制)比较的结果为 true ==
DBL_EPSILON
满足条件 1.0+DBL_EPSILON != 1.0 的最小数字。
2.2204460492503131e-016
这个解释很糟糕,因为