关于编码风格 - 页 2

 

在这里,你必须从两件事中选择一件。

1)代码的易写性和易读性。

2)程序执行的 速度。

就我个人而言,我一直倾向于第二种选择,所以我尽量全局地声明所有的变量,如果可能的话,不使用函数(我很早就注意到它对计算速度的影响)。你必须认识到,专家顾问将在你的电脑上一天24小时运行,有时它需要优化等等。因此,计算的速度和资源的低消耗是非常重要的。

而现在,让我们从外部看一下不同的编程语言。例如,Basic易于编码,易于阅读,但计算速度...现在让我们把C++和它进行比较。在这里,两极已经发生了变化--编码更难了(代码的可读性变差了),但计算速度却大大提升了。而如果你采取Assembler,代码几乎是不可读的。

另一件事是,当用同一语言编写的程序也属于这些标准时,你必须在代码的可读性或执行速度之间做出选择,这很奇怪(虽然没有什么奇怪的,声明一个变量--耗时;调用一个函数并向其传递参数--耗时)。但这是一个事实,顺便说一下,这不仅在mql4中被注意到...

 

我更喜欢前者--也许是因为在MQL4中,我还没有遇到过我的计算量大到必须在可读性和速度之间做出选择的情况。我不是在玩蜱虫,所以我不需要任何疯狂的计算速度。

另一方面,我很难想象一个我以后不用修改的EA。

 
Mathemat >> :

我不玩蜱虫。

在这里,一些特征开始出现。我绝对同意--如果你按开盘价玩,那么程序架构必须改变。例如,当以开盘价进行游戏时,在全局层面上声明变量并将其保存在内存中直到下一个条形图出现,是没有意义的。

一个程序的编码风格必须适合其预期用途。尽管编码规则在任何地方都是一样的(函数、变量等),但在程序代码中使用这些规则的频率和风格取决于具体的最终任务--程序将被用于什么计算。每个使用编码规则的案例都需要不同的方法。

 

强烈推荐:http://astyle.sourceforge.net/ 是一个C-文本格式化器,但在MQ4上做得很好。

只有一个命令:AStyle.exe -b -t -p before.mq4 将 "打包 "的文本变成糖果。


 

很久以前,论坛的主人在这里提供了一个类似的工具,在这里或在metaquotes上。但现在你不必再去找了,谢谢谢尔盖。而设计风格也是我自己喜欢的。

 

我曾一度想知道 "选择哪种编程风格"。由于我没有什么经验,我只是通过打开FreeBSD的源代码,仔细观察老派程序员使用的风格来解决问题。当时,有些事情对我来说似乎很不方便,但现在我明白他们为什么选择这样的解决方案。

因此,这里是我写作的规则。

int main()

{

int sum;

for(int i=0;i<100;i++){

sum+=i;

Print("Число равно:", i);

}

return(0);

}

1.在函数中,我总是给大括号单独起行。在循环/条件中,我把第一个大括号放在第一行。

2.我讨厌这样放大括号的非常普遍的风格。

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

//----

return(0);
}
//+------------------------------------------------------------------+

评论 //---- - 我完全不明白。

3.我试着在循环本身中声明一个用于迭代的变量

4.我喜欢使用函数,我试图把一个程序分成许多部分。但并没有每个函数20行的硬性约束。我认为,一个函数必须执行一个局部任务。任务有时大,有时不大,所以功能也不同。

5.我在一个函数中使用函数。

res=OrderSend(Symbol(),OP_BUY,GetVolume(GetPrice(OP_BUY),GetStopLossLevel(GetPrice(OP_BUY))),GetPrice(OP_BUY),3,GetStopLossLevel(GetPrice(OP_BUY)),GetTakeProfitLevel(GetPrice(OP_BUY)),"",GetMagicNumber(OP_BUY),0,Blue);


6.我使用timing()函数。

