用MT4语言写MT5程序
在MT5上开发EA最麻烦的是订单这类的写法,因为它的持仓和历史单是分开获取,挂单和非挂单分开获取,这样导致了稍不注意就会出问题,并且magic和注释开单和平仓也可能不一样(手动平仓会丢失magic和注释) 获取订单的开单时间也麻烦,代码不严谨就会出问题。而在MT4上 挂单和成交单是在一个循环里面的也共用一套订单属性获取函数,所以本人开发这个动态库就是方便开发MT5EA,也方便MT4EA升级至MT5EA,只需要把最下面附件里面的文件放到对应的文件夹即可用该库开发EA已重定义的EA函数:
int OrdersTotal(datetime time);//OrdersTotal()持仓单
int OrdersHistoryTotal(datetime time);//OrdersHistoryTotal() 历史单
int OrdersHistoryTotalW(datetime time);//OrdersHistoryTotalW(0) 历史单扩展函数0代表所有历史单 / 其他时间代表指定时间后的历史单
bool OrderSelect(int i,int select,int mode);
ulong OrderTicket();
string OrderSymbol();
int OrderType();
double OrderLots();
double OrderOpenPrice();
datetimeOrderOpenTime();
double OrderClosePrice();
datetimeOrderCloseTime();
double OrderStopLoss();
double OrderTakeProfit();
double OrderSwap();
double OrderCommission();
double OrderProfit();
ulong OrderMagicNumber();
string OrderComment();
double OrderProfitPoint();
//平仓订单属性
ulong OrderTicket2();
ulong OrderMagicNumber2();
string OrderComment2();
double OrderStopLoss2();
double OrderTakeProfit2();
//同步交易函数
ulong OrderSend(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit,string comment=NULL,int magic=0,datetime expiration=0,color arrow_color=clrNONE);
boolOrderClose(ulong OrderTicket,double OrderLots,double OrderClosePrice=0,int slippage=10000);
boolOrderDelete(ulong OrderTicket);
boolOrderModify(ulong OrderTicket, double price, double stoploss, double takeprofit, datetime expiration=0, color arrow_color=clrBlue);
boolOrderCloseBy(ulong ticket,ulong opposite,color arrow_color);
//异步交易函数
ulong OrderSendAsync(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit,string comment=NULL,int magic=0,datetime expiration=0,color arrow_color=clrNONE);
boolOrderCloseAsync(ulong OrderTicket,double OrderLots,double OrderClosePrice=0,int slippage=10000);
boolOrderDeleteAsync(ulong OrderTicket);
boolOrderModifyAsync(ulong OrderTicket, double price, double stoploss, double takeprofit, datetime expiration=0, color arrow_color=clrBlue);
boolOrderCloseByAsync(ulong ticket,ulong opposite,color arrow_color);
已重定义的指标函数:
double iMACD(string _symbol,ENUM_TIMEFRAMES _period,int _fast_ema_period,int _slow_ema_period,int _signal_period,ENUM_APPLIED_PRICE _applied_price,int mode,int shift);
double iBands(string_symbol,ENUM_TIMEFRAMES_period,int_bands_period,double _deviation,int_bands_shift,ENUM_APPLIED_PRICE_applied_price,int _pos,int _shift);
double iMA(string symbol,ENUM_TIMEFRAMES timeframe,int ma_period, int ma_shift,ENUM_MA_METHOD ma_method, ENUM_APPLIED_PRICE applied_price,int shift);
void Releasetimeouthandle(int hour);//句柄超时释放/小时
已重定义的其他函数:
Ask
Bid
下面就可以在MT5里面使用我们熟悉的MT4遍历循环代码了bool Orderclose(int type,int magic,string com,string symbol="")
{
bool Orderclose=false;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((symbol==""&&OrderSymbol()==Symbol())
||(symbol!=""&&OrderSymbol()==symbol))
if(OrderMagicNumber()==magic || magic==-1)
if(StringFind(OrderComment(),com,0)!=-1 || com=="")
if(OrderType()==type||type==-100)
{
if(OrderType()<2)
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),2000))
Orderclose=true;
if(OrderType()>1)
if(OrderDelete(OrderTicket()))
Orderclose=true;
}
return(Orderclose);
}double AveragePrice(int type,int magic,string com,string sym="")
{
double Prices=0;
double lots=0;
string _sym="";
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((sym==""&&OrderSymbol()==Symbol())
||(sym!=""&&OrderSymbol()==sym))
if(OrderMagicNumber()==magic || magic==-1)
if(StringFind(OrderComment(),com,0)!=-1 || com=="")
if(OrderType()==type)
{
Prices=Prices+OrderOpenPrice()*OrderLots();
lots=lots+OrderLots();
_sym=OrderSymbol();
}
if(lots!=0)
return(NormalizeDouble(Prices/lots,(int)SymbolInfoInteger(_sym,SYMBOL_DIGITS)));
else
return(0);
}
写MT5EA需要在顶部加上#include <Include_MQL4CodeEnvironment.mqh>
#property version "1.0"
#property strict
#include <Include_MQL4CodeEnvironment.mqh>
以下为MT5调用布林指标用法举例:
#property version "1.00"
#include <Include_MQL4CodeEnvironment.mqh>
input ENUM_TIMEFRAMES period=0; // 周期
input int bands_period=20; // 平均线计算周期
input int bands_shift=0; // 指标平移
input double deviation=2.0; // 标准差数
input ENUM_APPLIED_PRICEapplied_price=PRICE_CLOSE; // 价格或处理器类型
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
Comment(
"\n\r上轨:"+DoubleToString(iBands(Symbol(),period,bands_period,deviation,bands_shift,applied_price,1,0),Digits())
+"\n\r中轨:"+DoubleToString(iBands(Symbol(),period,bands_period,deviation,bands_shift,applied_price,0,0),Digits())
+"\n\r下轨:"+DoubleToString(iBands(Symbol(),period,bands_period,deviation,bands_shift,applied_price,2,0),Digits())
);
Releasetimeouthandle(168);
//超过168小时(1周)没有访问过的句柄进行释放,减少占用计算机内存
//当然也可以不加这句释放代码,当程序退出时自动释放
//本库对指标进行了封装,不会重复调用指标句柄创建句柄
}
页:
[1]