找回密码
 立即注册

用MT4语言写MT5程序

[复制链接]

用MT4语言写MT5程序

[复制链接]
admin

185

主题

31

回帖

2万

积分

管理员

积分
20447
2024-8-1 09:29:30 | 显示全部楼层 |阅读模式
  在MT5上开发EA最麻烦的是订单这类的写法,因为它的持仓和历史单是分开获取,挂单和非挂单分开获取,这样导致了稍不注意就会出问题,并且magic和注释开单和平仓也可能不一样(手动平仓会丢失magic和注释) 获取订单的开单时间也麻烦,代码不严谨就会出问题。而在MT4上 挂单和成交单是在一个循环里面的也共用一套订单属性获取函数,所以本人开发这个动态库就是方便开发MT5EA,也方便MT4EA升级至MT5EA,只需要把最下面附件里面的文件放到对应的文件夹即可用该库开发EA


已重定义的EA函数:

  1. int       OrdersTotal(datetime time);//OrdersTotal()  持仓单
  2. int       OrdersHistoryTotal(datetime time);//OrdersHistoryTotal() 历史单
  3. int       OrdersHistoryTotalW(datetime time);//OrdersHistoryTotalW(0) 历史单扩展函数  0代表所有历史单 / 其他时间代表指定时间后的历史单
  4. bool      OrderSelect(int i,int select,int mode);
  5. ulong     OrderTicket();
  6. string    OrderSymbol();
  7. int       OrderType();
  8. double    OrderLots();
  9. double    OrderOpenPrice();
  10. datetime  OrderOpenTime();
  11. double    OrderClosePrice();
  12. datetime  OrderCloseTime();
  13. double    OrderStopLoss();
  14. double    OrderTakeProfit();
  15. double    OrderSwap();
  16. double    OrderCommission();
  17. double    OrderProfit();
  18. ulong     OrderMagicNumber();
  19. string    OrderComment();
  20. double    OrderProfitPoint();
  21. //平仓订单属性
  22. ulong     OrderTicket2();
  23. ulong     OrderMagicNumber2();
  24. string    OrderComment2();
  25. double    OrderStopLoss2();
  26. double    OrderTakeProfit2();
  27. //同步交易函数
  28. 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);
  29. bool  OrderClose(ulong OrderTicket,double OrderLots,double OrderClosePrice=0,int slippage=10000);
  30. bool  OrderDelete(ulong OrderTicket);
  31. bool  OrderModify(ulong OrderTicket, double price, double stoploss, double takeprofit, datetime expiration=0, color arrow_color=clrBlue);
  32. bool  OrderCloseBy(ulong ticket,ulong opposite,color arrow_color);
  33. //异步交易函数
  34. 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);
  35. bool  OrderCloseAsync(ulong OrderTicket,double OrderLots,double OrderClosePrice=0,int slippage=10000);
  36. bool  OrderDeleteAsync(ulong OrderTicket);
  37. bool  OrderModifyAsync(ulong OrderTicket, double price, double stoploss, double takeprofit, datetime expiration=0, color arrow_color=clrBlue);
  38. bool  OrderCloseByAsync(ulong ticket,ulong opposite,color arrow_color);
复制代码


已重定义的指标函数:
  1. 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);
  2. double iBands(string  _symbol,ENUM_TIMEFRAMES  _period,int  _bands_period,double _deviation,int  _bands_shift,ENUM_APPLIED_PRICE  _applied_price,int _pos,int _shift);
  3. 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);
  4. void   Releasetimeouthandle(int hour);//句柄超时释放/小时
复制代码

已重定义的其他函数:
  1. Ask
  2. Bid
复制代码



