
更好的程序员(第 02 部分):停止做这 5 件事变为一名成功的 MQL5 程序员
概述
我在本系列文章中经常使用 noob(菜鸟) 这个词来描述 MQL5 编程方面经验较少的人(请不要因此而感到冒犯)。 它令其很容易建立联系。 这并不意味着本文仅针对菜鸟。 绝对不是! 这适用于所有人,无论您有多少编程经验,因为您曾为菜鸟的原因是您的编码习惯和行为 ……,而不是有多少年的编码经验。
对于那些尚未读过的人,第一篇文章在此,那么我来继续推进这个任务,将菜鸟培养为专业人士。
01: 不要再认为您比其他人优秀
若您已经从事编程一段时间,并在自由职业者板块、代码库或其他方面设法为您自己和您的客户创建了若干个很棒的 EA 和指标,您会因此而感觉良好。 若您注意到自己的进步,并据其增强应对巨大挑战的信心,从而提高更多,而不是滋生傲慢脾气,那当然最好。 请牢记:
“傲慢之人总认为自己是完美的。 这是无知带来的主要危害。 它会干扰一个人在生活中的主要任务 — 成为一个更好的人。”
— Leo Tolstoy(列夫·托尔斯泰)世人很容易感觉自己超级聪明,且在没有完全理解的情况下评判他人的代码,或者急于以冒犯性的方式在论坛上回答他人的问题,以此来表明别人是一位多糟糕的程序员,那个刚刚在论坛上提出问题的人编程很烂。 我曾见过多次,人们在论坛上提出问题,然后他们发布代码,并讲述他们之前尝试过的方法不起作用。 然后突然一个菜鸟蹦出来指责说这人所采取的方法是极其错误的,但并未提供解决方案、或其提供的解决方案(在这种情况下的代码)还不如该话题发起者的代码准确。 我的天啊!
与其直接蹦出来指责主题发起者大错特错,甚至之后提供格式不正确的代码,为什么不一开始先解释为何会出现问题,然后再详细解释需要做什么,以及指出清晰的途径吗?
在论坛发起新主题其实并无乐趣。 我确信任何在论坛上发起话题的人都已经明白他们在某种程度上是错误的,这也是为什么他们没有得到预期的结果。 话题的发起者很可能是个菜鸟,他们已经在该问题上挣扎了几个小时甚至几天(我清楚那是什么感觉)。
即使直接蹦出来,并抛出一段未加解释或不清楚的代码,从长远来看,也无法解决发起者的问题。 这就像给需要手术的人服用止痛药一样。 这样做的后果,终将把菜鸟养成我在本系列第一篇文章中首次讲述的最坏习惯— 复制和粘贴 — 让他们的思维像“所以它在这里以这种方式工作,我有问题就在论坛上发布代码,然后我就会得到想要的代码来替换不起作用的代码......这很酷呀!”
始终确保以清晰、详细、友好的方式解释解决方案,因为大多数都是初学者。 还要记住,有很多菜鸟未来会偶然发现同样的问题,故他们可能需要从该主题中寻找解决方案。
除了那个例子,认为我们比其他人更好,会导致论坛中的错误答案,以及代码库上的虚假评价。 仅仅因为您认为代码没有像您想象的那样复杂、或不符合您喜欢和熟悉的方式,从而认为您比该特定系统的作者更好,由于下意识拒绝深入理解如何以及为什么发起者如此编写代码,就会因此而导致无知。
02: 避免固化思维
不要再认为您不可能在某个特定领域变为强者。
"疯狂就是一遍又一遍地做同样的事情,并期待不同的结果。"
—Albert Einstein(艾尔伯特·爱因斯坦)
在 MQL5 编程的早期,当我从代码库下载诸如简单移动平均线之类的东西,并发现其代码超过了 1000 行或更多时 ,我感到异常恐惧,因为这是我在代码中看到的第一件事。 我认为这太复杂了。 我认为这与菜鸟面临的问题相同。
现在,我已经有点经验了。 而目前我只能说可能有点难,但无大碍。 生活中的一切一开始都是如此,但会越来越很容易,只有时间和努力才能证明。
03: 不要编写以后有一天才会用到的代码
"知识丰富的人不会去预测。 试图预测的人则毫无常识。"
— 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 Ltd译自英文
原文地址: https://www.mql5.com/en/articles/9711
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.



我怎样才能创建一个函数,不仅在蜡烛图开始时,而且在新蜡烛图形成之前,每根蜡烛图只允许 1 笔交易或开仓。newbar 函数只允许在新蜡烛开始时进行交易。
您应该检查仓位的开仓时间,以及在指定的蜡烛周期内是否已经存在仓位。如果存在,则不做任何操作。如果不存在,则开立新仓位。