English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
优秀程序员(第 01 部分):您必须停止做这 5 件事才能成为一名成功的 MQL5 程序员

优秀程序员(第 01 部分):您必须停止做这 5 件事才能成为一名成功的 MQL5 程序员

MetaTrader 5示例 | 13 九月 2021, 11:21
4 256 1
Omega J Msigwa
Omega J Msigwa

概述

"人的思想,一旦被一个新的念头所拉伸,就永远不会再恢复到原来的维度。"
— Oliver Wendell Holmes(奥利弗·温德尔·福尔摩斯)

为了我们能够成为更优秀的程序员,我们不仅需要 24/7 学习编程,而且我们还需要了解如何最佳实践,甚至根本不需要学习如何编码。 学习如何编码及其应用的最佳实践对于梦想在编程事业里有所建树的每个人都非常重要。 通过了解方法和原因,我们会意识到我们在做什么 — 这会提高我们的记忆能力,并帮助我们改进我们的代码。

以下途径提供了行之有效的方法,如果您潜心应用本文中所阅读的所有内容,它们几乎可以在一夜之间做到改变您的编程经验。


01: 杜绝盲目复制粘贴的习惯

"最高贵的快乐是理解的快乐。" 
— Leonardo Da Vinci(列奥纳多·达·芬奇)

这是萌新最大的习惯,甚至有时经验丰富的程序员也会这样做。 我记得当我在 2019 年初次开始编程时,我大部分时间都在论坛上寻找“能用的代码”。 每当我针对某个问题而进行搜索时,我都不太注重解释为何如此;我只寻找有人在评论区回复“谢谢你,它现在能用”,或任何其他人们认为有帮助的评论(尤其是在论坛中最先提出问题的人)… 一旦我发现那段代码能用,就不需要再告诉我其中做了什么!!!

而当我意识到我曾经声称标准库图表不能工作时,现在很尴尬

  


现在我知道在那段时间里为何有些东西不起作用 — 在于我,因为即便代码本身,都是我从不记得的地方复制来的。 我的观点如下:

确保您明白自己在做什么。 不要单纯为了完成工作和快速修复问题而盲目地从论坛复制并粘贴代码

大多数情况下,对于有这种习惯的人来说,很多经验丰富的开发人员在论坛上回答人们的方式难以追随,因为他们关于某个主题的回答只是提供指向 MQL5 文档的链接,更谈不上针对特定问题自动指向本网站内相关链接的功能了。 这背后的原因是,大多数问题都是由于不了解基本原理和基础知识引起的。

始终: 寻找理解而不是解决方案!

一旦您理解了基本原理,编程就会变得自然而然。

复制并粘贴习惯不仅会损害您的声誉,且比之简单修复,这会给您带来复更多的问题。

02: 摒弃绕过问题

在您打算修复代码中的问题之前,确保您寻求了解为什么会遇到这些问题。 了解这一点有助于您在论坛里更好的提问,而不是在您尚未完全明白您正在编程的内容,以及引发漏洞的原因时,被动等待他人贴出代码来替换您的代码。 例如,在上图中我的所作所为:首先,我将代码复制到某些地方,希望借此修改图表模板,但我并不完全明白和理解标准库图表 — 这就是为什么我最终说该函数库不能用。

一旦您偶然发现一个问题或错误,请确保您完全了解函数库及您所拥有的不能用的代码。 在 MQL5 上有几种方法可以做到这一点,其中两个主要方面是

  • MQL5 文档
  • 论坛

MQL5 文档:

幸运的是,我们手边拥有完整文档,无需通过搜索引擎在线查找。 专业程序员都知道这一点,但对于萌新来说,这里是快速访问它的位置和方法:打开 MetaEditor,然后转到 帮助 板块并单击下拉选项 MQl5 参考就可以了。

DocumentationAccess

MQL5 论坛:

这是学习的最佳场所,通过与其他开发人员分享您遇到的麻烦,聆听您自己在编程过程中没注意到的内容。 但不要犯和我一样的错误,不要单纯复制!

 “这是通往真正理解和掌握技艺的捷径。”

处于这个阶段的菜鸟我称之为菜鸟螺旋

菜鸟螺旋

03: 抛弃完美主义

"完成比追求完美强。"
— 硅谷流行的观点

