错误、漏洞、问题 - 页 9

 
DC2008:

double类型的 变量使用==条件是不正确的。建议像这样进行比较。


我可以补充一点,虽然有一些延迟,但我们还是写了一篇关于这个主题的文章--在MQL4中处理双倍类型的数字的特点。当涉及到实数(MQL5中的double和float)的操作时,那里提到的一切仍然适用于任何编程语言。
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

double类型的 变量使用==条件是不正确的。建议像这样进行比较。


相当合理,最重要的是一种明智的做法。但在我看来,至少第一行应该是这样的。

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

以下信息将定期出现在日志中

2010.06.15 14:48:09 MemoryException 4915200字节不可用

我不知道该怎么做?

 
Prival:

我时常在日志中看到这些信息

2010.06.15 14:48:09 MemoryException 4915200字节不可用

我不知道该怎么做?

没有足够的内存。检查动态数组的 大小,很可能是试图分配超过可用的内存。
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

double类型的 变量使用==条件是不正确的。建议像这样进行比较。


这不是问题的重点,如果我理解正确,你应该总是把返回操作符放在用户函数的末尾
 
joo:
没有足够的操作记忆。检查动态数组的 大小,很可能是试图分配超过可用的内存。
不,不是这样的,可能是服务器的问题。 可能有一些工作在进行中。 数据中出现了一个洞。 与服务器的连接经常丢失。历史记录没有被下载。这可能导致了错误。
 
sergey1294:
这不是问题的重点。 如果我理解正确的话,操作者的返回必须总是放在用户函数的末尾

我认为关于==的回答是本质上的。 在一个双倍类型的 函数中,确实应该在某个地方有一个return(...)。不一定在最后。如果你的LotStep类型为0.1000000000000000001,在if()return();中使用==运算符可能导致错误的输出。在这种情况下,没有一个返回值会起作用,函数没有任何返回值。虽然在你的情况下,返回可能不喜欢里面的NormalizeDouble。在你的工作版本中,将结尾修正为return(NormilizeDouble(lot,2)),看看是否有效。我自己也对它感到好奇。

 
gpwr:

我认为关于==的回答是本质上的。 在一个双倍类型的 函数中,确实应该在某个地方有一个return(...)。不一定在最后。如果你的LotStep类型为0.1000000000000000001,在if()return();中使用==运算符可能导致错误的输出。在这种情况下,没有一个返回值会起作用,函数没有任何返回值。尽管在你的情况下,返回可能不喜欢里面的NormalizeDouble。在你的工作版本中,将结尾修正为return(NormilizeDouble(lot,2)),看看是否有效。我自己也对它感到好奇。

最后必须有return(...),但它可能永远不会到达那里(如果其中一个If条件成功的话)...
 
Interesting:
最后必须有return(...),但它可能不会出现(如果其中一个If条件有效)...
这就是我感兴趣的地方,在4,没有必要把它放在最后。
 

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