English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
更好的程序员(第 04 部分):如何成为更迅捷的开发人员

更好的程序员(第 04 部分):如何成为更迅捷的开发人员

MetaTrader 5示例 | 21 十月 2021, 11:33
1 855 0
Omega J Msigwa
Omega J Msigwa

概述

更迅捷地开发是每位开发者的梦想。 当我们陷入编码漩涡时,如果不能几天尝试就搞明白的事情,没有人愿意用整周时间或花费太多时间开发一个程序或一段代码。

更迅捷地开发

每位编码员都希望更迅捷

  • 也许您在 YouTube 上观看过 MQL5 编码视频,但很难照搬,这是因为您太慢,且无法赶上讲师的速度,故您希望自己也能达到那种水平。
  • 也许您曾见识过一些开发人员在键盘上的敲码速度非常快,他们可以在几分钟内编写一个复杂的算法,而您可能需要花费数小时甚至数天的时间来编写同样的代码。
  • 或许您可能希望能够更快、更有效地编码,以便您能够更迅捷地在 自由职业者 上交付任务,并领先于您的竞争对手。
  • 或许您也许想通过自己在键盘上的超人能力给您的配偶/伙伴留下深刻印象,能够在短时间内以更少或没有差错的情况下编写复杂的算法。
  • 有时您可能希望能够为市场上的产品提供快速更新,并当客户通过您的电子邮件或 MQL5 消息收件箱给您指出漏洞和错误时能及时修复。

请关注并将您的笔和笔记本放在手边,因为我即将投放知识炸弹,其内容与如何提高编码速度、同时为您和您的客户提供高质量工作有关。

为了提升最大编码速度潜力,任何这些东西您都不需要

    • 丰富的编码经验
    • 最佳机制的键盘
    • 擅长凭肌肉记忆键盘打字
    • 个人计算机 (PC) 上有更多容量的内存、更多内核、强大的 GPU(图形处理器)

更迅捷的开发人员与更迅捷的编码人员

在我开始抛出这些要点之前,我认为最好解释一下 开发人员和编码人员 之间的区别。

开发人员 编码人员
开发人员是更富有经验的代码编写者。 他们负责项目中的几乎所有事情,诸如:

设计、工时计划、编码以及与项目相关的一切。                                                                                                                                                                                                                                                                                                                            
任何可以编写一些代码的人通常都被科技行业以外的人称为编码员。 但是,通常,会认为编码员是受过较少培训或经验较少的程序员(开发人员)。 这些独立人士缺乏与程序员或开发人员等同的算法知识,因为他们通常是该领域的初学者,只掌握了一种编码语言。 编码人员的工作通常是编写在开发人员看来很简单直白的代码片段。

作为一名编码员,您无需了解项目内的所有内容。 例如,自由职业者的客户可能想在他的 EA 中添加尾随停止功能。 编码人员可直接编写它,在 Ontick 函数中调用它,然后在 MetaTrader 5 上测试一两次,从而确保它可以正常工作,若工作正常,则他/她将其发回给客户

在本文中,我们将讨论更广泛的开发人员术语 — 您如何能更迅捷地开发系统。 我们将研究设计、职业道德、工具运用、编码、调试、等等方面之间的所有内容。 


如何变得如同开发人员一样迅捷

01: 避免漏洞和糟糕的架构

开发人员认为他们花了很多时间去编写代码,但实际上,我们把大部分时间都花在阅读代码、调试和搞清楚要做什么。

您用 30 分钟编写的一段代码,调试可能需要三个小时,故您产生的漏洞越多,完成项目编码所需的时间就越长。 现在您知道漏洞会拖累我们的开发进程。 所以,我们最好的应对方案就是尽量避开它们。

糟糕的架构 + 漏洞=世界末日(开玩笑的)

在您的项目中存在漏洞是很糟糕的,但仅仅因为糟糕的架构而无法对其进行调试、或轻松发现它们就更糟了。 看看这段摘自 EA 的代码,有人把它发给我让修复漏洞。