我无法告诉您这在多大程度上阻止我分享素材。 我一直在寻求圣杯,从而令我可与本网站上的其他用户分享。 我花了一些时间才意识到,如果我有什么东西要分享,那么我就应分享它,而不是被我自己的想法所阻止。

哪一个更好?

在未来几年内制作一个指标、智能交易系统、函数库或代码片段,亦或在一年内制作数百个结果并不完美的东西?

对于开发人员同伴或客户,您只需编写足够好的代码即可,而不是为自己编写完美的代码。 您将始终有时间和机会改进需要改进的代码;在其它情况下,您可以通过更快地提交代码来节省时间。

您能看到,这一条几乎适用于程序员每天能想到的所有事情:

  • 我们的移动应用程序得到更新 
  • 我们的电脑和手机操作系统以及软件得到更新
  • 甚至 MQL5、Python 等编程语言也日复一日地得到改进 

看,甚至我们的编程语言和框架也在更新,那么您可能知道,随时间推移不断改进并不是一件坏事。

在 MQL5.com 上,这几乎适用于所有地方 — 您能想到的市场中的程序更新。

版本更新

在论坛上,您可以更改论坛帖子、删除或仅更新您的回复,甚至是您的自己的评论,这太疯狂了!! ,哈哈

04: 避免编写炫耀智商代码

"调试的难度是初次编写代码的两倍。 因此,如果您编写代码时竭力炫耀智商,那么您对于调试肯定不够明智。" 
— Brian Kernighan(布赖恩·克尼汉)

编程的最佳实践是遵循自文档学到的内容,这些兄弟就已很明智了!! 

编写良好、干净和简单的代码,以便易于阅读和理解。 三个月后,包括您在内的任何人都不会从炫耀智商的代码中受益。 许多菜鸟(可以说大多自由职业开发人员)使用所谓的炫耀智商代码是极其困难的。 您是否曾经遇到过修改 EA 代码的任务,或者来自 代码库 的代码,因您不太清楚其意图,故显得极其复杂? 不要误会我的意思,我既不贬低任何人,也不鼓励针对复杂任务编写简单代码; 我要说的是,有一种方式可以确保即便是复杂代码也可轻松使用(我认为这就是创造力的全部意义所在)。 干净的代码可以提供帮助。

以下是编写干净代码的一些技巧:

  • 样式化 
  • 保持一致
  • 注释
  • 保持简洁不掺水 

样式化:

我用一个按其类型计算仓位的函数作为示例

int CountPosByType(ENUM_POSITION_TYPE type){
 int counter = 0; 
  for (int i=PositionsTotal(); i>=0; i--)
     if (m_position.SelectByIndex(i))
     if (m_position.Magic()==MagicNumber && m_position.Symbol()==Symbol() && m_position.PositionType()==type)
      { counter++; }
  return counter;
}

该函数很容易理解,但它没有遵循上述干净代码的提示,因此,我将首先对其进行样式化设置。 做法很简单 — 只需单击 MetaEditor 中看起来像发梳的蓝色按钮

mql5 代码风格

这是我们设置样式化后的代码样子:

int CountPosByType(ENUM_POSITION_TYPE type)
  {
   int counter = 0;
   for(int i=PositionsTotal(); i>=0; i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Magic()==MagicNumber && m_position.Symbol()==Symbol() && m_position.PositionType()==type)
            { 
                counter++; 
            }
   return counter;
  }

看,仅仅通过应用样式化,我们的代码就从难以阅读变成了易于阅读。 甚至这并没有改变我们的代码,因为我们必须迈出编写干净代码的第一步,这就是令其便于阅读,因为一旦您可以读懂它,您就可以修改它 — Period。

保持一致:

我无法告诉您在不同的函数级别,我最终为几乎相同的工作创建了多少变量,那为什么不创建一个全局变量呢? 我还鼓励您采用易于使用、易于记忆、一致性的函数名称,清晰地说明函数的全部内容,从而令您即使在 6 个月后也能回忆起它。 这将令您的工作交付时间比原来加快 3 倍,因为您不必从头开始创建一个早在您以前的 EA 中存在的函数,您只需从以前的作品中复制它。

对于函数的名称,我们这样做:

int CountPositionsByType(ENUM_POSITION_TYPE type)

