MQL4课程-交易函数下单及挂单

交易函数也算是MT4平台的独特函数了,也是最关键的一类,我们写程序最终还是要落到交易上的,那么下单和挂单的函数就必不可少。

1下单

图片[1]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

打开帮助文件,我们可以看到交易函数还是有蛮多的,这节课我们先不讲这么多,我们完成一个目标就可以了,那就是做好开单和挂单。

开单和挂单我们都采用OrderSend()函数来执行,首先我们试一下在当前品种开一个市价多单,代码如下:

void OnStart()
  {
      double lot=0.01;
      int huadian=10;
      int ticket= OrderSend (Symbol(),OP_BUY,lot, 
MarketInfo(Symbol(),MODE_ASK),huadian,0,0,"MQL4 Lesson",1000,
0, clrAliceBlue);
  }


可以看到OrderSend()函数是个比较复杂的参数,它有十一个参数,给大家讲解一下这些参数都是什么意思。

第一个参数,是品种的名称;

第二个参数是开单的方式,如果是市价单,那么用OP_BUY或者OP_SELL,如果是突破单则用OP_BUYSTOP或是OP_SELLSTOP,如果是限价单则用OP_BUYLIMIT或者OP_SELLLIMIT;

第三个参数是开仓的手数;

第四个参数是开仓的价位,如果开市价多单,那么开仓价为买入价就可以了;第五个参数是滑点,如果滑点超过了这个数值,那么订单是不会成交的;

第六、第七个参数分别是止损、止盈价位,如果是0则表示不设置止损止盈;

第八个参数是订单的注释,可以备注开单的原因等等;

第九个参数是魔术号码,这个号码非常重要,一般来说EA是通过这个号码来识别它开的订单的,所以一定注意不同的EA一定要用不同的魔术号码来管理,否则会造成管理的混乱而产生亏损;

第十个参数是持续的时间,一般不怎么用,所以设置0就可以了;

最后一个参数是颜色,这个指的是开单后在图标上显示开单位置的那个箭头的颜色。

我们运行一下脚本,如下图,可以看到我们成功地开出了一个0.01手欧美的多单,备注是”MQL4 Lesson”,没什么毛病。

图片[2]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

2分批下单
在我们做下单的程序时,我们肯定也会想到一些问题,比如说单子手数很小,小于平台的最小手数限制,或者反之单子大于了平台最大单子的限制怎么办?

对于手数很小的单子我们没有办法,只能给一个输出提示一下,毕竟如果强行用最小手数的话有可能会出问题,因为有些品种的最小手数是1手,盈亏会很大,所以不建议当手数小于最小手数时采用最小手数下单。

那么当手数大于最大手数时,我们就得把这个单子拆成几个单子来下了,其实也不难,采用for循环就可以轻松做到,下面是一个例子:

void OnStart()
  {
      string sym= Symbol();
      int huadian=10;
      double lot=0.001;
      double maxlot= MarketInfo(Symbol(),MODE_MAXLOT);
      double minlot= MarketInfo(Symbol(),MODE_MINLOT);
      double amount=0;
      double lot_last=0;
      int i;
      int ticket=0;
      if (lot<minlot)
      {
       	Print("手数太小");
			return;
      }
      else if (lot>maxlot)
      {
			amount= MathCeil(lot/maxlot);
			lot_last=lot-(amount-1)*maxlot;
			for(i=(int)amount;i>0;i--)
			{
      			if (i!=1)
      			{
ticket= OrderSend (sym,OP_BUY, maxlot, 
MarketInfo(Symbol(),MODE_ASK),huadian, 0,0,
"MQL4  Lesson",1000,0, clrAliceBlue);
      			}
 
 
      			else
      			{
ticket= OrderSend (sym,OP_BUY, lot_last, 
MarketInfo(Symbol(),MODE_ASK),huadian, 0,0,
"MQL4 Lesson",1000,0, clrAliceBlue);
      			}
}
      }
      else
      {
      		ticket= OrderSend (Symbol(),OP_BUY,lot, 
MarketInfo(Symbol(),MODE_ASK),huadian, 0, 0,
"MQL4 Lesson",1000,0, clrAliceBlue);
      }
  }

上例中,我们把这个品种的最大手数赋给了maxlot,把最小手数赋给了minlot,如果开单的手数在maxlot和minlot之间,那么我就直接开单。

如果开单的手数比minlot小,那么我们就输出“手数太小”,不开单。

