交易函数也算是MT4平台的独特函数了,也是最关键的一类,我们写程序最终还是要落到交易上的,那么下单和挂单的函数就必不可少。
1下单
打开帮助文件,我们可以看到交易函数还是有蛮多的,这节课我们先不讲这么多,我们完成一个目标就可以了,那就是做好开单和挂单。
开单和挂单我们都采用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分批下单
在我们做下单的程序时,我们肯定也会想到一些问题,比如说单子手数很小,小于平台的最小手数限制,或者反之单子大于了平台最大单子的限制怎么办?
对于手数很小的单子我们没有办法,只能给一个输出提示一下,毕竟如果强行用最小手数的话有可能会出问题,因为有些品种的最小手数是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手试一下,运行结果如下:
可以看到程序输出了“手数太小”。接下来我们调整手数,将lot调整为0.01,可以看到我们开出了0.01手的订单。
最后我们试一下开1200手订单:
可以看到程序自动将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,其他都没变,所以学会了开单那么挂单也是一样的。
运行以上代码,我们顺利完成了挂单的任务。
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并挂出空单,从而实现了双向挂单的功能。
我们双击一下脚本,程序自动挂了两个单,执行正常。
当然,要做一款用于新闻交易的EA肯定不止是这么简单的,比如说后面我们还要实现移动止损的功能,还有删除挂单的功能以及根据时间自动开仓的功能等,需要学习的东西还非常多,但是到这一步也算是比手工做单来的方便点了。
————————————————
版权声明:本文为CSDN博主「火象交易」的原创文章,
原文链接:https://blog.csdn.net/m0_62038975/article/details/121081222
暂无评论内容