ouble NPB=ND(m_account.Balance()*PortionPC,2);
if(CbT==0||PortChange<0||(PortChange>0&&NPB>PortionBalance))PortionBalance=NPB;
if(Pb+Ph<0)DrawDownPC=-(Pb+Ph)/PortionBalance;
if(!FirstRun&&DrawDownPC>=MaxDDPercent/100)
{       ET(A,displayColorLoss,"Equity Stop Loss Reached");
        if(PlaySounds)PlaySound(AlertSound);
        return(0);
}
if(-(Pb+Ph)>MaxDD)MaxDD=-(Pb+Ph);
MaxDDPer=MathMax(MaxDDPer,DrawDownPC*100);
if(SaveStats)Stats(false,TimeCurrent()<NextStats,PortionBalance,Pb+Ph);

//+-----------------------------------------------------------------+
//|                                                                 |
//+-----------------------------------------------------------------+
double StepAB=InitialAB*(1+StopTradePercent),StepSTB=m_accout.Balance()*(1-StopTradePercent), NextISTB=StepAB*(1-StopTradePercent);
if(StepSTB>NextISTB){   InitialAB=StepAB;
        StopTradeBalance=StepSTB;       }
        
double InitPortion=StopTradeBalance*PortionPC;
if(PortionBalance<InitPortion)
{       if(CbT==0)
 {      AllowTrading=false;
        if(PlaySounds)PlaySound(AlertSound);
        Print("Portion Balance dropped below stop trade percent");
        MessageBox("Reset EA, account balance dropped below stop trade percent on "+Symbol()+Period()," Warning",48);
        return(0); }
        else if(!ShutDown&&!RecoupClosedLoss)
        {       ShutDown=true; if(PlaySounds)PlaySound(AlertSound);
                Print("Portion Balance dropped below stop trade percent");
                return(0);              }
}

看看这个架构有多糟糕。 代码中出现漏洞一点也不奇怪。 如您所见,即使您是刚开始编写代码的人,也很难轻松、一目了然地理解代码。

如果您作为自由职业者,有人雇您来修复漏洞,或许您会看到超过 10000 行的代码,都和上面的代码一样(已经超过 3 周了,但直到现在我还没有完工),那时您一定会感到很倒霉(就像我一样)

我的观点是这样的。 始终遵守您的编码范式、命名函数的方式、创建变量等保持一致,选择您喜欢的风格,并确保它们对您和其他所有人都易于使用。


02: 学习快速调试

我们在谈第一个观点时看到漏洞会减慢我们的进度,并占用我们的时间。 调试是一个很长的主题,在本文中会涵盖所有这些。 我推荐大家阅读文献调试 MQL5 程序,从而学习更多有关调试的信息。

为了迅捷,我们需要学习如何快速调试,这里有一些相关提示。

01: 使用 MetaEditor CodeStyler

这就像朝着调试迈进的婴儿学步,这个神奇的工具本身不能调试,但可以帮助改变我们的代码外观,并使代码清晰易读。

02: 打印注释更多信息。

为了找出为什么不起作用,我们需要在可疑区域打印和注释更多代码。

始终在无法找到的区域中查找漏洞。

03: 在您清楚地了解它是如何工作之前,不要试图改变任何东西。

我敢肯定这之前在您身上发生过,即您删除了一段代码,本意是可以让您的系统工作,随后您意识到删除的代码与您的系统漏洞无关,所以现在您必须再花一次编写代码的时间,而这并不能保证您不会在此过程中遗留其它错误。 

如果它是内置函数或方法,则在删除任何内容之前,请先阅读文档。 如果您不确定,也可在论坛上咨询。 若我不确定该如何做时,我会亲自复制文本文件中的所有代码,如此我就可以灵活地更改代码,并测试新内容,以及当我发现漏洞出自何处时,能参考主要代码 。


03: 函数库为特定用途而创建

在使用函数库时,基础在于将所提供的类用于其预期目的,因为我们懒于实现整洁的代码,故试图强行采用我们的方式,就肯定会导致灾难。

如果您使用的是标准库,最好以清晰、简单、一致的最佳方式实例化和引用标准库成员,而这也是专业标准库开发人员推荐的方式。

例如,不要像这样以懒惰的方式引用标准库Trade 类,而且名称也不明确,甚至不一致,

