新手的冒险 - 页 10

 
niko:
你的愿望就是我的命令(我本来想说'高飞',但后来在网上查了字典,显然这是一个不礼貌的评论,算了吧)

好吧,我只看了一眼,因为你现在对我来说有点太随意了。

你没有根据我的代码的最新版本进行修改。

因此,我不知道在你开始在以前的版本上添加进一步的东西之前,我的代码的最新版本是否做到了你所需要的。

但我确实注意到,在start()函数 的开头,你的大括号不见了。我以为我们已经讨论过这个问题了。

你需要进行一些控制。如果你要改变一些东西--确保将你的改变添加到最新版本中。并让我们知道你的改动是什么,以及你为什么要这样做。


CB。

 
niko wrote>>

蒂姆。

我把代码编译到了没有错误报告的程度(只是修复了你强调的几个错误),尽管在策略测试器中它还没有进行任何交易。但我对一些事情感到疑惑: ...

你好,尼克。

看了你的评论和你对代码所做的一些修改,我怀疑你的 "疑惑 "可能是由于变量和函数参数之间的混淆。它们的外观和行为相当相似,但事实上它们是完全不同的野兽。


也许下面的注释代码例子会使事情更清楚一些。


我冒昧地把开发代码整理了一下,并把一些函数参数的名字改了一下,试图把它们与其他变量区分开来。我还把所有多余的注释、评论等移到文件末尾的 "附录 "中,供你随意使用。

这段代码看起来不错。还有一些小问题要做,我已经在文件中标记为TODO,但现在摆在你面前的主要任务是调试和测试。


测试是开发周期中一个非常重要的部分。对于交易系统来说,如果没有正确的测试,可能会导致一些细微的问题,从而对你的交易策略和最终你的账户造成破坏。测试的主要任务是确保代码正在做你所期望的事情。有效地,你必须写下或对自己说,"在这种情况下,我期望有这种结果"。然后你设计并执行你的测试,看看这是否真的发生了。如果不是,你就必须纠正这个问题。你对所有你能想到的可能的情况,也许还有一些不可能发生的情况,重复这个过程。当然,你也在寻找运行时错误或错误,这些错误可能会或可能不会显示在MetaTrader系统错误信息中。


对于MT4,您的主要测试工具是策略测试器和日志文件(在日志标签下),以及结果、图表和报告功能。


对于日志文件,我经常发现在微软记事本中打开整个文件,而不是试图通过日志查看器查看其中的一部分。在每次运行之前,不要忘记清除日志文件/日志,否则你会看到很多旧的,也许不再相关的信息。在策略测试器的每次测试运行后,你要检查日志文件中的调试语句信息和metatrader系统信息。你可以使用你的MetaTrader onine文档来查看错误代码,以获得更多信息。也可以使用 "结果"、"图表 "和 "报告 "功能来查看程序在任何特定条件下的表现。


提示 - 当你做最初的测试运行时,保持测试时间短,以尽量减少日志文件中的数据量。


我们已经在代码中建立了一些调试设施,但你可能需要对这些设施进行扩展。根据需要禁用个别调试语句,以保持日志文件中信息的浓缩和相关。在代码中,有一个例子说明如何在不删除或注释调试语句的情况下做到这一点,这可能相当耗费时间。我把我的主要调试语句无限期地留在程序文件中,一旦我完成测试,就用程序中的DEBUG_ON标志把它们全部关闭。


我相信,有效地管理日志文件和调试语句是在MetaTrader环境中进行良好和有效测试和调试的关键。我在这个论坛上看到有人抱怨MetaTrader中缺乏调试设施。数以百万计的商业代码已经成功地进行了调试和测试,使用的设施并不比你在MetaTrader中发现的更复杂。这些设施可能是基本的,但它们工作得很好,只要你知道如何正确使用它们。


另一点值得一提的是,试图调试混乱或组织不良的代码可能非常耗时和令人沮丧。正是从这一点开始,你将真正开始收获你的结构良好和注释良好的代码。如果其他人需要在你的代码上工作,他们会非常感谢你在这方面的努力。


