错误、漏洞、问题 - 页 9 12345678910111213141516...3184 新评论 Rashid Umarov 2010.06.15 07:38 #81 DC2008:对double类型的 变量使用==条件是不正确的。建议像这样进行比较。 我可以补充一点,虽然有一些延迟,但我们还是写了一篇关于这个主题的文章--在MQL4中处理双倍类型的数字的特点。当涉及到实数(MQL5中的double和float)的操作时,那里提到的一切仍然适用于任何编程语言。 Особенности работы с числами типа double в MQL4 - Статьи по MQL4 www.mql5.com Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации [删除] 2010.06.15 07:50 #82 DC2008:对double类型的 变量使用==条件是不正确的。建议像这样进行比较。相当合理,最重要的是一种明智的做法。但在我看来,至少第一行应该是这样的。if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2)); Prival 2010.06.15 12:51 #83 以下信息将定期出现在日志中2010.06.15 14:48:09 MemoryException 4915200字节不可用我不知道该怎么做? Andrey Dik 2010.06.15 13:42 #84 Prival:我时常在日志中看到这些信息2010.06.15 14:48:09 MemoryException 4915200字节不可用我不知道该怎么做? 没有足够的内存。检查动态数组的 大小,很可能是试图分配超过可用的内存。 Документация по MQL5: Основы языка / Типы данных / Объект динамического массива www.mql5.com Основы языка / Типы данных / Объект динамического массива - Документация по MQL5 Sergey Gritsay 2010.06.15 13:52 #85 DC2008:对double类型的 变量使用==条件是不正确的。建议像这样进行比较。 这不是问题的重点,如果我理解正确,你应该总是把返回操作符放在用户函数的末尾 Prival 2010.06.15 14:13 #86 joo: 没有足够的操作记忆。检查动态数组的 大小,很可能是试图分配超过可用的内存。 不,不是这样的,可能是服务器的问题。 可能有一些工作在进行中。 数据中出现了一个洞。 与服务器的连接经常丢失。历史记录没有被下载。这可能导致了错误。 Vladimir 2010.06.15 15:45 #87 sergey1294: 这不是问题的重点。 如果我理解正确的话,操作者的返回必须总是放在用户函数的末尾 我认为关于==的回答是本质上的。 在一个双倍类型的 函数中,确实应该在某个地方有一个return(...)。不一定在最后。如果你的LotStep类型为0.1000000000000000001,在if()return();中使用==运算符可能导致错误的输出。在这种情况下,没有一个返回值会起作用,函数没有任何返回值。虽然在你的情况下,返回可能不喜欢里面的NormalizeDouble。在你的工作版本中,将结尾修正为return(NormilizeDouble(lot,2)),看看是否有效。我自己也对它感到好奇。 [删除] 2010.06.15 15:59 #88 gpwr: 我认为关于==的回答是本质上的。 在一个双倍类型的 函数中,确实应该在某个地方有一个return(...)。不一定在最后。如果你的LotStep类型为0.1000000000000000001,在if()return();中使用==运算符可能导致错误的输出。在这种情况下,没有一个返回值会起作用,函数没有任何返回值。尽管在你的情况下,返回可能不喜欢里面的NormalizeDouble。在你的工作版本中,将结尾修正为return(NormilizeDouble(lot,2)),看看是否有效。我自己也对它感到好奇。 最后必须有return(...),但它可能永远不会到达那里(如果其中一个If条件成功的话)... Sergey Gritsay 2010.06.15 16:20 #89 Interesting: 最后必须有return(...),但它可能不会出现(如果其中一个If条件有效)... 这就是我感兴趣的地方,在4,没有必要把它放在最后。 Vladimir 2010.06.15 16:37 #90 double volMin =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);double LotSize =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);long Leverage =AccountInfoInteger(ACCOUNT_LEVERAGE);double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN); double LotRqdMgn =LotSize/Leverage;double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);if(vol<volMin) vol=volMin;if(vol*LotRqdMgn>FreeMargin) vol=0.0;Print(LotRqdMgn," ",FreeMargin);return(vol); 雷纳特。错误在于你在计算中忘记了保证金货币。 余额=100美元,保证金要求=100欧元(119美元)。 这就是为什么不能进行手术的原因 - 一切都是正确的。 我想回到我关于正确计算保证金 的问题。正如Renat在我的计算中注意到的,LotRqdMgn(买入1手所需的保证金)没有考虑到货币的价格。我记得曾见过这张表 识别器 描述 公式 符号_计算_模式_外汇 外汇模式 - 计算外汇的利润和保证金 保证金: 批量*合同大小/杠杆率 利润:(收盘价-开盘价)*合约大小*手数 符号_计算_模式_期货 期货模式 - 计算期货的保证金和利润 保证金:Lots *InitialMargin*Percentage/100 利润:(收盘价-开盘价)*TickPrice/TickSize*Lots symbol_calc_mode_cfd CFD模式--计算CFD的保证金和利润 保证金:Lots *ContractSize*MarketPrice*Percentage/100 利润:(收盘价-开盘价)*合约大小*手数 symbol_calc_mode_cfdindex CFD指数模式--按指数计算CFD的保证金和利润 保证金:(手数*合约大小*市场价格)*价格/手数大小 利润:(收盘价-开盘价)*合约大小*手数 symbol_calc_mode_cfdleverage CFD杠杆模式--计算CFD在杠杆交易中的保证金和利润 保证金:(手数*合约大小*市场价格*百分比)/杠杆率 利润:(收盘价-开盘价)*合约大小*手数 因此,事实证明,表中有一个错误:不是Lots*Contract_Size/Leverage,而 必须是Price*Lots*Contract_Size/Leverage。 如何以编程方式获得 "保证金的百分比"? 交易中最重要的图表 12345678910111213141516...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对double类型的 变量使用==条件是不正确的。建议像这样进行比较。
对double类型的 变量使用==条件是不正确的。建议像这样进行比较。
相当合理,最重要的是一种明智的做法。但在我看来,至少第一行应该是这样的。
以下信息将定期出现在日志中
2010.06.15 14:48:09 MemoryException 4915200字节不可用
我不知道该怎么做?
我时常在日志中看到这些信息
2010.06.15 14:48:09 MemoryException 4915200字节不可用
我不知道该怎么做?
对double类型的 变量使用==条件是不正确的。建议像这样进行比较。
没有足够的操作记忆。检查动态数组的 大小,很可能是试图分配超过可用的内存。
这不是问题的重点。 如果我理解正确的话,操作者的返回必须总是放在用户函数的末尾
我认为关于==的回答是本质上的。 在一个双倍类型的 函数中,确实应该在某个地方有一个return(...)。不一定在最后。如果你的LotStep类型为0.1000000000000000001,在if()return();中使用==运算符可能导致错误的输出。在这种情况下,没有一个返回值会起作用,函数没有任何返回值。虽然在你的情况下,返回可能不喜欢里面的NormalizeDouble。在你的工作版本中,将结尾修正为return(NormilizeDouble(lot,2)),看看是否有效。我自己也对它感到好奇。
我认为关于==的回答是本质上的。 在一个双倍类型的 函数中,确实应该在某个地方有一个return(...)。不一定在最后。如果你的LotStep类型为0.1000000000000000001,在if()return();中使用==运算符可能导致错误的输出。在这种情况下,没有一个返回值会起作用,函数没有任何返回值。尽管在你的情况下,返回可能不喜欢里面的NormalizeDouble。在你的工作版本中,将结尾修正为return(NormilizeDouble(lot,2)),看看是否有效。我自己也对它感到好奇。
最后必须有return(...),但它可能不会出现(如果其中一个If条件有效)...
。 雷纳特
错误在于你在计算中忘记了保证金货币。 余额=100美元,保证金要求=100欧元(119美元)。
这就是为什么不能进行手术的原因 - 一切都是正确的。
我想回到我关于正确计算保证金 的问题。正如Renat在我的计算中注意到的,LotRqdMgn(买入1手所需的保证金)没有考虑到货币的价格。我记得曾见过这张表
识别器
描述
公式
符号_计算_模式_外汇
外汇模式 - 计算外汇的利润和保证金
保证金: 批量*合同大小/杠杆率
利润:(收盘价-开盘价)*合约大小*手数
符号_计算_模式_期货
期货模式 - 计算期货的保证金和利润
保证金:Lots *InitialMargin*Percentage/100
利润:(收盘价-开盘价)*TickPrice/TickSize*Lots
symbol_calc_mode_cfd
CFD模式--计算CFD的保证金和利润
保证金:Lots *ContractSize*MarketPrice*Percentage/100
利润:(收盘价-开盘价)*合约大小*手数
symbol_calc_mode_cfdindex
CFD指数模式--按指数计算CFD的保证金和利润
保证金:(手数*合约大小*市场价格)*价格/手数大小
利润:(收盘价-开盘价)*合约大小*手数
symbol_calc_mode_cfdleverage
CFD杠杆模式--计算CFD在杠杆交易中的保证金和利润
保证金:(手数*合约大小*市场价格*百分比)/杠杆率
利润:(收盘价-开盘价)*合约大小*手数
因此,事实证明,表中有一个错误:不是Lots*Contract_Size/Leverage,而 必须是Price*Lots*Contract_Size/Leverage。