#include <Trade\AccountInfo.mqh> //Class for working with trade account properties
#include <Trade\SymbolInfo.mqh>  //Class for working with trade instrument properties
#include <Trade\OrderInfo.mqh>   //Class for working with pending order properties
#include <Trade\OrderHistoryInfo.mqh>  //Class for working with history order properties
#include <Trade\PositionInfo.mqh>   //Class for working with open position properties
#include <Trade\DealInfo.mqh>       //Class for working with history deal properties
#include <Trade\Trade.mqh>          //Class for trade operations execution
#include <Trade\TerminalInfo.mqh>   //Class for getting the properties of the terminal environment
//--- 
CAccountInfo       ac;
CSymbolInfo        symb;
COrderInfo         orders;
CHistoryOrderInfo  hist_orders;
CPositionInfo      pos;
CDealInfo          _clos;
CTrade             my_trade;
CTerminalInfo      info;

取而代之,按照一致且易于理解的方式引用所有函数库,最好的方法是以 Class 成员引用格式引用它 m_*** - 代表某个类的成员

就像这样,

#include <Trade\AccountInfo.mqh> //Class for working with trade account properties
#include <Trade\SymbolInfo.mqh>  //Class for working with trade instrument properties
#include <Trade\OrderInfo.mqh>   //Class for working with pending order properties
#include <Trade\OrderHistoryInfo.mqh>  //Class for working with history order properties
#include <Trade\PositionInfo.mqh>   //Class for working with open position properties
#include <Trade\DealInfo.mqh>       //Class for working with history deal properties
#include <Trade\Trade.mqh>          //Class for trade operations execution
#include <Trade\TerminalInfo.mqh>   //Class for getting the properties of the terminal environment
//--- 
CAccountInfo       m_account;  //members of account info
CSymbolInfo        m_symbol;   //members of symbolInfo
COrderInfo         m_order;    //mambers of OrderInfo
CHistoryOrderInfo  m_orderhistory; //members of Orderhistory info
CPositionInfo      m_position; //members of position info
CDealInfo          m_deal;     //members of deal info
CTrade             m_trade;    //members of trade info
CTerminalInfo      m_terminal; //members of terminal info

此外,不要忘记在函数库引用的末尾添加注释,以便您下次再编写代码并尝试访问它时,可以提醒您引用的全部内容。 

还有,为了加快提升我们的编码能力,我们应该更倾向于使用现成的标准库来处理我们的任务,而不是试图从头开始实现一切。 这些函数库都是由专业程序员创建的,目的是令我们的 MQL5 代码干货满满(无需您自己重复劳动),并加快开发过程。 我鼓励每个人都使用它们,对于代码库和市场上的其它优秀函数库就更不用说。 

您认为在这两者之间谁的编码更快?

一切都来自初级编码人员(可能是菜鸟) 使用标准库的编码人员
double SymbolAsk(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return SymbolInfoDouble(symbol, SYMBOL_ASK);
}

double SymbolBid(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return SymbolInfoDouble(symbol, SYMBOL_BID);
}

int SymbolDigits(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
}

double SymbolLotSize(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
}

double SymbolLotStep(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
}

double SymbolMaxLot(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
}

double SymbolMinLot(string symbol)
{
        if (symbol == "") symbol = Symbol();

        return SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);

}


#include <Trade\SymbolInfo.mqh>
CSymbolInfo   m_symbol; 

input string Input_symbol = "EURUSD";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
     string symbol = Input_symbol=="" ? Symbol() : Input_symbol;
      m_symbol.Name(symbol); //Sets symbol name for our CSymbolInfo class object
//---
   return(INIT_SUCCEEDED);
  } 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      m_symbol.RefreshRates(); //Refresh to Get the Last quote 
      double    SymbolAsk = m_symbol.Ask();
      double    SymbolBid = m_symbol.Bid();
      double    SymbolDigits = m_symbol.Digits();
      double    SymbolLotSize = m_symbol.ContractSize();
      double    SymbolLotStep = m_symbol.LotsStep();
      double    SymbolMaxLot = m_symbol.LotsMax();
      double    SymbolMinLot = m_symbol.LotsMin();
  }



















标准库用户的工作效率比非用户高 3 倍以上,更不用说他们的程序中所用的代码更少,这意味着更少的漏洞。


04: 避免错综复杂的代码

我希望在您的编码生涯中您曾在某人的 EA 代码中看到过类似下面的代码

        if(LbT>0)
        {       BEb=ND(BEb/LbT,Digits());
                if(BCa<0)BEb-=ND(BCa/PipVal2/(LbB-LbS),Digits());
                if(Pb>PbMax||PbMax==0)PbMax=Pb;
                if(Pb<PbMin||PbMin==0)PbMin=Pb;
                if(!TradesOpen)
                {       FileHandle=FileOpen(FileName,FILE_BIN|FILE_WRITE);
                        if(FileHandle>-1)
                        {       FileWriteInteger(FileHandle,TbF);
                                FileClose(FileHandle);
                                TradesOpen=true;
                                if(Debug)Print(FileName+" File Written: "+TbF);
                        }
                }
        }

