如何编码? - 页 306

 

你好。

我在使用这些函数 时没有任何进展,我检查了无数次都没有用,所以决定在我的代码的每个阶段写大量的Print()信息,看看它在崩溃之前能达到什么程度。实际上,它并没有达到GetLots函数的程度,而且在检查我的买入和卖出标准时失败了。奇怪的是,我并没有修改这部分代码,但有些东西是错误的--但至少我现在知道应该把重点放在哪里了

 

大家好。

我今天早些时候测试了我的代码,它运行得相对不错。在没有改变代码或回测 标准(如日期等)的情况下,我在一小时后做了回测,结果完全不同,没有任何结果。所以我想知道为什么会发生这种情况?比如说MT4的连接性?

 

...

如果你没有改变任何参数,请检查以下情况:当你运行回溯测试时,打开日志标签,检查是否有一些错误被写入其中。订单执行 中的错误可能是导致不稳定结果的原因之一。也要检查你的买入和卖出标准是否是 "稳固 "的:即--它们会在同一个点上进入。

crsnape@btinternet.com:
大家好,我今天早些时候测试了我的代码,它运行得比较好。在没有改变代码或回测标准(如日期等)的情况下,我在一小时后进行了回测,结果完全不同,没有任何结果。所以我想知道为什么会发生这种情况?比如说MT4的连接性?
 

我的日记中没有出现任何错误。第一条是这样的。

2012.07.22 15:35:37 H4周期EA EURUSD,H4:加载成功

紧接着是一大串这样的内容。

2012.07.22 15:47:07 TestGenerator:不匹配的数据错误(在2012.07.19 12:00超过了音量限制56304)

然后最后。

2012.07.22 15:47:07 H4周期EA输入。MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10。

但之后就没有了。

我的测试是在2012年1月4日-2012年7月21日进行的。

 

...

那么你的进入条件有问题(你的EA从未尝试过开单)

crsnape@btinternet.com:
我在日志中没有得到任何错误。第一条是这样的。

2012.07.22 15:35:37 H4周期EA EURUSD,H4:加载成功

后面是一大串这样的内容。

2012.07.22 15:47:07 TestGenerator: 不匹配的数据错误(在2012.07.19 12:00超过了成交量限制56304)。

然后最后。

2012.07.22 15:47:07 H4周期EA输入。MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10。

但之后就没有了。

我的测试是在2012年1月4日-2012年7月21日进行的。
 

是的,它很奇怪,因为之前它是在输入位置。我在代码中从头到尾写了一些print(),但没有任何东西被写入日志,甚至没有记录我代码的最开始部分。甚至连这个检查 是否已经在当前栏位上建立了前一个仓位的代码也没有。

如果((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false)。

GlobalVariableSet(barsGV,Bars)。

}

//--- 检查多头头寸(BUY)的可能性

如果(GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST")。

如果(...进入条件...)

 

...

如果您的EA在任何阶段试图打开一个订单,它就会被写在日志中(错误与否并不重要--如果有错误,错误就会在那里,如果它打开了一个订单,就会被写在那里)。

但是,既然什么都没写,这意味着你的EA从来没有进入到实际尝试开单的阶段,而这只有在你的EA必须满足的条件集从来没有进入到实际开单的阶段时才会发生。所以你必须澄清你的条件。从你知道的最简单的条件开始尝试执行,然后再增加条件。这样你就能确定阻止你开单的步骤了

crsnape@btinternet.com:
是的,这很奇怪,因为之前它是在输入头寸。我的代码中从头到尾都写了一些print(),但没有任何东西被写入日志,甚至没有记录我代码的最开始部分。甚至连这个检查是否已经在当前栏位上建立了前一个仓位的代码也没有。

如果((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false)。

GlobalVariableSet(barsGV,Bars)。

}

//--- 检查多头头寸(BUY)的可能性

如果(GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST")。

如果(...进入条件...
 

我在if命令后面又加了几个Print(),我认为它在这一点上失败了,特别是红线,因为我的日记在这一点上停止了打印。

//--- 全局变量

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//---- 确定是否已经在H4时间块上下了订单

如果((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet ( barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false)。

GlobalVariableSet(barsGV,Bars)。

}

Print("确定是否已经为当前的酒吧下了订单", HasOrderedGV)。

//----检查 多头头寸(BUY)的可能性

如果(GlobalVariableGet (HasOrderedGV) == false)

{

我在网上找到了这段代码,并在我的代码中使用了它。但现在只是想知道它是否能工作。全局变量barGV被声明为一个字符串,然而它在第一行将其引用为0。这样做对吗?

 

...

这段代码在第一次运行时工作正常

0被测试,原因如下:

double GlobalVariableGet([/TD] [TD]string name)

"返回现有全局变量的值,如果发生错误则返回0"

检索全局变量值时 的错误是指全局变量还没有被创建。但是,正如我所说,这段代码在第一次运行时是没有问题的。问题是这样的:想象一下,你运行一个测试,在测试结束时,barGV被设置为5000。现在你再次运行EA,条形图总是小于 barsGV值(仍然是5000)。它(代码)必须以不同的方式编写。使用像这样的东西

GlobalVariableSet(barsGV,0)。

在init()中,然后它在连续的测试中也应该工作正常。但是,当你启动EA时,它也会人为地 "假装 "在当前条上没有开仓订单,这可能是一个错误。使用函数来计算在当前条上打开的订单比使用全局变量来计算要好得多(出于多种原因)。

________________________________________________

PS:使用全局变量可以防止你使用多个EA实例(每个全局变量都可以从另一个代码中看到 - 任何代码。因此,如果名称不唯一,你就有可能出现EA同时读取和设置所有相同的全局变量的混乱情况)

crsnape@btinternet.com:
我在if命令后又加了几个Print(),我认为它在这一点上失败了,特别是红线,因为我的日志在这一点上停止打印。

//-- 全局变量

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//---- 确定是否已经在H4时间块上下了订单

如果((GlobalVariableGet (barsGV) == 0)|| (GlobalVariableGet ( barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false)。

GlobalVariableSet(barsGV,Bars)。

}

Print("确定是否已经为当前的酒吧下了订单", HasOrderedGV)。

//---- 检查多头头寸(BUY)的可能性

如果(GlobalVariableGet (HasOrderedGV) == false)

{

我在网上找到了这段代码,并在我的代码中使用了它。但现在我想知道它是否能工作。全局变量barGV被声明为一个字符串,然而在第一行中它将其引用为0。这样做对吗?
 

啊,我明白了。因为全局变量在内存中保存其值。因此,正如你所说的,当它完成回溯测试 并达到5000时,即使回溯测试重新运行,这也会被保存在内存中,所以它绝不会因为BarsGV不低于5000而返回错误?天啊,这太深奥了。

还有,如果它产生一个错误,它会将HasOrderedGV设置为假,这样它就可以继续执行其余的代码?

我对你的理解是否正确?

BTW- 这是否允许?

GlobalVariableSet(HasOrderedGV, false)。

因为在MQL4书中说。

datetime GlobalVariableSet([/TD] [TD]string name,double value)

我的实例中的第二个值是bool而不是double?