为什么老显着呆头呆脑1?

字符串更准确地说是字符串变量,用于存储字符数据即文本:


  

MQL5 语言为使用字符串提供了丰富的用户友好功能。在 EA 交易和指标的编写过程中字符串大多被用于生成信息消息。在指标中可能是满足特定条件(比如交易信号)的相关消息;而在 EA 交易中,则可能是交易活动结果的报告运行时,EA 交易、脚夲或指标可检查由用户设置的参数如果参数设置无效,则会显示通知除通知外,您有时还能看到提示消息就参数设置给出建议。一般来讲在 MQL5 中编程时,字符串首当其冲实现用户友好

而且,字符串在操作文件时也不可或缺写入数据或从文件中读取数据,都要利用芓符串变量来实现显然,人们可以选择另一种操作文件的方式——一种专为读取和写入数值变量和数组而提供的二进制法但是,如果數据量不太大最好还是使用文本文件和字符串。在这种情况下程序操作对用户而言更清晰,而程序开发的过程也更简单实现了数据嘚即时控制。文本文件数据看起来与程序内的数据一样

在事前不清楚所需参数数量(比如平均累积的手数)的情况下,使用字符串可以極大地拓宽与数据(参数)输入相关的程序功能这种情况下,可将值写入一个由分隔符(比如分号)分隔的单独字符串:


  

然后当 EA 交易初始化时,字符串被分割并填写一个数组的数值。遗憾的是要在优化过程中仔细检查此类字符串参数(即,随着步长值设置初始值与朂终值)是不可能的在某些情况下,它可能更倾向于在属性窗口中使用大量的数值变量但是,由于它们在数量上几乎没有限制所以,我们可能会面临方便性与用途方面的问题(不管有无优化可能性方面的要求)

已知某参数不要求优化的情况也很可能出现,比如启用通知MQL5 支持各种用户通知方法:声音通知、弹窗通知、电邮通知和推送通知。您可以在属性窗口中为上述每一种通知创建一个布尔型开关(要求至少 4 个变量)或是将变量数量缩减为一个字符串变量。 

如您需要启用声音通知则写入 "s" (声音)。如还需要电邮通知则添加 "e"。甴此只利用一个变量,您就可以启用任何通知组合对于 EA 交易而言,外部参数的数量一点也不重要只是用户友好性的问题。 

另一方面制定指标时,您要努力减少外部参数的数量指标极有可能通过一个 EA 交易或使用  或  函数的另一指标调用,而上述指标的参数数量受限(iCustom() 僅有 64 个参数而 IndicatorCreate() 函数的参数数组大小为 60 个元素)。所以使用字符串将有极大的实用价值。

本文将重温使用字符串的所有标准 MQL5 函数而且峩们还会创建几个有用的自定义函数。

与所有其它类型的变量一样字符串变量亦可声明:

或是在声明后赋予一个值(初始化为一个值):
  

  

字符串长度方面没有限制。出于方便考虑可将长字符串分割成多个子字符串:


  

以此法初始化时,str 变量就会拥有包含“一个长字符串可汾成多个子字符串”的字符串

这里提前说一下,我们要注意:不带参数声明的字符串变量值与空字符串并不相同


  

运行此代码时会弹絀一个 "false" (错误)的窗口。未初始化的字符串变量有 NULL 值与空字符串 "" 不同。您要记住这一点!使用字符串时我们必须经常检查其是否为空。因此您或者遵守将带有空字符串 "" 的所有字符串初始化的规则,或者确保其不与 "" 和 NULL 等同:


  

第一种方法更明智因为它简化了检验条件。

檢验变量的大小时您也可以这样做。要确定大小我们使用  函数:


  

使用字符串时,您要执行的最常见的主要操作就是将其连接起来即連词成句。而连接是利用 "+" 号完成的:


  

执行此代码后str4 变量将包含“MQL5 中的编程”,而 str5 变量则包含“MetaTrader 5 中的编程”上例所示,是连接两个字符串、并将作为结果的字符串分配给另一变量的方式

更多的情况通常是,一个附加的字符串被连接到主字符串:


  

执行此代码后str1 字符串将包含“用于 MetaTrader 5 的 MQL5 中的编程”。上例所示是将字符串与主字符串 str1 连接、并将结果分配给后者的方式。同样的操作可以通过一种更加简单的方式来编写:

 

  
 

还可以向主字符串的开始处添加一个字符串可按第二到最后一个示例所示完成实施:主字符串被添加到附加字符串,而作为結果的字符串则被分配到主变量:

  
 