由于我们要保持代码一致,我们可去搜索,并设置在文件里查找       findinFiles


您可从该处搜索所有 EA 和指标中的函数,这可简化操作。 下次我们想要创建函数时,我们只需复制它,即可在其它 EA 中再次使用它。

编写一致性代码的最佳方式是运用 OOP(面向对象编程)

一致性代码易于使用,而调试只需在一个地方即可完成

注释:

在您的代码中加上注释,即便被菜鸟称之为小事一桩,也会对您的生产力产生巨大的影响。 它不仅可令代码易读,且注释还可以提醒人们注意什么,例如,变量是关于什么的。

现在我们来再次定义计数器,这回用注释来解释它的全部内容:

int counter = 0; //Variable to store the number of positions

下次我们要访问计数器时,它应是这样的:

mql5 代码智能感知

在 MetaEditor 中注释代码的好处在于,注释可为一个变量或一段代码提供整体内容的提示。 当变量太多,可能很容易忘记它们的全部内容时,这样做就非常有用。

保持简洁不掺水:

OOP 在保持代码简洁(不要自我重复)方面有很大帮助。 还要注意不同的函数却可以完成近乎相同的工作。 例如,当您已有一个按类型计数仓位的函数时,您不会再需要一个函数来检查按仓位类型是否存在

05: 摒弃编写尽可能短的代码

"首先是可读性,然后是其它一切。"

现在我们能察觉到开发人员认为,如果他们尽可能减少代码行数、或一行中的字符更少,他们就会编写出更好的代码。 这依然是不明智的。

所编写的代码将会被查阅数十次乃至数百次,因此无论其长度如何,都应该努力编写可读性的代码。

我可以将其与开发人员偶尔犯懒联系起来(我曾经也是这样),我们觉得实现更少的事情只是为了应付自由职业上的工作任务或其他什么。

考虑在您的 EA 上提供易于使用的输入。 编写代码来处理所有异常,并提醒用户出了什么差错,例如提醒用户在某些输入里设置了零值,在没有正确输入数值的情况下,EA 可能无法正常工作。

这就是我要告诉您的,

   系统中的错误代码、交易返回代码、编译错误和异常是为了让您知道,而并非为了吓唬用户。 因此,请考虑编写代码,来提供警报、图表注释或任何内容;但要确保用户只能看到他应该做什么,以及需要采取什么行动才能让事情走向正轨。

我知道从头开始实现它们会让人感觉很无聊,但您总能找到更好的方法! 您可将它们保存在包含文件中的某个位置,以便包含它、或用于复制和粘贴 — 您总能找到一种恰当的方式。


结束语

有关良好实施的好处多多,但它们难以长期贯彻,不过一旦发展起来,它们将在您的职业生涯中伴随您。

 感谢阅读!


本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/9643

最近评论 | 前往讨论 (1)
Tiecheng Fu
Tiecheng Fu | 13 9月 2021 在 12:14

不错,学习了,和我的编码理念完全一致!支持一下

针对交易的组合数学和概率论(第一部分):基础知识 针对交易的组合数学和概率论(第一部分):基础知识
在本系列文章中,我们将尝试找寻概率论的实际运用来描述交易和定价过程。 在首篇文章中,我们将研究组合数学和概率论的基础知识,并将分析如何在概率论的框架中应用分形的第一个例子。
形态与示例(第一部分):多顶 形态与示例(第一部分):多顶
这是研讨算法交易框架中逆转形态相关的系列文章中的首篇。 我们将从最有趣的形态家族开始,它们源自双顶和双底形态。
DoEasy 函数库中的图形(第七十九部分):“动画框”对象类及其衍生对象 DoEasy 函数库中的图形(第七十九部分):“动画框”对象类及其衍生对象
在本文中,我将开发单个的动画框,及其衍生类。 该类允许绘制造型,同时维护,并恢复它们得下层背景。
DoEasy 函数库中的图形(第七十八部分):函数库中的动画原理。 图片切分 DoEasy 函数库中的图形(第七十八部分):函数库中的动画原理。 图片切分
在本文中,我将定义会在函数库某些部分中用到的动画原理。 我还将开发一个类,复制图像的一部分,并将其粘贴到会话窗对象上的指定位置,它是为了保留和恢复叠加图像位置的会话窗背景部分。