在您编写此代码模块的那时刻这些可能都很容易,但在您调试它的那一刻想读懂它也许并不容易,您很可能已经忘记了一些变量,即使不是全部,您也不得不开始再次参阅它们。 想想这样的行为会多么浪费时间!

编写复杂的算法会令别人讨厌你,您也会迷惑自己。

强制所有逻辑都出现在一个地方是令人厌恶的,希望在一个函数中完成太多操作会减慢我们的开发过程,因为我们必须仔细编排我们的代码,并确保一切正常。

如果您需要某些类型的操作,请考虑创建独立的函数,这些函数只能执行此操作,这样您就可以轻松地每完成一件事,然后再进行另一件事。


05: 避免走神。

"当您停止手头正在做的事情,并发现自己思考没有价值的事情时,您就应该意识到自己这是在走神。"
— Beverly R. Imes(贝弗利·R·伊姆斯)

保持您的手机处于静音(若没有将其彻底关机),并且不要拿起手机浏览或分享您喜欢的社交媒体照片。 如果您这样做了,您就会丧失工作效率。 如果您身在一个嘈杂扰人的家中,那么找个场所坐下来,并完成您的项目。

如果这对您来说足够重要,您就能免受干扰:关上门、关掉手机、关闭社交媒体、镇定心神并完成工作。

我认为作为现代社会的开发人员这是我们必须克服的最大挑战,那时候您只需点击一下即可获得 Instagram 上诱人的美丽模特,并在 Snapchat 上观看可爱猫咪视频。

当您的项目遇到困难时,当您无法找到正确的实现代码时;休息一下,看看社交媒体上发生了什么,或者只是外出放松一下,这确实十分诱人。

并不是说我反对休息和与朋友一起放松,不要误会我的意思,尽管有太多 MQL5 和 Web 开发项目等着我,但我绝不会 24/7 全天候编码。 但我相信每个人都应该坚守一个适合他们的日程表。 如果没有时间去查看社交媒体,就不必强求。 如果编码时间只卡死到期限结束 (无论事情变得多么混乱或艰难),但若在那之后我没有什么重要的事情去做,我宁愿延长编码期限。

走神的程序员也许会花 5 小时或更长时间来编码,而专注的程序员只需编码 45 分钟


06: 阅读文档和学习

在论坛上找到您所关注问题的解决方案后,不要急于复制并粘贴它,或许您觉得这样可以更快地完成您的项目(这一点已在我的第一篇文章中有所涉及)。蛋清确保您了解如何为自己编写解决方案。 当出现问题时,尤其是当代码有漏洞时,很难依凭复制代码来解决,因为您本人根本不理解它的成因。

我鼓励每位编码人员时常阅读文档,尤其是我们不知道或还不习惯的东西。

如何做才能提高我们的开发速度?

您对 MQL5 语言了解得越多,就会变得越自在,且越容易,您就会越快地掌握它,最终成为一名程序员。 找到正确的代码来有效地将您的想法兑现为现实(程序)总是很困难,这是我们浪费大部分时间的地方。 如果您对特定活动(例如编写指标、脚本、智能交易系统程序、等等)的了解不多,我当然希望您能坦言即便面对简单的事情,您在编写代码时也有诸多困难,而这恰好就是经验的启蒙。

那么如何获得经验呢? 我的回答总是很简洁:学习并尝试不同的事情

那些非常了解 MQL5 语言的人,在如何把他们的思路变成有效和有意义的代码方面有无穷无尽的选择。 他们知道在何处运用


07: 间隔重复

"与短时间内反复学习相比,人类在长时间内(间隔呈现)重复学习几次时更容易记忆,或学习项目。"
— Hermann Ebbinghaus(赫尔曼·艾宾浩斯)

这就是我们如何通过一遍又一遍地缓慢学习我们所知道的一切,直到它成为后天本能。 我们大脑的记忆是有限的,只会保留我们经常用到的东西,所以如果我们想在脑海中保留一些东西,我们就应该定期温习。 我们应该学会把这一点变为我们的助益。