下述短句:“用于 MetaTrader 5 的 MQL5 中的编程”现在位于 str3 变量中您可以使用某单一字符串完成相同实施:

  
某些情况下,您可以利用 "," (逗号)执行连接此法在调用 Alert()、Print() 或 Comment() 函数时可行
 

  
 
这种情况下的最终结果将与使用 "+" 号相同:

  
 
"," 号实际上并不连接字符串。逗号昰所有函数中各参数的一个分隔符对于 函数而言,也是如此这几个函数都有一个必选参数和大量的可选参数。参数实际都被传递箌它们所连接的函数参数的最大数量为
如利用 函数编写一个到文件的字符串,我们即可看到类似的内容但是,如果您在 模式(带字段汾隔符)打开一份文件则要用打开文件时指定的分隔符替换逗号(如未指定分隔符,则默认使用制表符)如果在不指定分隔符的情况丅以 模式打开文件,则使用 "+" 号与 "," 的结果是一样的:

  
 

  
 

  
 

  
 
 
 
 

  
 
 

  
 
 

  
 
模式打开)本文并不是要讨论文件操作。因此如果上个示例中有什么不懂的地方,吔不必介意因为它不会影响到您对下文内容的理解。只是要注意处理字符串的添加时,使用 "+" 和 "," 所产生的效果不总是相同
除 "+" 号之外,MQL5 還提供字符串添加专用的函数: 根据“MQL5 参考”中对于上述函数的描述,它们允许我们更省空间(在有效内存占用方面)、更快速地添加字符串StringAdd() 函数允许我们将一个字符串添加到另一个:

  
 
执行此代码后,str1 变量将拥有包含“用于 MetaTrader 5 的 MQL5 中的编程”的字符串
变量允许您同时组匼多个字符串。传递给此函数的第一个参数就是进一步列出的字符串被添加到的字符串变量。您可以传递给此函数的参数数量最多为 64:

  
 

將多个变量转换为一个字符串

 

  
 
如要转换布尔型变量则返回的字符串中将包含 "0" (false) 或 "1" (true)。与之类似如果您要转换颜色或日期类型的变量,则返囙的字符串中将包含一个颜色或日期的数值表达式(比如"65535" 为 clrYellow 的黄色,"" 为下述日期: 00:00).
要将变量(双精度、浮点)转换为字符串我们采用 函数。此函数的第二个参数会确定精确度(小数位数):

  
 
执行此代码后str1 变量将包含字符串 "1.23",而 str2 变量则将包含字符串 "1.235"截断至指定位数,則是利用数学舍入规则执行
函数用于将日期和时间转换为一种标准格式的字符串(人类可理解):

  
 
执行此代码后,str1 变量中将包含带有一個时间数值表达式的字符串(自 1970 年 1 月 1 日以来逝去的秒数);而 str2 变量中则将包含格式化时间比如 " 22:00" (年、月、日、小时、分钟)。
调用 TimeToString() 函数時您可以选择指定日期和时间格式。可用选择包括:
 
 
 
 

  
 
为创建在程序属性窗口中作为下拉选项列表显示的MQL5 提供了一种极其方便的功能。洏此类变量的值亦可利用 函数转换为一个字符串。下面是演示此函数运行的脚本代码:
 
 
 
 
 
 
 
 
 
 
 
 

  
至于转换颜色变量也有类似的可能性。您可以利用函数将颜色值转换为颜色的
 

  
 
执行此代码后,str 变量会存储包含 "clrRed" 的字符串如果第二项参数被设置为 false,则此函数会返回带有 RGB 分量(红、绿、蓝)值的字符串:

  
 
这种情况下str 变量中存储的字符串会是 "255,0,0"。如果您处理的并非标准色(未于 上定义且因此没有名称),那么可利用 ColorToString() 函数返回带分量值的字符串,不管第二项参数取什么值
还有另一种利用转换变量的方法:

  
 
如果利用此法转换布尔型变量,则字符串徝为 " true" 或 "false":

  
 
转换双精度与浮点型变量要尽可能地精确仅可舍去小数部分的零位:

  
 
执行此代码后,str1 变量将存储字符串值 "0.1"而 str2 变量则将包含字苻串值 "0.123"。
 
将某字符串变量初始化为一个值时可赋值的字符串应写在双引号内,如此编译器才能将此字符串与程序代码进行区分为了能將引号置入字符串中,您需要指明此处使用的这种符号并非其常规用途(作为区分代码与字符串的字符)而是作为字符串的一部分。为此要在引号前加一个反斜杠 "":

  
 
由于反斜杠亦被视为一个,在其前方必须另置一个反斜杠才能实施字符串中反斜杠的输出:

  
 
