更好的程序员(第 02 部分):停止做这 5 件事变为一名成功的 MQL5 程序员

6 十月 2021, 15:06
Omega J Msigwa
1
1 060

概述


我在本系列文章中经常使用 noob(菜鸟) 这个词来描述 MQL5 编程方面经验较少的人(请不要因此而感到冒犯)。 它令其很容易建立联系。 这并不意味着本文仅针对菜鸟。 绝对不是! 这适用于所有人,无论您有多少编程经验,因为您曾为菜鸟的原因是您的编码习惯和行为 ……,而不是有多少年的编码经验。

noobs_vs_professional 编程者 


对于那些尚未读过的人,第一篇文章在此,那么我来继续推进这个任务,将菜鸟培养为专业人士。

01: 不要再认为您比其他人优秀


若您已经从事编程一段时间,并在自由职业者板块、代码库或其他方面设法为您自己和您的客户创建了若干个很棒的 EA 和指标,您会因此而感觉良好。 若您注意到自己的进步,并据其增强应对巨大挑战的信心,从而提高更多,而不是滋生傲慢脾气,那当然最好。 请牢记:

“傲慢之人总认为自己是完美的。 这是无知带来的主要危害。 它会干扰一个人在生活中的主要任务 — 成为一个更好的人。”

— Leo Tolstoy(列夫·托尔斯泰)

世人很容易感觉自己超级聪明,且在没有完全理解的情况下评判他人的代码,或者急于以冒犯性的方式在论坛上回答他人的问题,以此来表明别人是一位多糟糕的程序员,那个刚刚在论坛上提出问题的人编程很烂。 我曾见过多次,人们在论坛上提出问题,然后他们发布代码,并讲述他们之前尝试过的方法不起作用。 然后突然一个菜鸟蹦出来指责说这人所采取的方法是极其错误的,但并未提供解决方案、或其提供的解决方案(在这种情况下的代码)还不如该话题发起者的代码准确。 我的天啊!


菜鸟回答


与其直接蹦出来指责主题发起者大错特错,甚至之后提供格式不正确的代码,为什么不一开始先解释为何会出现问题,然后再详细解释需要做什么,以及指出清晰的途径吗?

在论坛发起新主题其实并无乐趣。 我确信任何在论坛上发起话题的人都已经明白他们在某种程度上是错误的,这也是为什么他们没有得到预期的结果。 话题的发起者很可能是个菜鸟,他们已经在该问题上挣扎了几个小时甚至几天(我清楚那是什么感觉)。

即使直接蹦出来,并抛出一段未加解释或不清楚的代码,从长远来看,也无法解决发起者的问题。 这就像给需要手术的人服用止痛药一样。 这样做的后果,终将把菜鸟养成我在本系列第一篇文章中首次讲述的最坏习惯— 复制和粘贴 — 让他们的思维像“所以它在这里以这种方式工作,我有问题就在论坛上发布代码,然后我就会得到想要的代码来替换不起作用的代码......这很酷呀!”

始终确保以清晰、详细、友好的方式解释解决方案,因为大多数都是初学者。 还要记住,有很多菜鸟未来会偶然发现同样的问题,故他们可能需要从该主题中寻找解决方案。 

除了那个例子,认为我们比其他人更好,会导致论坛中的错误答案,以及代码库上的虚假评价。 仅仅因为您认为代码没有像您想象的那样复杂、或不符合您喜欢和熟悉的方式,从而认为您比该特定系统的作者更好,由于下意识拒绝深入理解如何以及为什么发起者如此编写代码,就会因此而导致无知。

02: 避免固化思维 


不要再认为您不可能在某个特定领域变为强者。

"疯狂就是一遍又一遍地做同样的事情,并期待不同的结果。"
—Albert Einstein(艾尔伯特·爱因斯坦)


不要拘泥于制作相同类型的智能交易系统、指标、脚本或其他任何东西。 这会破坏您的创造力,并一直停留在同一个地方。 只因为太复杂或太难、或是触及自身限制,就认为您并非天生擅长某个特定的编程领域。 要知道您的大脑是灵活的。 它可针对新的刺激来适应和改变。 您越是挑战它,您就会在某个特定主题上变得越加强悍。 您可以变得更加擅长:

以及您能想到的一切。 但您必须付出足够的努力才能将其兑现。

当然了,到目前为止还没有圣杯 EA(我自己不曾见过)或指标,但这不应阻挡您通过修改相应方法,将系统提升到最佳状态。

