开放项目 - 内部测试器-优化器 - 页 2

 
然而,我事先不知道编译器的反应,它是否会让指标主体中的交易常量通过?<br / translate="no"> 很可能会。

当然应该,它们都只是整数,而不是一个单独的类型。

一个小提示。

当然,最好不要为测试器重写策略。 一旦写好,该策略应该在测试器中和没有测试器的情况下(在真实世界中)都能工作。

这可以在图书馆的帮助下完成。
1.所有与交易有关的功能,把它们的名字改一下(我的......--不是很好,也许更好....)。
2.创建2个库。第一个包含用于测试的代码(没有实际发送订单),第二个只是重复调用标准函数中的参数。切换工作/测试只是通过更换库来完成。

当然,我们可以把它全部放在一个库里,并引入一个全局参数来切换,但这可能是不必要的。

如果能在MT中再引入一个功能,那就更好了,我认为这将从根本上简化这种测试器的编写工作--设置当前最后一格的功能。

也就是说,假设我们在历史上有1000个条形图,我们在上面进行测试。
让我们定义200条为最后一条,并使用Close[200]而不是Close[0]。这个功能应该在所有的内置功能中工作。

然后,测试器将看起来像一个循环,在其中设置该值的条形图(测试中的最后一个条形图)和策略中的启动函数的调用

事实上,这并不那么简单。)
我需要更多的积分...
 
我不明白,请解释
2.我们创建了2个库。第一个库包含用于测试的代码(没有实际发送订单),第二个库只是重复了标准函数调用中的参数。在工作/测试之间的切换是通过简单地替换库来完成的

"用于测试的代码 "这句话是测试人员的代码还是EA的代码?说得更具体些。

这也是
也就是说,让我们在测试的历史上有1000个柱子。
我们将200条定义为最后一条,然后到处使用Close[0]而不是Close[200]。
而且这个小说应该在所有内联函数中都能发挥作用(影响)。


任何EA代码都很容易转换为指标代码。
我们取EA的start()块,添加一个结构for(testerconter=Bars;testerconter>=0;testerconter--)
{
结尾处用括号括起来
}
用[testerconter+reference]替换所有使用引用的地方。

下面是一个来自内置MACD_sample.mq4专家顾问的例子。
源代码。
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);


修改后的

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+1);


正如你所看到的,根本就没有问题。如果你愿意,你可以随时重新定义testerconter=0,如果
代码在专家顾问体内执行,而不是在专家顾问体内。

 
"用于测试的代码 "这句话是测试员代码还是EA代码?说得更具体些。

在第一个库中,函数
_OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid + Stop * Point, Bid - Take * Point);


模拟测试器中的订单执行,即把它添加到测试器的订单列表中,而不把订单发送到服务器。

在第二个库中,这个函数只是调用嵌入式函数

int _OrderSend( string symbol, int cmd, double volume, double price, int slippage, 
                double stoploss, double takeprofit, string comment=NULL, int magic=0, 
                datetime expiration=0, color arrow_color=CLR_NONE) 
{
   return (OrderSend(symbol, cmd, volume, price, slippage, stoploss, 
                        takeprofit, comment, magic, expiration, arrow_color) );
}


专家顾问的任何代码都可以很容易地在指标的代码中重新加工。
我们取EA的start()块,添加一个结构for(testerconter=Bars;testerconter>=0;testerconter--)
{
结尾处用括号括起来
}
用[testerconter+reference]替换所有使用引用的地方。

这就是我的意思。
在MT中调用设置变量testerconter的值的函数(默认为0),而不是替换它,这种替换([testerconter+reference])将在MT本身中完成,这样会更容易。
那么我们就不必在策略本身中进行这些替换。

for(testerconter=Bars;testerconter>=0;testerconter--)
{
   SetTestPoint(testerconter);
      далее текст эксперта без переделки,
      или лучше вызов его функции start (или _start)
}



请用以下内容代替预。在 "即,假设我们有1000条在...... "中的引用前。
否则,该页面就会再次消失。

 
我把它换成了引号,看起来你的文字要消失了, 你的例子中的字符串 做一个强制翻译
关于
int _OrderSend( string symbol,....)


我的结论是:看来我们说的是同一件事。
我必须尝试这样做。
现在只是重新定义标准交易函数,前缀为_。,这就更令人尊敬了 :)
 
到avm
以这种方式进行测试是可能的。而且这已经很不错了。但是,不幸的是,你不会得到普遍主义。<br / translate="no"> 我花了几周时间进行这样的测试。乍看之下,这似乎很简单。


我怀疑你的测试是 "用大量的血",也就是说,你没有重新定义交易功能。而每一个新的测试
每个新的测试都需要写一个新的测试者指标。但你只需要做一次--以后就没有问题了。
如果我错了--公布功能--不要吝啬。
 
还有一点。

似乎我们不能直接从专家顾问中调用 启动函数
因此,最好将专家顾问的代码写在一个库中,并在那里设置_init、_deinit和_start等函数。

在专家顾问中,我们将编写
#include ".....";
   ...............

int init()
{
   return(_init());
}

int deinit()
{
   return(_deinit());
}

int start()
{
   return(_start());
}


但有点不清楚,参数是什么。

 
顺便说一下,你可以在一个图表上结合几个EA/信号。
正如在欧米茄所做的那样。
#include "A1.....";
#include "A2.....";
   ...............

int init()
{
   _initA1();
   _initA2();
   return(0);
}

int deinit()
{
   _deinitA1();
   _deinitA2();
   return(0);
}

int start()
{
   _startA1();
   _startA2();
   return(0);
}


这不是非常漂亮,但它会发挥作用。
一般来说,一个自制的事件处理 系统就可以了:))

 
也许这更容易?你做了一个解析器脚本,它被应用于一个mq4-文件(有专家顾问代码)。
它处理这段代码--插入各种包括,工作数组的余额,股权,等等。
将变量Lots重命名为_Lots(和其他)。一般来说,它做的是粗略的工作。
我只需将输出的文件归档就可以了。:)
简单的输送方法。
 
to avm<br / translate="no">
以这种方式进行测试是可能的。而且这已经很不错了。但是,不幸的是,你不会得到普遍主义。我已经花了几个星期的时间进行这种测试。乍看之下,这似乎很简单。

我怀疑你的测试是 "用大量的血",也就是说,你没有重新定义交易功能。而每个新的测试都需要你写一个新的测试器指标。但你只需要做一次--就不会再有问题。如果我错了,我希望你能发布功能--不要吝啬。

完全正确。"大血"。没有换人。我早在MT3.x中就做过这样的测试器。MQL4与MQL2的区别就像天空与地球一样。然而,我还没有利用MQL4的优势。我有一个心理上的昏迷。我应该先思考,然后再工作。
该妇女被告知:"先思考,后发言"。那个女人回答说。"我怎么能考虑我还没有说过的话呢"。
 
关于解析器,我有点超前了,函数需要先写好。但我记得,开发人员说不会有多币种的测试者(组合测试者)。还是我混淆了什么? 如果我不糊涂--那就更应该写自己的。