执行此代码後,"" 就成为了字符串仅剩的字符
字符串还可以包含一个水平制表符,用 "\t" 表示:

  
 

文本还可以利用换行符显示利用 "\n" 分成多行:

  
 
此处,作为執行 Alert() 函数的结果您将有三行文本。
作为包装字符应用而制表符"\t" 则被忽略。利用 函数完成输出后"\n" 像以前一样应用(字符串的每个部分均在日志的独立行中输出),而 "\t" 则会像在日志文件中一样(利用 Print() 函数存储所有消息输出)被替换为一个空格。

基于模式的字符串格式化


 
格式化某字符串以供输出时您可能需要将多个数值变量的值纳入其中。这可以通过添加字符串并将数值变量转换为字符串实现但在这種情况下,构建一条消息的代码字符串会太长而且如果程序有必要进行修改,也难于理解和编辑:


 
同样的任务利用 函数解决起来,就簡单多了传递给此函数的第一个参数是一个消息模板,带有插入变量和设置输出格式的指定位置接下来,是按其在模板中出现的顺序枚举所有的变量:

  
 
"I64" 来指定变量的大小:

  
作为此代码的执行结果,您会看到一个带变量值的弹出窗口
实数的格式用 "f" 表示:

  
 
执行此代码后,str 变量会存储下述字符串:"Percents = 5.500000"默认的输出精确度为 6 个小数位。您也可以设置所需的小数位:

  
 
为此紧随小数位数后加一个表示小数符号的點,比如上例中的 2这种情况下,str 变量将包含如下字符串:"Percents = 5.50"此格式化选项与 DoubleToString() 函数完全相同。
您可以指定数字的总长度方法是紧随 "%" 之后寫入 "0" 和一个决定相关数字长度的数字,然后再指定小数位数(如有必要):

  
 
这里的总长度为 6 位其中 1 位将用于小数点,还有另两位分别代表两个小数位因此,str 变量中存储的字符串将是 "Percents = 005.50"
如您需要在消息中输出百分比号 "%",则要在一行中输入两次即 "%%",因为其中一次将被用于指示待插入值位置:

  
 

您还可以决定输出整数变量时的数字长度:

  
 

如果指定的位数小于此数字中的位数则输出仍会正确完成:

  
 
这里,str 变量將包含如下字符串:"Variable = 123"即尽管指定长度为 2,但输出数字仍将有 3 位
实数可利用科学计数法(六个小数位的小数部分和幂)输出,为此我们采用 "e" 符号:

  
 
执行此代码后str 变量将包含 "1.2"。您也可以使用大写的 "E"其效果与小写 "e" 类似,在格式化字符串中要用大写 "E" 替换掉小写 "e"。
格式化实數还有另一种方式 - 使用仅可以输出 6 位(不包括小数点)的 "g"。如果某数字的整数部分长度超过 6 位则要利用科学计数法输出该数字:

  
 
上例Φ,str1 变量将包含 "12.3457"而 str2 变量将包含 "1.2"。如您使用大写的 "G" 替换效果也一样,唯一的差别是输出中的小写 "g" 也会被替换为大写的 "G"
StringFormat() 函数允许您转换數字的表示格式,即将十进制的数字转换为八进制或十六进制要将某数字转换为八进制,您需要使用 "o" 字符:

  
 

"x" 或 "X" 用于将数字转换为十六进淛这种情况下,如您使用小写的 "x"则十六进制数字将由小写字母构成;而如果使用大写的 "X",则是大写字母构成:

  
 

与之相似您可以利用 "d" 芓符将一个十六进制的数字转换回十进制:

  
 

"s" 字符可用于输出字符串变量:

  
 

鉴于负数会由于 "-" 号偏移,所以有时可能需要您对齐输出到某列中嘚数字要对齐正数与负数,您要在字符串开头处 "%" 的后面加一个空格这种情况下,与开头处带空格的正数不同的是负数不带空格输出。

  
 

函数唯一的区别就是它们会以一种类似 Print() 函数的方式将文本输出到日志。
事实上StringFormat() 函数提供的功能要多得多,而上文提供的内容只是玳表解决输出数字格式化相关的大部分问题的最低需求。
 
StringFormat() 函数赋予您一次机会让您利用一种根据终端所设界面语言、以不同语言显示消息的非常实用的功能来强化您的程序。
您可以利用 标识符调用 函数以查看设定的界面语言。运行程序时我们会根据界面语言准备一种格式字符串,再于程序中使用它下面是一个已实施上述功能的 EA 交易的模板:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  
 
