MT5中有用的自带自定义函数讲解 [MT4]
作者:
MT4 来源:
cxh99.com 发布时间:2012年05月16日 点击数:
【
收藏到本网的会员中心】
- 因为MQL5的交易方式改成 两个结构参数的样子,很多人都会晕好久,对没入门的人来说就更难理解了。
在这里,我们制作了类似MQL4的交易功能,用自定义函数实现的,只需要拷贝到你的EA里,然后按例子的样子使用就行了。
前提:
以下自定义函数都需要用到几个公共的结构,所以先要把下面的公共定义部分拷贝在程序的头部。然后在拷贝后面的自定义指标。
程序头部的交易结构定义:
复制代码- int MagicHere=12345;
- MqlTradeRequest MyTrade;
- MqlTradeResult MyResult;
自定义函数一:市价单入场函数
复制代码- bool PositionOpen(ulong TradeOrder,double Vol,double ST,double TP,ulong Slip,int Magic,string Comm)
- {
- MyTrade.action=TRADE_ACTION_DEAL;
- MyTrade.magic=Magic;
- MyTrade.symbol=Symbol();
- MyTrade.volume=Vol;
- //SymbolInfoTick(Symbol(),MyTick);
- switch(TradeOrder)
- {
- case ORDER_TYPE_BUY:
- MyTrade.price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
- MyTrade.type=ORDER_TYPE_BUY;
- break;
- case ORDER_TYPE_SELL:
- MyTrade.price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
- MyTrade.type=ORDER_TYPE_SELL;
- break;
- }
- MyTrade.deviation=Slip;
- MyTrade.type_filling=ORDER_FILLING_AON;
- MyTrade.comment=Comm;
- MyTrade.sl=ST;
- MyTrade.tp=TP;
- return(OrderSend(MyTrade,MyResult));
- }
调用举例:按市场价卖出当前货币0.1手,无止损止盈。
复制代码- PositionOpen(ORDER_TYPE_SELL,0.1,0,0,10,MagicHere,"Test");
自定义函数二:按市价平仓当前货币持仓单
复制代码- bool PositionClose(const string symbol,ulong deviation)
- {
- double price;
- //--- checking
- if(PositionSelect(symbol))
- {
- if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_BUY)
- {
- //--- prepare query for close BUY position
- MyTrade.type =ORDER_TYPE_SELL;
- MyTrade.price=SymbolInfoDouble(symbol,SYMBOL_BID);
- }
- else
- {
- //--- prepare query for close SELL position
- MyTrade.type =ORDER_TYPE_BUY;
- MyTrade.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
- }
- }
- //--- setting request
- MyTrade.action =TRADE_ACTION_DEAL;
- MyTrade.symbol =symbol;
- MyTrade.volume =PositionGetDouble(POSITION_VOLUME);
- MyTrade.sl =0.0;
- MyTrade.tp =0.0;
- MyTrade.deviation =deviation;
- MyTrade.type_filling=ORDER_FILLING_AON;
- //---
- return(OrderSend(MyTrade,MyResult));
- }
调用举例:按市价单平仓 滑点可接受5点内
复制代码- PositionClose(Symbol(),5);
自定义函数三:修改当前货币持仓单的止盈止损
复制代码- bool PositionModify(const string symbol,double sl,double tp)
- {
- //--- setting request
- MyTrade.action=TRADE_ACTION_SLTP;
- MyTrade.symbol=symbol;
- MyTrade.sl =sl;
- MyTrade.tp =tp;
- //---
- return(OrderSend(MyTrade,MyResult));
- }
调用举例:设置新的止盈止损
复制代码-
- PositionModify(Symbol(),NewStop,NewTarget);
自定义指标四:当前货币持仓单的手数总和
复制代码- double PositionVolume()
- {
- if(PositionSelect(Symbol(),0))
- {
- double Vol=PositionGetDouble(POSITION_VOLUME);
- return(Vol);
- }else return(-1);
- }
自定义指标五:发出当前货币的挂单
复制代码- bool OrderOpen(ENUM_ORDER_TYPE order_type,double volume,double limit_price,
- double price,double sl,double tp,const string comment)
- {
- //--- checking
- if(order_type==ORDER_TYPE_BUY || order_type==ORDER_TYPE_SELL)
- {
- MyResult.retcode=TRADE_RETCODE_INVALID;
- MyResult.comment="Invalid order type";
- return(false);
- }
- //--- setting request
- MyTrade.action =TRADE_ACTION_PENDING;
- MyTrade.symbol =Symbol();
- MyTrade.magic =MagicHere;
- MyTrade.volume =volume;
- MyTrade.type =order_type;
- MyTrade.price =price;
- MyTrade.sl =sl;
- MyTrade.tp =tp;
- MyTrade.type_filling=ORDER_FILLING_AON;
- MyTrade.comment =comment;
- //---
- return(OrderSend(MyTrade,MyResult));
- }
自定义指标六:修改当前指定Ticket的挂单的止盈止损数值
复制代码- bool OrderModify(ulong ticket,double price,double sl,double tp)
- {
- //--- setting request
- MyTrade.action =TRADE_ACTION_MODIFY;
- MyTrade.order =ticket;
- MyTrade.price =price;
- MyTrade.sl =sl;
- MyTrade.tp =tp;
- //---
- return(OrderSend(MyTrade,MyResult));
- }
自定义指标七:删除当前指定Ticket的挂单
复制代码-
- bool OrderDelete(ulong ticket)
- {
- //--- setting request
- MyTrade.action =TRADE_ACTION_REMOVE;
- MyTrade.order =ticket;
- MyTrade.symbol =NULL;
- MyTrade.magic =0;
- MyTrade.volume =0.0;
- MyTrade.type =0;
- MyTrade.price =0.0;
- MyTrade.sl =0.0;
- MyTrade.tp =0.0;
- MyTrade.type_time =0;
- MyTrade.expiration=0;
- //---
- return(OrderSend(MyTrade,MyResult));
- }
自定义指标八:获得当前最新入场的挂单的Ticket号码
复制代码- ulong GetLastOrderTick()
- {
- int Cnt=OrdersTotal();
- if(Cnt>0)
- {
- for(int i=Cnt-1;i>=0;i++)
- {
- int Tick=OrderGetTicket(i);
- if(OrderGetString(ORDER_SYMBOL)==Symbol())
- return(Tick);
- }
- return(-1);
- }else return(-1);
- }
栽自www.520fx.com
上面那些函数都是非常有用的,如果能有效的使用,能提高你编程速度数倍啊。
上面只是粗略的讲下,如果你有什么疑问,就在本站回帖,本站会给予进一步的解答。