路路发智能交易研发中心

 找回密码
 立即注册
查看: 2704|回复: 0

MT4智能交易编程教程-传递函数

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

积分
6521
帖子
2771
主题
2761
QQ
发表于 2014-3-26 21:56:28 | 显示全部楼层 |阅读模式
MT4智能交易编程教程-传递函数
有两类函数,计算机语言可以用其传送自变量到子程序(函数)。第一类函数是通过值发送参数。这个函数将自变量值复制到形式函数参数。因此,函数中这个参数的任何改变都不会对自变量的相应调用产生影响。
  1. //+------------------------------------------------------------------+
  2. //| 通过值传递参数                                                     |
  3. //+------------------------------------------------------------------+
  4. double FirstMethod(int i,int j)
  5.   {
  6.    double res;
  7. //---
  8.    i*=2;
  9.    j/=2;
  10.    res=i+j;
  11. //---
  12.    return(res);
  13.   }
  14. //+------------------------------------------------------------------+
  15. //| 脚本程序启动函数                                                   |
  16. //+------------------------------------------------------------------+
  17. void OnStart()
  18.   {
  19. //---
  20.    int a=14,b=8;
  21.    Print("a and b before call:",a," ",b);
  22.    double d=FirstMethod(a,b);
  23.    Print("a and b after call:",a," ",b);
  24.   }
  25. //--- 执行脚本结果
  26. //  调用前a 和 b : 14 8
  27. //  调用后a 和 b : 14 8
复制代码
第二类函数是通过引用传送。在这种情况下,参数引用(不是它的值)被传送到函数参数。函数内,被用来连接调用指定的实际参数。这意味着参数的改变将会影响用来调用函数的自变量。
  1. //+------------------------------------------------------------------+
  2. //| 通过引用传递参数                                                   |
  3. //+------------------------------------------------------------------+
  4. double SecondMethod(int &i,int &j)
  5.   {
  6.    double res;
  7. //---
  8.    i*=2;
  9.    j/=2;
  10.    res=i+j;
  11. //---
  12.    return(res);
  13.   }
  14. //+------------------------------------------------------------------+
  15. //| 脚本程序启动函数                                                   |
  16. //+------------------------------------------------------------------+
  17. void OnStart()
  18.   {
  19. //---
  20.    int a=14,b=8;
  21.    Print("a and b before call:",a," ",b);
  22.    double d=SecondMethod(a,b);
  23.    Print("a and b after call:",a," ",b);
  24.   }
  25. //+------------------------------------------------------------------+
  26. //--- 执行脚本结果
  27. //  调用前a 和 b: 14 8
  28. //  调用后a 和 b: 28 4

复制代码
MQL5使用这两种函数,有一个例外就是:数组和结构类型变量(类的对象)总是通过引用传送。为了在真实参数中排除改变(函数调用传送的自变量)使用常数 访问说明符。若尝试改变说明常量说明符的变量,编译程序会生成错误。注解注意用倒序传送参数到函数,例如,首先是最近的函数被计算和传送,然后倒数第二。最后计算和传送的参数是括号后的第一个。示例:
  1. void OnStart()
  2.   {
  3. //---
  4.    int a[]={0,1,2};
  5.    int i=0;

  6.    func(a[i],a[i++],"First call (i = "+string(i)+")");
  7.    func(a[i++],a[i],"Second call (i = "+string(i)+")");
  8. // 结果:
  9. // 首先调用 (i = 0) : par1 = 1     par2 = 0
  10. // 第二调用 (i = 1) : par1 = 1     par2 = 1

  11.   }
  12. //+------------------------------------------------------------------+
  13. //|                                                                  |
  14. //+------------------------------------------------------------------+
  15. void func(int par1,int par2,string comment)
  16.   {
  17.    Print(comment,": par1 = ",par1,"   
复制代码
首先上面的示例中先调用变量i参与合并字符串。
  1. "First call (i = "+string(i)+")"
复制代码

这里值不可更改。变量 i 加入a[i++]数组的运算,例如加入数组元素i,变量i就会增加。之后,仅计算变量 i 改变值第一个参数。第二步,计算所有三个参数,使用调用函数第一步计算的和i的同值,仅计算第一参数后变量i会再次更改。


外汇智能交易,成就财富梦想!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


MT4编程培训|EA定制开发|QQ在线咨询|路路发智能交易研发中心

GMT+8, 2024-12-22 17:27 , Processed in 0.153017 second(s), 26 queries .

© 2009-2022 520EA.com EA668.com

快速回复 返回顶部 返回列表