admin 发表于 2024-8-1 09:29:30

用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>


admin 发表于 2024-8-16 11:21:27

以下为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]
查看完整版本: 用MT4语言写MT5程序