在 MQL5 编程的早期,当我从代码库下载诸如简单移动平均线之类的东西,并发现其代码超过了 1000 行或更多时 ,我感到异常恐惧,因为这是我在代码中看到的第一件事。 我认为这太复杂了。 我认为这与菜鸟面临的问题相同。

现在,我已经有点经验了。 而目前我只能说可能有点难,但无大碍。 生活中的一切一开始都是如此,但会越来越很容易,只有时间和努力才能证明。

03: 不要编写以后有一天才会用到的代码


好吧,您曾为您的项目创建 EA 或指标。 您现在有太多的代码行了。 如果没有太多注意和仔细检阅您的代码,很可能存在当前不需要和未用到的代码。


"知识丰富的人不会去预测。 试图预测的人则毫无常识。"
— Lao Tzu(老子)

更少的代码总是意味着 

  • 更少的漏洞
  • 更少的时间阅读 
  • 易编译 
  • 快速审查 
  • 快速交付
  • 易维护 
  • 易调试
不要花太多时间编写现在还不需要的代码。

我希望您在 MQL5 编程中至少见识过一次这样的事情,当然是从别人的代码中

int MathRandInt(int mini, int maxi)
  {
   double f   = (MathRand() / 32768.0);
   return mini + (int)(f * (maxi - mini));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void chart_random()
 {
//---
  string background[]={"clrBlack"};
  string bulls[]={"clrGreen","clrDeepPink","clrYellow","clrCrimson","clrMediumBlue","clrKhaki","clrYellow"};
  string bears[]={"clrDarkViolet","clrDarkOrange","clrIndigo","clrWhite","clrSilver","clrMediumPurple","clrBlue"};
//---
   ChartSetInteger(ChartID(), CHART_MODE, CHART_CANDLES);
   ChartSetInteger(ChartID(), CHART_SHOW_GRID, false);
   ChartSetInteger(ChartID(), CHART_AUTOSCROLL, true);
   ChartSetInteger(ChartID(), CHART_SHOW_PERIOD_SEP, true);
   ChartSetInteger(ChartID(), CHART_SHIFT, true);
   ChartSetInteger(ChartID(), CHART_SHOW_ASK_LINE, true);
   ChartSetInteger(ChartID(), CHART_SHOW_BID_LINE, true);
   ChartSetInteger(ChartID(), CHART_COLOR_ASK, clrBlue);
   ChartSetInteger(ChartID(), CHART_COLOR_BID, clrCrimson);
   ChartSetInteger(ChartID(), CHART_SCALE, 2);
   ChartSetInteger(ChartID(), CHART_FOREGROUND, true);
   ChartSetInteger(ChartID(), CHART_COLOR_FOREGROUND,clrWhite);
//---
/*
 for (int i=0; i<ArraySize(background); i++){
     int maxi=ArraySize(background);
     int random_=MathRandInt(0,maxi);
    ChartSetInteger(0,CHART_COLOR_BACKGROUND,StringToColor(background[random_]));
    }
  for (int i=0; i<ArraySize(bulls); i++){
    ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,StringToColor(bulls[MathRandInt(0,ArraySize(bulls))]));
    ChartSetInteger(0,CHART_COLOR_CHART_UP,StringToColor(bulls[MathRandInt(0,ArraySize(bulls))]));
   }
  for (int i=0; i<ArraySize(bears); i++){
    ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,StringToColor(bears[MathRandInt(0,ArraySize(bears))]));
    ChartSetInteger(0,CHART_COLOR_CHART_DOWN,StringToColor(bears[MathRandInt(0,ArraySize(bears))]));
   } */
//---
   int y_distance=70;
   int font_size=30; 
   int width=(int)ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS);
   int padding=70;
   int x=width/3;
//---
    string label_name= MQLInfoString(MQL_PROGRAM_NAME);
    ObjectCreate(0, "name", OBJ_LABEL, 0, 0, 0);
    ObjectSetString(0,"name",OBJPROP_TEXT,label_name); 
    ObjectSetString(0,"name",OBJPROP_FONT,"Lucida Console"); 
    ObjectSetInteger(0,"name",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
    ObjectSetInteger(0,"name",OBJPROP_XDISTANCE,x+padding); 
    ObjectSetInteger(0,"name",OBJPROP_YDISTANCE,y_distance); 
    ObjectSetInteger(0,"name",OBJPROP_FONTSIZE,font_size); 
    ObjectSetInteger(0,"name", OBJPROP_SELECTABLE, false);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

示例图像太小 — 我看到超过 200 行代码已被注释掉(隐藏),且在程序中是根本不必要的。

MetaEditor 在函数级别检测到不必要的变量,并警告您有未使用的变量,如此,若您喜欢,您可以选择保留它们,并同时忍受警告,亦或删除它们。

但对于其余的代码,我们必须自己检查,以确保我们没有这些不需要的代码。

如果您并未用到它 — 您不需要它 — 那么删除它。

未用到的代码会导致混乱,更不用说当它们位于程序代码的中间时,它们也会增加您滚动到必要代码的时间。

04: 您未必总是正确的。

"一个人犯了错误而不改正,就是在犯另一个错误。" 
— Confucius(孔子)

菜鸟为什么会立即跑到论坛抛出他们的代码,且只提供少量他们为何如此做的不明确描述,究其主要原因,是因为他们害怕会让自己面临更多的问题。 这极不明智,我亲爱的菜鸟们!

编码职业充满了问题和永无止境的挑战,如果不去尽可能多地解决暴漏出的问题,就没有比这更好的方式来变得更加出色了。 我并不是说您不应该在论坛上发布您的问题(不要误会我的意思)。 但请确保您已经尝试过自行解决它,这是一个很好的做法,因为在您发起主题之时,描述的是自己尝试过的事情。 这背后的原因会让您的注意力集中在它上面,通过不同的方法挑战自己,不仅可以解决这个难题,而且您也许会发现您开始不知道的东西,并学到更多。

一旦错误被修复,确保您理解它,以及下次如何避免它。


05: 放弃一夜成名的想法

"如果您仔细观察,大多数的一夜成名需要很长时间。"
— Steve Jobs(史蒂夫·乔布斯)

好的,我知道您已经从事编程一段时间了,但是您觉得自己没有取得任何进展,您觉得自己无处可去。 是不是?

这种感觉会在菜鸟身上发生很多次,因为他们中的大多数人都希望得到立竿见影的结果,但现实世界并非如此。

坐下来,放松,并享受这个过程。 您实际上是在进步;您的怀疑只是旅程的一部分,但它们不应该阻碍您。 我建议您去做自己最喜欢的项目,这样您就可以在学习的同时获得很多乐趣,但不要被困于其中。 正如我在第二点中所解释的那样,确保您对新思路和可能性保持开放态度。

投入工作,进度将作为最终产品自动出现。

  • 代码库上阅读尽可能多的源代码。
  • 文献中阅读尽可能多的文章。
  • 论坛花更多时间帮助他人。
  • 尝试更多东西,从而找到最适合您的东西。

记住

成功不是来自您偶尔做的事情。 它来自于您一贯做的事情。

 

结束语

实话实说,我在 MQL5 编程或我的 Web 开发生涯中并不那么出色,也不完美。 我仍然是编程方面的学生,学习是无止境的,因为它永远不会停止教训人。 我每天都在努力提升,并变得更好。 我之所以有勇气与您分享这一点(在学生时代教书)是为了帮助与我有同样热情的人成为更好的程序员

让我们一起踏上这段旅程吧!

由MetaQuotes Software Corp.从英文翻译成
原始文章: https://www.mql5.com/en/articles/9711

最近评论 | 前往讨论 (1)
avavolcano
avavolcano | 8 10月 2021 在 05:03
不明觉厉
针对交易的组合数学和概率论(第二部分):通用分形 针对交易的组合数学和概率论(第二部分):通用分形
在本文中,我们将继续研究分形,并会特别留意总结所有材料。 为此,我将尝试把所有早期开发归纳为一个紧凑的形式,这对于交易中的实际应用来说将是方便和易于理解的。
DoEasy 函数库中的图形(第八十一部分):将图形集成到函数库对象之中 DoEasy 函数库中的图形(第八十一部分):将图形集成到函数库对象之中
是时候开始把已创建的对象集成到先前所创建的函数库对象当中了。 这最终将会为每个函数库对象赋予自己的图形对象,便于用户与程序之间的交互。
针对交易的组合数学和概率论(第三部分):第一个数学模型 针对交易的组合数学和概率论(第三部分):第一个数学模型
早前所研讨主题的逻辑延续,即针对交易任务开发多功能数学模型。 在本文中,我将从头开始讲述与分形数学模型开发相关的整个过程。 这个模型应成为一个重要的构建模块,且其是多功能和通用的。 它将为我们遵循该思路深入开发奠定理论基础。
DoEasy 函数库中的图形(第八十部分):“几何动画框”对象类 DoEasy 函数库中的图形(第八十部分):“几何动画框”对象类
在本文中,我将优化前几篇文章中的类代码,并创建几何动画框对象类,允许我们绘制给定顶点数的正多边形。