【漆学军】EA编程速成教程(2)第一个程序:下单

| 发表于 2021-6-10 15:53:38 | 显示全部楼层 |复制链接
最后由 studyea 于 2021-6-10 15:59 编辑

我们写EA的目的就是为了自动下单做交易的,所以本课我们就来好好学习下MQL4语言中下单函数OrderSend的使用。

2.1   OrderSend
字面意思,订单发送,这个函数的功能就是用来向交易服务器发送一个下单指令,返回值为下单成功后的单子的订单编号。
int  OrderSend(
   string   symbol,              // 交易品种,比如“EURUSD”,"XAUUSD"
   int      cmd,                    //  订单类型,比如,买入为OP_BUY,卖出为OP_SELL,还有四种挂单类型,一共6个订单类型
   double   volume,           // 交易手数
   double   price,               // 开仓价格或挂单价格
   int      slippage,             // 允许滑点的点数
   double   stoploss,            // 止损价
   double   takeprofit,          // 止盈价
   string   comment=NULL,  // 订单注释,一般用来标注EA作者的QQ号微信号或者手机号码
   int      magic=0,               // 订单魔术号,给本EA下的单子标记一个数字记号
   datetime expiration=0,    // 挂单到期时间,下的挂单可以设置一个时间,过了这个时间,挂单如果没有成交,就自动撤销
   color    arrow_color=clrNONE  // 箭头颜色,下单成功后,会在图表上面下单位置显示一个箭头,这里可指定箭头的颜色
   );

下面我写了个下单的例子程序
  1. //+------------------------------------------------------------------+
  2. //|                                                   Test_EA_01.mq4 |
  3. //|                                                             云开 |
  4. //|                                             https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "云开"
  7. #property link      "https://www.mql5.com"
  8. #property version   "1.00"
  9. #property strict
  10. bool isgo=true;
  11. //+------------------------------------------------------------------+
  12. //| Expert initialization function                                   |
  13. //+------------------------------------------------------------------+
  14. int OnInit()
  15.   {
  16. //---
  17. //---
  18.    return(INIT_SUCCEEDED);
  19.   }
  20. //+------------------------------------------------------------------+
  21. //| Expert deinitialization function                                 |
  22. //+------------------------------------------------------------------+
  23. void OnDeinit(const int reason)
  24.   {
  25. //---
  26.   }
  27. //+------------------------------------------------------------------+
  28. //| Expert tick function                                             |
  29. //+------------------------------------------------------------------+
  30. void OnTick()
  31.   {
  32. //---
  33.    if(isgo)
  34.      {
  35.       //--- place market order to buy 1 lot
  36.       int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
  37.       if(ticket<0)
  38.         {
  39.          Print("OrderSend failed with error #",GetLastError());
  40.         }
  41.       else
  42.         {
  43.          isgo=false;
  44.          Print("OrderSend placed successfully");
  45.         }
  46.      }
  47.   }
  48. //+------------------------------------------------------------------+
复制代码

将这个EA加载到任何一张k线图上去,当价格跳动的时候,我们可以看到,EA下了一张多单。
而价格再次跳动的时候,EA并没有一直下单,是什么原因呢?
观察下源码,你会看到我加了一个布尔型变量isgo,这个变量的初始值为true,下单成功后,就赋值为false,而当isgo为false的时候,下单函数不执行,所以,这个isgo就控制了程序的流程不再进入到if语句里面。

如果要做空呢?
如果要挂单呢?
我们可以尝试着去修改下单函数:
int ticket=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"My order",16384,0,clrRed);
int ticket=OrderSend(Symbol(),OP_BUYLIMIT,1,Ask+300*Point,3,0,0,"My order",16384,0,clrGreen);
2.2  将手数改为外部变量
一般来说,交易手数都不会直接写死在源码里面,而是拿出来,让使用EA的人可以随意设置。
  1. //+------------------------------------------------------------------+
  2. //|                                                   Test_EA_02.mq4 |
  3. //|                                                             云开 |
  4. //|                                             https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "云开"
  7. #property link      "https://www.mql5.com"
  8. #property version   "1.00"
  9. #property strict
  10. input double lots=0.1; //交易手数
  11. bool isgo=true;
  12. //+------------------------------------------------------------------+
  13. //| Expert initialization function                                   |
  14. //+------------------------------------------------------------------+
  15. int OnInit()
  16.   {
  17. //---
  18. //---
  19.    return(INIT_SUCCEEDED);
  20.   }
  21. //+------------------------------------------------------------------+
  22. //| Expert deinitialization function                                 |
  23. //+------------------------------------------------------------------+
  24. void OnDeinit(const int reason)
  25.   {
  26. //---
  27.   }
  28. //+------------------------------------------------------------------+
  29. //| Expert tick function                                             |
  30. //+------------------------------------------------------------------+
  31. void OnTick()
  32.   {
  33. //---
  34.    if(isgo)
  35.      {
  36.       int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,"My order",16384,0,clrGreen);
  37.       if(ticket<0)
  38.         {
  39.          Print("OrderSend failed with error #",GetLastError());
  40.         }
  41.       else
  42.         {
  43.          isgo=false;
  44.          Print("OrderSend placed successfully");
  45.         }
  46.      }
  47.   }
  48. //+------------------------------------------------------------------+
复制代码
可以看到,在EA源码的前面,增加了一行:

input double lots=0.1; //交易手数
而后面的OrderSend函数的第三个参数,之前的数字1,换成了变量 lots。
意思就是交易手数取值为lots的数值。
lots变量前面的double限定lots为双精度类型,也就是允许使用带小数点的数据。
double最前面的input,指定这个变量为外部变量,可以在EA的属性里面修改(即使没有源码也可以修改)。

b0a6f852036c1dfcf3c6575261ca3ea4.png

看看,为什么我们的变量是lots,但是在EA的输入参数里面显示的却是“交易手数”,因为我们在源码的第9行,指定了EA属性为严格模式。
#property strict
在严格模式下 input 后面的变量将会显示为本行后面的注释“//”标记后面的字符。
举报

评论 使用道具

精彩评论3

latage
C
| 发表于 5 天前 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

daerbushen
DDD
| 发表于 5 天前 | 显示全部楼层
感謝分享
举报

点赞 评论 使用道具

tianping
DDD
| 发表于 5 天前 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

天眼云VPS