错误、漏洞、问题 - 页 4

 
Interesting:

MarketInfo(Symbol(),MODE_MARGININIT) = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)

那么MODE_MARGINREQUIRED对应的是什么?否则,我怎么知道我需要多少闲钱 才能开1手买?

在mql5创建者的Moving Average.mq5专家顾问中,手数是这样计算的

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

为什么MaximumRisk这么小(0.02%),在计算手数时被1000除以?这个1000代表什么?也许1000=购买1手所需的可用资金乘以100%(将0.02%转换为0.0002的分数)?也就是说,购买1手的可用资金是10美元(10美元x100%=1000)。我认为方向正确吗?

还有一个问题。对未结订单的最大数量是否有限制?

 
gpwr:

那么MODE_MARGINREQUIRED对应的是什么?或者,否则我怎么知道开1手买入所需的可用资金数额?

还有一个问题。对未结订单的最大数量是否有限制?


我问自己这个问题。


以下是开发者的回答。

拉希德-乌马罗夫


符号_交易_合约大小

交易合同规模

и

符号_货币_边际

计算保证金的货币

绳子


根据我的理解,你将不得不自己计算一下

 

gpwr:

在mql5创建者的Moving Average.mq5专家顾问中,手数是这样计算的

为什么MaximumRisk这么小(0.02%),在计算手数时被1000除以?这个1000代表什么?也许1000=购买1手所需的可用资金乘以100%(将0.02%转换为0.0002的分数)?也就是说,购买1手的可用资金是10美元(10美元x100%=1000)。我认为方向正确吗?

还有一个问题。对未结订单的最大数量是否有限制?


AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk

如果我理解正确的话,这一行计算的风险是自由资金数额 的2%。为什么他们要把这个数额除以1000?


但如果我理解正确的话,那么在存款(自由资金)为20,000美元的情况下,专家顾问建议开设不超过该金额的2%(400美元)。

将这一数额除以1,000,我们将合乎逻辑地得到0.4手。

 

gpwr:

对未结订单的最大数量是否有限制?

我也在想这个问题。有一个建议,开发人员仍在思考(对他们来说,顺便说一下--申请15802)。
 
Interesting:

如果我理解正确的话,这一行计算的风险是可用资金量的2%。为什么这个数额要除以1,000,由开发商决定。

但如果我理解正确的话,那么在存款(自由资金)为20,000美元的情况下,专家顾问建议开设不超过该金额的2%(400美元)。

将这一数额除以1,000,我们将合乎逻辑地得到0.4手。

现在我明白了。Moving Average.mq5中有一个错误。而不是

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

它应该是

input double MaximumRisk        = 0.02;    // Maximum Risk as a fraction  of a free margin

那么在计算手数时除以1000就很清楚了:100,000美元(手数)/100(杠杆)=1000。然而,mql5的开发者一定不会展示这样一个专家顾问的例子。它应该被改变

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(FreeMargin*MaximumRisk/LotRqdMgn,2);

或者更好的是

double Step       =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(MathFloor(FreeMargin*MaximumRisk/LotRqdMgn/Step)*Step,2);

不过很遗憾,MODE_MARGINREQUIRED已经丢失了。也许开发者会恢复这个参数,以减少计算的次数。

 
Interesting:
stringo
简称一直以来只用于在指标子窗口中显示。
所以它没有显示在那里,要么是一个错误,要么是我不明白什么......
找到了错误并修复了它,16051可以关闭。
 

我不知道我是否把我的错误报告放在了正确的地方。如果没有,请纠正我。

在测试我的EA时,我特意创造了这样一种情况,看看测试者是否正确地确定了保证金。因此,100美元的存款。我们交易欧元兑美元。最小地段面积为0.1。以下是专家顾问中用于计算手数的代码

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);

测试员产生了这些错误

2010.06.08 22:28:57 核心 1 没有足够的钱 [在1.19242处即时买入0.10欧元兑美元] 。
2010.06.08 22:28:57 核心 1 前期余额: 100.00, 前期权益: 100.00, 前期保证金: 0.00, 新保证金: 119.24, 新自由保证金: -19.24
2010.06.08 22:28:57 核心 1 1000 100
2010.06.08 22:28:57 核心 1 没有足够的钱 [在1.19180即时买入0.10 EURUSD]
2010.06.08 22:28:57 核心 1 前期余额: 100.00, 前期权益: 100.00, 前期保证金: 0.00, 新保证金: 119.18, 新自由保证金: -19.18
2010.06.08 22:28:57 核心 1 1000 100
2010.06.08 22:28:57 核心 1 没有足够的钱 [在1.19362处即时买入0.10 EURUSD]
2010.06.08 22:28:57 核心 1 前期余额: 100.00, 前期权益: 100.00, 前期保证金: 0.00, 新保证金: 119.36, 新自由保证金: -19.36
2010.06.08 22:28:57 核心 1 1000 100

根据这些信息判断,买入1手的自由保证金LotRqdMgn等于1000,这似乎是正确的。FreeMargin=100。0.1手乘以1000,得到100。这意味着我们有足够的资金来打开第一块地。但测试人员报告说,我们没有足够的资金。错误在哪里?

 
gpwr:

根据这些信息,买入1手的自由保证金,LotRqdMgn,需要1000,这似乎是正确的。FreeMargin=100。0.1手乘以1000,得到100。这意味着我们有足够的资金来打开第一块地。但测试人员报告说,我们没有足够的资金。错误在哪里?

错误在于你在计算中忘记了保证金货币。 余额=100美元,保证金要求=100欧元(119美元)。

这就是为什么你不能进行交易--一切都很正确。

 
Renat:

错误在于你在计算中忘记了保证金货币。 余额=100美元,保证金要求=100欧元(119美元)。

这就是为什么不可能进行交易 - 一切都是正确的。

谢谢你,雷纳特。我已经明白了我的错误。改变了LotRqdMgn的计算公式,现在一切工作正常了。

 

图书馆学的一个新词,或旁边的惊人...


因此,我创建了一个使用该库的专家顾问,检查后一切正常。我做了一个存档,里面有专家顾问、这个库和一些MQL5和MQH文件。我把档案交给了应用者/开发者进行测试。


那是可以的,但我决定在另一个终端上进行测试。所以我解开了档案,决定将专家顾问附在图表上。


而在终端日记中,写着这两行字。

2010.06.10 09:54:51 PM 专家 MechanicalTrading-Infinity-2010 (EURUSD,Daily)
2010.06.10 09:54:51 专家加载MechanicalTrading-Infinity-2010(EURUSD,Daily)失败。


我开始搜索它是如何工作的(或者说,不工作),发现了一个惊人的事实--终端看到目录中的编译库(作为*.ex5),但持续地 "汇入 "它,这不是很好,如你所理解的...

在尝试了许多可能导致这种行为的原因后,我决定将原始文件(以*.mq5的形式)放在库的文件夹中。我试着在图表上添加一个EA--哦,我的上帝,一切都在运作。


在游戏的过程中,出现了一些问题。

1.如果库只表示为.ex5,为什么专家顾问不能工作?

2.为什么终端会顽固地从目录中删除这个文件?

3.为什么终端日志中没有关于上述所有内容的明确评论?

4.为什么文档中没有说这种行为是可能的?


最后是第五个问题,也是最后一个问题--我如何应对这一切,我做错了什么(可能是终端缺少一个EX5文件,正在寻找什么,例如头文件或库本身)?


PS

顺便说一下,我在使用Expert Advisors时也遇到了同样的问题,顽固地删除了*.ex5文件......。:(