如何?

由于导致我们行动迟缓的原因之一是我们对该特定主题的无知,因此我们应该始终寻找需要改进的领域(本文中讨论了其中一些),一旦我们发现了我们应该不断努力改进的领域,就应该在这些方面改进提升,直到我们变得异常出色。 在尝试学习和掌握特定技能时这很有效,诸如机器学习自适应算法等 等


08: 键盘快捷键和 MetaEditor 设置

键盘快捷键

键盘快捷键很有趣,在键盘上编写代码时可以为您节省大量时间。 我是这方面的专家,我喜欢在 MetaEditor 上把我高效的键盘快捷键传授给程序员。

学好键盘快捷键在键入代码时会改变生活,我认为每位开发人员都应该使用键盘而不是鼠标,因为我们大部分时间都花在键盘上,所以我们需要在这方面更擅长。

以下是我在 Window PC 上最喜欢的一些快捷方式(对于 Mac 和 Linux 我不太确定,但 Mac 用户可以将 CTRL 替换为 COMMAND);

快捷键 用法
 F4 在 MT5 和 MetaEditor 之间转换
 F7  编译代码 
 CTRL+F7  编译所有打开的文件 
 CTRL+C 复制所选代码 
 CTRL+V 粘贴已选代码 
 CTRL+X 剪切选定的代码 
 CTRL+Z 撤消代码中的变更  
 CTRL+Y 重做代码中的变更
 CTRL+A 选择全部代码 
 CTRL+END 将光标移动到文档中的最后一行代码 
 CTRL+HOME 将光标移动到文档中的第一行代码 
 SHIFT + Directions(LEFT,UP,RIGHT,DOWN) 选择代码朝向的方向   
 TAB 增加所选代码的缩进 
 SHIFT+TAB 减少所选代码的缩进  
 CTRL+ Backspace 删除一行中的整个单词 
 HOME 将光标移动到行首 
 END 将光标移动到行末 
 CTRL+ ? 
//--- 将代码分隔符放到下一行
 CTRL+>
//+------------------------------------------------------------------+
//|           在当前行和接下来的两行添加注释行                          |
//+------------------------------------------------------------------+
 CTRL+"
// 在行首添加两个正斜杠  
 CTRL+, 在当前文档应用样式器 
 CTRL+F4  关闭当前文档 
 CRL +F5 依据历史数据开始/恢复调试 
 CTRL+T 打开 / 隐藏工具箱 
 CTRL+D 打开/隐藏导航器
 ALT+G  转至变量/函数声明 
 WINDOWS+T 在任务栏上的应用程序间导航,若我想打开
互联网浏览器(CHROME)并搜索问题 
 CTRL+F  打开查找搜索框
 CTRL+S  保存当前文档 
 CTRL + Directions  按方向在代码空白(字到字)间中跳转
 CTR + +   向前导航
 CTRL+ -  向后导航 
 CTRL+SHIFT+U  选定代码(一个单词)转换为大写 
 CTRL+U  选定代码(一个单词)转换为小写

MetaEditor 设置

重要的事情还有,最佳 MetaEditor 设置有助于更快编写代码。 我们来看看一些设置,我建议每个人都应该尝试一下。


这些选项框均应选中

  • Insert () and closing }]" — 这将有助于避免那些错误(意外的程序结束,不匹配的括号),这些错误也许难以捕捉,因为它们往往隐藏在多行代码之中。
  • Highlight matching brackets — 这会提醒您匹配的括号。
  • Highlight current line — 想要找到上次编码的位置,这可能会令人抓挠,故设置此选项帮助您一目了然地迅速定位到那里,否则您不得不不停地滚动代码,直至出现高亮显示的当前编辑行。
  • Clipboard history — 这是为了寻觅您的复制和粘贴历史记录,您能够复制不同的代码行,并轻松访问它们。

其它设置是根据您的视力,及眼睛与 PC 之间的距离选择合适的字体大小,不要设置太小以致您几乎看不清的字号。

您可以进入工具>选项翻看来查找更多设定,令您效率倍增。


09: 向谷歌学习

学习如何正确在谷歌上搜索,是一项节省时间的活动,可以加快您的编码速度。 您在编码时很可能会遇到诸多问题,您需要即刻找到解决方案,但知道在哪里可以找到解决方案依然不够,您还需要知道如何有效地搜索解决方案。