如果开单的手数比maxlot还要大,那么我们就求出这个大订单需要拆解成多少个小订单,并把订单数量存放在amount这个变量中,上例中的MathCeil()函数是向上取整的意思。然后我们计算出如果按最大手数来开单,最后一单应该是多少手,比如说我要开70手而最大订单数是50手,那么我应该开50手+20手,最后一单的手数是20手。这些都做好后用for循环开单就行了。

我们开一个0.001手试一下,运行结果如下:

图片[3]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

可以看到程序输出了“手数太小”。接下来我们调整手数,将lot调整为0.01,可以看到我们开出了0.01手的订单。

图片[4]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

最后我们试一下开1200手订单:

图片[5]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

可以看到程序自动将1200手订单拆成了2个500手的单子和1个200手的单子,运行结果没有问题。

在以后的模块编写中,这一部分内容将非常重要。

3挂单
挂单其实和下单区别不是太大,不同之处在于单子成交的价格和挂单的类别。比如说我现在想在欧元美元1h级别的上一根K线最高价以上10个点挂一个0.1手的多单,代码如下:

void OnStart()
  {
      double lot=0.1;
      int huadian=10;
      double Price= iHigh("EURUSD",60, 1)+ 10 *(MarketInfo("EURUSD", 
		MODE_POINT)* 10);
      int ticket= OrderSend ("EURUSD",OP_BUYSTOP,lot, 
		Price,huadian, 0, 0,"MQL4 Lesson",1000,0, clrAliceBlue);
  }


可以看到和开单的例子相比,挂单仅仅多了一个挂单的价格Price,然后把OP_BUY改成了OP_BUYSTOP,其他都没变,所以学会了开单那么挂单也是一样的。

图片[6]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

运行以上代码,我们顺利完成了挂单的任务。

4新闻交易双向挂单脚本
有了以上的挂单的基础,我们就可以搞一点点黑科技出来了,比如说写一个在重大消息公布之前一键双向挂单的脚本,这个脚本要能够实现快速地挂单,并设置好止损止盈。

如果这个任务交给一个人去完成,那是非常困难的事情,考验手速,没玩过几年星际争霸都搞不出来,而且在数据公布前有的时候会比较紧张,一紧张就容易挂错。这项黑科技便可以替我们完成这一系列复杂的操作。

我们在市价以上5个点挂一个0.1手突破多单,止盈为20个点,止损为5个点,然后在市价以下5个点挂一个0.1手突破空单,同样止盈20个点,止损5个点。代码如下:

void OnStart()
  {
double lot=0.1;
int huadian=10;
int tp=20;
int sl=5;
double Price_BUY= MarketInfo(Symbol(), MODE_ASK)+ 
5 *(MarketInfo(Symbol(), MODE_POINT)* 10);
double tp_BUY= Price_BUY+tp*(MarketInfo(Symbol(),
MODE_POINT)* 10);
double sl_BUY= Price_BUY-sl*(MarketInfo(Symbol(),
MODE_POINT)* 10);
int ticket= OrderSend (Symbol(),OP_BUYSTOP,lot, Price_BUY,huadian, sl_BUY, tp_BUY,"MQL4 Lesson",1000,0, clrAliceBlue);
 
double Price_SELL= MarketInfo(Symbol(), MODE_BID)-
5 *(MarketInfo(Symbol(), MODE_POINT)* 10);
double tp_SELL= Price_SELL-tp*(MarketInfo(Symbol(),
MODE_POINT)* 10);
double sl_SELL= Price_SELL+sl*(MarketInfo(Symbol(),
MODE_POINT)* 10);
ticket= OrderSend (Symbol(),OP_SELLSTOP,lot, Price_SELL,huadian, sl_SELL, tp_SELL,"MQL4 Lesson",1000,0, clrAliceBlue);
  }

以上程序我们将多单和空单挂单的价格分别赋给了Price_BUY和Price_SELL,将多单的止盈止损分别赋给tp_BUY和sl_BUY,然后挂出多单,将空单的止盈止损分别赋给tp_SELL和sl_SELL并挂出空单,从而实现了双向挂单的功能。

图片[7]-MQL4课程-交易函数下单及挂单-清风小筑-雷国胜的个人网站

我们双击一下脚本,程序自动挂了两个单,执行正常。

当然,要做一款用于新闻交易的EA肯定不止是这么简单的,比如说后面我们还要实现移动止损的功能,还有删除挂单的功能以及根据时间自动开仓的功能等,需要学习的东西还非常多,但是到这一步也算是比手工做单来的方便点了。
————————————————
版权声明:本文为CSDN博主「火象交易」的原创文章,
原文链接:https://blog.csdn.net/m0_62038975/article/details/121081222

    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞11赞赏 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容