首页/学院/交易策略/编程知识/文章详细

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

漆天交易学院2021-06-09 10:42:26 556

我叫漆学军,我准备在汇外网上面发布《EA编程速成教程》连载文章,这是第二篇,看不明白的,有问题的,欢迎大家评论。


我们写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  // 箭头颜色,下单成功后,会在图表上面下单位置显示一个箭头,这里可指定箭头的颜色 
   );

下面我写了个下单的例子程序

//+------------------------------------------------------------------+
//|                                                   Test_EA_01.mq4 |
//|                                                             云开 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "云开"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

bool isgo=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(isgo)
     {
      //--- place market order to buy 1 lot
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      if(ticket<0)
        {
         Print("OrderSend failed with error #",GetLastError());
        }
      else
        {
         isgo=false;
         Print("OrderSend placed successfully");
        }
     }

  }
//+------------------------------------------------------------------+


将这个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的人可以随意设置。

//+------------------------------------------------------------------+
//|                                                   Test_EA_02.mq4 |
//|                                                             云开 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "云开"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input double lots=0.1; //交易手数

bool isgo=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(isgo)
     {
      int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,"My order",16384,0,clrGreen);
      if(ticket<0)
        {
         Print("OrderSend failed with error #",GetLastError());
        }
      else
        {
         isgo=false;
         Print("OrderSend placed successfully");
        }
     }

  }
//+------------------------------------------------------------------+


可以看到,在EA源码的前面,增加了一行:

input double lots=0.1; //交易手数

而后面的OrderSend函数的第三个参数,之前的数字1,换成了变量 lots。

意思就是交易手数取值为lots的数值。

lots变量前面的double限定lots为双精度类型,也就是允许使用带小数点的数据。

double最前面的input,指定这个变量为外部变量,可以在EA的属性里面修改(即使没有源码也可以修改)。



看看,为什么我们的变量是lots,但是在EA的输入参数里面显示的却是“交易手数”,因为我们在源码的第9行,指定了EA属性为严格模式。

#property strict

在严格模式下 input 后面的变量将会显示为本行后面的注释“//”标记后面的字符。


标签:

随机快审展示
  • 快审 12.3黄金呈结束斜纹浪,底部1756可期!激进1760可介入中长线
  • 快审 1.6美联储加息提早,黄金回弹1810左右持续空!原油随黄金上升,看涨不追多,78.5买跌!
  • 快审 1.15黄金1830以下无脑看跌,空单获利中!
  • 快审 12.13黄金偏多震荡支撑上方低多,原油注意71.5支撑多
  • 快审 4.9下周黄金行情分析,黄金行情价格交易操作策略
  • 快审 1.13黄金先踩后涨20点利润预定!跟?
  • 快审 特斯拉一季度汽车产能 销售率 净盈利率报告数据
  • 快审 李潇翰4.1黄金大非农就业报告如何提早布局,作战方案
  • 快审 4.4黄金现货窄幅震荡结构选择方向、周初黄金行情分析
  • 快审 英镑深陷短时间震荡 趋势临时依旧走不出来!
  • 快审 8.27原油还会跌吗?今日原油黄金实时行情策略分析及交易参考
  • 快审 8.20外汇原油黄金最新行情分析操作策略,黄金连续看跌吗?
  • 快审 黄金XAUUSD 1920左右买涨
  • 快审 加息预计被提早消化,黄金最新行情分析指导推荐
  • 快审 4.11战事最近无终结预计,原油黄金持续看回弹!
  • 快审 3.31原油黄金技术面及操作策略!
  • 快审 黄金行情区间内反复,今日金银交易参考
  • 快审 12.11黄金操作策略及下周行情趋势分析
  • 快审 杨鑫坤10.20黄金行情分析,黄金美盘行情策略及交易参考
  • 快审 4.2黄金下周该如何布局?最新行情前景分析!
  • 快审 俄乌协商持续,黄金价格短线仍存下挫空间,黄金最新行情分析