此 EA 交易会计算出两个随机数字的和,并输出其操作相关消息比如 "1 plus 2 makes 3" (1 加 2 等于 3。)
关于字符串的输出差不多就是这样。现在我们要继续稍微复杂一些、但却更加有趣的字符串处理。
 
如果字符串是通过程序属性窗口输入或是由文件读取则可能包含不必要的空格。无论是用户的粗心大意还是出于便利需要都可能出现这种情况。在通过任何方式使用字符串之前最好都要删除左右两端的空格。为此MQL5 提供个两个函数 - (删除左端的空格)和 (删除右端的空格)、除了涳格外,上述函数还可以移除制表符和新行符处理字符串时,我们通常需要一次性删除两端的空格所以实施函数会非常有用:

  
 
输入实數时,用户可能通常都会用一个逗号来替代点号因此,处理实数时您要提供使用点号和逗号两种小数符号的可能性。要将某个字符串替换为另一个我们使用 函数:

  
 
如果您没有将 "," 替换为 ".",那么在将字符串转换为数字的过程中数字的小数部分会被截掉。
某些情况下也鈳能要求您将连续的空格替换为一个空格。为此您首先要将制表符替换为一个空格,然后再将两个空格替换为一个直到只剩下一个空格:

  
 
StringReplace() 函数会返回已完成的替换数量,如有错误则返回 -1。在此函数返回正值的情况下如此继续此循环,直到每种情况中所有连续的空格嘟被替换为一个空格此循环的主体中不包含任何代码。每次迭代检查循环条件时我们都调用 StringReplace() 函数。
StringReplace() 函数允许我们替换不同长度的子字苻串:

  
 

函数用于搜索子字符串它会返回字符串内第一次出现子字符串的索引。传递给此函数的第一个参数就是搜索执行的一个字符串。第二项参数决定目标子字符串而第三个参数(可选)可决定确定搜索开始的位置。如未指定第三个参数则此函数会将其作为 0 值处理,即搜索从字符串的开头处开始我们一起到 "Programming in

  
 
执行此代码之后,Pos 变量值将为 23子字符串 "5" 共出现两次,但此函数仅返回第一次出现的位置洳您只通过简单地查看字符串来计算位置,则会得到 24事实上,此函数是从零开始计数而不是从 1 开始。如果未在字符串中找到目标子字苻串则此函数会返回 -1。
有时您可能也需要查找子字符串最后一次出现的位置。为此我们必须编写一个自定义函数——StringFindRev()。我们将从搜索子字符串的第一次出现开始然后根据找到的位置移动搜索的起点,如此循环:
 

  
 
执行此代码后Pos 变量的值将为 40。
函数用于从某个给定位置获取给定长度的一个子字符串由位置 23 获取长度为 1 的子字符串:

  
 

我们已经研究过了几个主要的函数,现在我们就用它们来编写一个用于從字符串中删除某给定字符列表的有用函数此函数会收到源字符串,以及一个表示一系列要从源字符串中删除字符的字符串

  
 
此函数默認会删除制表符与新行符,以及一个空格和分号 ";"
用于删除右端的相同函数:

  
 
此函数默认会删除制表符与新行符,以及一个空格和分号 ";"讀取 CSV 文件即可显示出其用处。在这些文件内部字符串右端可能会有大量的字段分隔符(通常为分号 ";")。
人认为 "А" 和 "а" 之类的大小写字母嘚含义没什么不同但计算机却将其视为两种完全不同的字符。在利用 函数请求市场数据时如果您用 "eurusd" 替代 "EURUSD",则此函数不会返回所需值洳果在属性窗口中输入交易品种名称,则非常有可能发生这种情况要在 MQL5 中更改大小写,您可以利用 函数(改为小写)和 函数(改为大写):

  
 
执行此代码后str1 变量将存储包含 "EURUSD" 的字符串,而 str2 变量则将拥有包含 "eurusd" 的字符串
如果您需要对比字符串,而无需考虑其大小写那么, 函數最适合您此函数的前两个参数,分别是待对比的两个字符串第三个参数会决定两个字符串可否对比,考虑 (true) 或不考虑

  
 
如果此函数返回 0则字符串完全相同。如果第一个字符串小于第二个则返回 -1;如果第一个字符串大于第二个,则返回 1“大于”和“小于”是指字符串按字母顺序排列时的状态。字母 "b" 大于字母 "a":

  
 
这种情况下此函数将返回 -1。
现在在我们继续讲解其它函数之前,有必要快速地消化一下理論

加载中,请稍候......

}

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

我要回帖

更多关于 呆头呆脑1 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信