下面就可以在MT5里面使用我们熟悉的MT4遍历循环代码了
  1. bool Orderclose(int type,int magic,string com,string symbol="")
  2.   {
  3.    bool Orderclose=false;
  4.    for(int i=OrdersTotal()-1; i>=0; i--)
  5.       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  6.             if((symbol==""&&OrderSymbol()==Symbol())
  7.                ||(symbol!=""&&OrderSymbol()==symbol))
  8.             if(OrderMagicNumber()==magic || magic==-1)
  9.                if(StringFind(OrderComment(),com,0)!=-1 || com=="")
  10.                   if(OrderType()==type||type==-100)
  11.                     {
  12.                      if(OrderType()<2)
  13.                         if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),2000))
  14.                            Orderclose=true;
  15.                      if(OrderType()>1)
  16.                         if(OrderDelete(OrderTicket()))
  17.                            Orderclose=true;
  18.                     }
  19.    return(Orderclose);
  20.   }
复制代码
  1. double AveragePrice(int type,int magic,string com,string sym="")
  2.   {
  3.    double Prices=0;
  4.    double lots=0;
  5.    string _sym="";
  6.    for(int i=OrdersTotal()-1; i>=0; i--)
  7.       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  8.          if((sym==""&&OrderSymbol()==Symbol())
  9.             ||(sym!=""&&OrderSymbol()==sym))
  10.             if(OrderMagicNumber()==magic || magic==-1)
  11.                if(StringFind(OrderComment(),com,0)!=-1 || com=="")
  12.                   if(OrderType()==type)
  13.                     {
  14.                      Prices=Prices+OrderOpenPrice()*OrderLots();
  15.                      lots=lots+OrderLots();
  16.                      _sym=OrderSymbol();
  17.                     }
  18.    if(lots!=0)
  19.       return(NormalizeDouble(Prices/lots,(int)SymbolInfoInteger(_sym,SYMBOL_DIGITS)));
  20.    else
  21.       return(0);
  22.   }
复制代码

写MT5EA需要在顶部加上  #include <Include_MQL4CodeEnvironment.mqh>
  1. #property   version       "1.0"
  2. #property   strict
  3. #include <Include_MQL4CodeEnvironment.mqh>
复制代码



用MT4代码写MT5EA.mq5

45.17 KB, 下载次数: 236

放MQL5\Experts

Include_MQL4CodeEnvironment.mqh

21.66 KB, 下载次数: 236

放MQL5\Include

Libraries_MQL4CodeEnvironment.ex5

29.39 KB, 下载次数: 236

放MQL5\Libraries

楼主
admin 楼主

185

主题

31

回帖

2万

积分

管理员

积分
20447
2024-8-16 11:21:27 | 显示全部楼层
以下为MT5调用布林指标用法举例:
  1. #property version   "1.00"
  2. #include <Include_MQL4CodeEnvironment.mqh>
  3. input   ENUM_TIMEFRAMES     period=0;            // 周期
  4. input   int                 bands_period=20;      // 平均线计算周期
  5. input   int                 bands_shift=0;       // 指标平移
  6. input   double              deviation=2.0;         // 标准差数
  7. input   ENUM_APPLIED_PRICE  applied_price=PRICE_CLOSE;      // 价格或处理器类型
  8. int OnInit()
  9.   {
  10.    return(INIT_SUCCEEDED);
  11.   }
  12. void OnDeinit(const int reason)
  13.   {
  14.   }
  15. void OnTick()
  16.   {
  17.    Comment(
  18.       "\n\r上轨:"+DoubleToString(iBands(Symbol(),period,bands_period,deviation,bands_shift,applied_price,1,0),Digits())
  19.       +"\n\r中轨:"+DoubleToString(iBands(Symbol(),period,bands_period,deviation,bands_shift,applied_price,0,0),Digits())
  20.       +"\n\r下轨:"+DoubleToString(iBands(Symbol(),period,bands_period,deviation,bands_shift,applied_price,2,0),Digits())
  21.    );
  22.    
  23.    Releasetimeouthandle(168);
  24.    //超过168小时(1周)没有访问过的句柄进行释放,减少占用计算机内存
  25.    //当然也可以不加这句释放代码,当程序退出时自动释放
  26.    //本库对指标进行了封装,不会重复调用指标句柄创建句柄
  27.   }
复制代码



QQ|Archiver|小黑屋|www.mtctp.com |

GMT+8, 2024-12-14 15:18 , Processed in 0.058101 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表