void Timing()
{
//Здесь вызываем функции которые необходимо вызывать каждый тик
//...
//Здесь вызываем функции которые необходимо вызывать каждую минуту
if(IsNewMinute()==true){
}
//Здесь вызываем вункции которые достаточно вызывать каждый новый бар
if(IsNewBar()==true){
CheckForClosed();
CheckForOpen();
}
//Здесь вызываем функции которые необходимо вызывать каждый новый день, например функцию для расчета свопов
if(IsNewDay()==true){
}
}

正如你所看到的,即使使用tickwise建模方法,整个计算块也不是每一个tick都 被设置,而是在真正需要的时候才被调用。

7.我不知道为什么,但几乎总是使用for()循环而不是while()。

8.我讨厌使用嵌套条件。

if(param1==1){

if(param2==2){

if(param3==3){

if(param4==4){

if(param5==5){

Print("Наконец-то дошли!");

}

}

}

}

}

我使用这样的代码来代替。

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

我发现这种方式更方便。
 

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

基本上,它是正常的代码,执行与嵌套if结构相同的计算。但我在某个地方听说,函数中的返回应该是一个。也许,这样做是为了不与他们混在一起。我没有严格遵守这一规则。

至于其他方面,我的方法与你的非常接近,C-4,除了几个细节。

 
C-4 >> :

2.我讨厌这样放支架的非常普遍的风格。

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

//----
return(0);
}
//+------------------------------------------------------------------+

评论//---- - 我完全不明白。

另一方面,我更喜欢这种风格:你不需要在行尾寻找大括号。许多人正是因为这个原因(忘记放收尾括号)而丢了括号,或者相反,他们做了额外的收尾括号。但总的来说,这是一个品味问题--每个人在纸上的笔迹都不同。而且每个人写笔记的方式不同(有人做脚注,有人划线,有人缩进)--主要是笔记本的作者容易一目了然的感知信息。 语言语法允许你把大括号放在任何地方--甚至在一行中。但由于某些原因,没有人像这样把大括号关闭。

if( param1==1){

   if( param2==2){

      if( param3==3){

         if( param4==4){

            if( param5==5){

               Print("Наконец-то дошли!");}}}}}
这就是为什么我不为单独的一行代码节省空间--所有的括号(包括开括号和闭括号)都在彼此的左侧(为每一个后续的封闭块缩进,人字形风格),一眼就能估计出一个复合运算符(块)的开始和结束,无论它是多么聪明和复杂的程序部分。:)

--------

毕竟,括号只是用来指定复合运算符(block),而不是用来指定循环的主体。在运算符不是复合的情况下,我不使用括号。
//--Например, так:

if( param5==5) Print("Наконец-то дошли!");


//--Или так:

if( param5==5)
  Print("Наконец-то дошли!");

            

而如果你选择了一个复合运算符,在右边某处有一个开括号,但在左边放了闭括号,那么

//---Вот так многие поступают выделяя блок:

if( param5==5){
   Print("Наконец-то дошли!");
}


//--Т.е. блок выделяют вот так:

             {
   Print("Наконец-то дошли!");
}

---------------

如何编码,在哪里放括号,等等。- 是每个人的口味问题。最主要的是,程序应该是可读的,没有错误的,不加载系统(算法必须是最优的),并符合编写的标准。

 
Mathemat >> :

很久以前,论坛的主人就在这里提供了类似的工具--在这里或在metaquotes上。但现在你不必再去寻找它了。而设计的风格也是如此,因为我更喜欢。

是的,有一个。:)


对于代码清理,我使用MetaQuotes Styler的两个文件,你可以从这个 链接下载,并放在/Windows/System32目录下。

你可以通过命令来运行造型器。

mqstyler.exe /file:文件名.mq4
mqstyler.exe /file: "带空格的长文件名.mq4" (如果名字中有空格)

 

我个人采取Visual Studio(VC++),将MQL代码复制到那里,并按照微软的惯例进行格式化,不使用工具。作为一个代码编辑器,VS也是比较酷的(代码折叠?)也许可以把编译命令拧在一起,但我还没有试过。