尼克,这个旅程还有一段路要走。对我来说,测试、调试和优化--"让所有的东西都能工作 "是工作中最有趣的部分,也往往是最具挑战性的。我会把代码传回给你,让你开始测试,并等待你把问题和/或你遇到的问题反馈给我。


注意事项

蒂姆



一个简单的代码例子,试图证明全局变量和函数参数之间的区别

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

附加的文件:
 
嘿,CB,这很奇怪,因为我总是把mq4文件保存为新的,有最新日期的,以便把其他文件分开。我想把括号包括在内,但我想你要求我删除(这是最后一个,但如果没有最后一个,start()就会不平衡。)
 
niko:
嘿,CB,这很奇怪,因为我总是把mq4文件保存为新的,有最新日期的,以便与其他文件分开。混淆一定是漏掉了。我想包括的括号,但我认为在某些时候你要求我把它删除(这是最后一个,但没有最后一个,start()会不平衡。所以这就是为什么我把第一个也删除了,但我把它放回去)。

我们不要开始随意地增加和删除 大括号。我以前曾指出,你有一套完全多余的东西,这两套东西都可以删除。

这里是最新的版本。请做以下工作。

- 先编译它,并修正任何错误--这样你就会知道随后的任何错误都是由于你可能做出的修改造成的

- 让我知道你是否有任何需要修正的错误

- 试一试,看看它是否能满足你的需要

- 让我知道进展如何--让我知道你认为需要做什么修改。


CB

附加的文件:
 
谢谢你,CB。我会去做的,如果我让你有点沮丧,很抱歉。
 

谢谢你,蒂姆。

我真的很感谢你为我解释这些事情,这让我很受鼓舞。我似乎在 "闪烁 "着得到它,然后又完全没有得到它(关于函数和调用),尽管我肯定已经读了20遍关于函数的文档。我将花更多的时间在这上面。关于 "测试和调试",我以前在一个不同的软件包中做过这个工作(检查每一笔交易,确保所有的东西都合拍),因为我认为这是必不可少的,即使是手动交易(策略测试)。我将继续使用你的代码,并让你知道。

 
niko:
谢谢你,CB。我会去做的,如果我让你有点沮丧,对不起。

不用担心,伙计。我只是想一步步来。


CB

 

嘿,CB。


我修复了代码中的一些错误,主要是缺少小括号,在代码中已突出显示。不再有语法错误了。

我在策略测试器上 运行代码,但它只做买入交易。根本没有空头交易。我查看了日志,它产生了错误130(与止损有关),所以这对我们的问题没有任何启示。

我试着找出错误所在(我认为是在fnSHouldWeTrade或fnOrderDuplicate中)。

附上最新版本的代码,我给TopFilter和BotFilter增加了数值,使策略能够进行交易。

ps:我知道为什么我之前给你粘贴的是旧的代码了,我把mt4重新安装到不同的文件夹里(没有连接错误),代码是旧文件夹里的旧的重复代码。

附加的文件:
 
niko:

嘿,CB。


我修复了代码中的一些错误,主要是缺少小括号,它在代码中被强调了。不再有语法错误。

我在策略测试器上运行代码,但它只做买入交易。根本没有空头交易。我查看了日志,它产生了错误130(与止损有关),所以这对我们的问题没有任何启示。

我试着找出错误所在(我认为是在fnSHouldWeTrade或fnOrderDuplicate中)。

附上最新版本的代码,我在TopFilter和BotFilter中添加了数值,使策略能够进行交易。

ps:我想明白了为什么我之前为你粘贴了旧的代码,我重新安装了mt4到不同的文件夹(没有连接错误),代码是旧文件夹中的旧的重复代码。


改变。

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,Red)。

到。

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Red)。


CB

 
谢谢CB,我应该注意到这一点,所以最后的错误是正确的(130)。