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 strictbool 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+300Point,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 strictinput 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的属性里面修改(即使没有源码也可以修改)EA属性页看看,为什么我们的变量是lots,但是在EA的输入参数里面显示的却是“交易手数”,因为我们在源码的第9行,指定了EA属性为严格模式#property strict
在严格模式下 input 后面的变量将会显示为本行后面的注释“//”标记后面的字符(图片来源网络,侵删)
0 评论