谷歌搜索足以令您快速获得问题的正确答案,对吗? 错误

我们来看一个示例,普通编码人员陷入从二进制文件中读取数组的泥潭,然后尝试谷歌搜索解决方案。

大多数人首先做的第一件事就是去谷歌搜索类似如何读取二进制文件中的数组之类的东西,这就是他们得到的

如何在谷歌搜索 MQL5

注意:结果总数超过 9800 万条。 

看到网络上充斥着垃圾和浪费时间的网站,如果您不小心,最终是浪费您的时间,严重的话甚至您的私人数据将被黑客窃取。 搜索关键字太模糊,无法准确获得我们需要的特定即时结果。 为了获得我们想要的结果,我们需要非常明确和具体的关键字。

对于那些希望深入了解这个主题的人,有太多的搜索提示,我建议观看这个简短的视频。 我打算只讲两个技巧。 

01: 搜索特定站点

每当您进行谷歌搜索时,其实没有比 MQL5.com 更好的地方来获得有关 MQL5 的解决方案了,将 MQL5.com 作为您希望谷歌为您搜索答案的站点。

在您的搜索关键字末尾添加 site:MQL5.com,这是搜索结果

来自 mql5 的搜索结果

这次只返回了 568 个结果,全部来自 MQL5.com(site: URL),命令谷歌只在指定站点中搜索。

02: 更加具体

如果您非常清楚自己想要什么,搜索 MQL5.com 网站其实仍然很模糊,因为它是一个大型网站;有一种我自己总在用的方式,但谷歌并不推荐它,不过它很有效,我一直在如此使用它;这里的关键是您必须清楚知道您希望 MQL5 的哪个板块优先处理您的结果,例如文献、论坛、代码库、等等。 您可能更喜欢以下结果:

  •  文献板块,如果您想深入了解某个主题。
  •  论坛,如果您想快速解决 
  •  代码库,如果您想查看其他人之前的编码。

按照这种格式搜索 MQl5 + 后跟板块 + 然后是搜索关键字,本例中的示例 

MQL5 forum how to read an array in a binary file,此处是结果

清晰但模糊的 MQL5 搜索

这种方式是具体的,但我们还没有命令谷歌特定站点(只有您当前所在的网站),最好的办法是添加 site:MQL5.com,最终搜索关键字现在是 forum how to read an array in a binary file site:MQL5.com,谷歌这次将返回 399 个结果。


结束语

这对于本文来说已经足够了,我仍在研究其它技巧,从而可提高您的编程速度,并提升您的生产力。 下一篇文章会有更多提示,因为它们本就有很多。 我建议每位程序员每天都要练习这些习惯和方法

感谢您的阅读,我期望在本文的讨论部分听到您的一些提示。

此致敬礼

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

DoEasy 函数库中的图形(第八十二部分):函数库对象重构和图形对象集合 DoEasy 函数库中的图形(第八十二部分):函数库对象重构和图形对象集合
在本文中,我将通过为每个对象分配唯一类型来改进所有库对象,并继续开发库图形对象集合类。
更好的程序员(第 03 部分):放弃做这 5 件事成为一名成功的 MQL5 程序员 更好的程序员(第 03 部分):放弃做这 5 件事成为一名成功的 MQL5 程序员
这是任何想要提高编程职业生涯的从业者必读文章。 本系列文章旨在尽最大可能令您成为最佳程序员,无论您有多少经验。 研讨的思路适用于 MQL5 编程萌新和专业人士。
MetaTrader 5 中的出价/要价(Bid/Ask)点差分析 MetaTrader 5 中的出价/要价(Bid/Ask)点差分析
一款能为您报告经纪商平台出价/要价(Bid/Ask)水平的指标。 现在我们可以利用 MT5 的即时报价数据来分析近期的历史真实平均买卖点差是多少。 您不需要查看当前点差,因为若您同时显示出价和要价指示线时,该值已出示。
针对交易的组合数学和概率论(第三部分):第一个数学模型 针对交易的组合数学和概率论(第三部分):第一个数学模型
早前所研讨主题的逻辑延续,即针对交易任务开发多功能数学模型。 在本文中,我将从头开始讲述与分形数学模型开发相关的整个过程。 这个模型应成为一个重要的构建模块,且其是多功能和通用的。 它将为我们遵循该思路深入开发奠定理论基础。