//+------------------------------------------------------------------+
//|                                                  mt5_ea_demo.mq5 |
//|                                Copyright 吕海洋 QQ交流群:157528427|
//|                            https://www.mql5.com/zh/signals/789037|
//+------------------------------------------------------------------+
#property copyright "Copyright 吕海洋 QQ交流群:157528427"
#property link      "https://www.mql5.com/zh/signals/789037"
#property version   "1.00"#include <Trade\trade.mqh>
#include <Trade\PositionInfo.mqh>//EA模板,封装了常用的订单操作,新建的类继承这个模板可以直接调用方法
class TradeSystem{
public:CTrade trade;//获取最后一笔历史订单获利//magic_number: 幻数(用来标记是EA建仓的单子)//symbol:货币名称//cmt: 订单注释信息//order_type: 订单类型 "BUY","SELL"double GetLastProfit(ulong magic_number, string symbol, string cmt, string order_type){ENUM_DEAL_TYPE deal_type;if(order_type == "BUY"){deal_type = DEAL_TYPE_SELL;}else if(order_type == "SELL"){deal_type = DEAL_TYPE_BUY;}else return 0;ulong ticket;double last_profit = 0;//--- 请求交易历史记录 HistorySelect(0,TimeCurrent()); //--- 当前挂单数量 int total=HistoryDealsTotal(); //--- 循环检测通过订单 for(int i=total -1;i>=0;i--) { //--- 通过其列表中的位置返回订单报价 if((ticket=HistoryDealGetTicket(i))>0) {if(HistoryDealGetInteger(ticket,DEAL_MAGIC)==magic_number && HistoryDealGetString(ticket,DEAL_SYMBOL)==symbol){if(HistoryDealGetInteger(ticket,DEAL_TYPE)==deal_type && HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT){last_profit = HistoryDealGetDouble(ticket,DEAL_PROFIT);break;        }}}}return last_profit;}//获取连续亏损次数//magic_number: 幻数(用来标记是EA建仓的单子)//symbol:货币名称//cmt: 订单注释信息//order_type: 订单类型 "BUY","SELL"int GetStopLossTimes(ulong magic_number, string symbol, string cmt, string order_type){ENUM_DEAL_TYPE deal_type;if(order_type == "BUY"){deal_type = DEAL_TYPE_SELL;}else if(order_type == "SELL"){deal_type = DEAL_TYPE_BUY;} else return 0;ulong ticket;int stop_loss_times = 0;//--- 请求交易历史记录 HistorySelect(0,TimeCurrent()); //--- 当前挂单数量 int total=HistoryDealsTotal(); //--- 循环检测通过订单 for(int i=total;i>=0;i--) { //--- 通过其列表中的位置返回订单报价 if((ticket=HistoryDealGetTicket(i))>0) {if(HistoryDealGetInteger(ticket,DEAL_MAGIC)==magic_number && HistoryDealGetString(ticket,DEAL_SYMBOL)==symbol){if(HistoryDealGetInteger(ticket,DEAL_TYPE)==deal_type && HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT){if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0) stop_loss_times++;else break;        }}}}return stop_loss_times;}//获取最后一笔历史订单获利//magic_number: 幻数(用来标记是EA建仓的单子)//symbol:货币名称//cmt: 订单注释信息//order_type: 订单类型 "BUY","SELL"double GetLastPrice(ulong magic_number, string symbol, string cmt, string order_type){ENUM_POSITION_TYPE postion_type;ENUM_DEAL_TYPE deal_type;if(order_type == "BUY"){postion_type = POSITION_TYPE_BUY;deal_type = DEAL_TYPE_SELL;}else if(order_type == "SELL"){postion_type = POSITION_TYPE_SELL;deal_type = DEAL_TYPE_BUY;}else return 0;ulong ticket;double last_create_price = 0;int total = PositionsTotal();for(int i=total;i>=0;i--){ticket=PositionGetTicket(i);if(PositionGetInteger(POSITION_MAGIC)==magic_number && PositionGetString(POSITION_SYMBOL)==symbol){if(PositionGetInteger(POSITION_TYPE)==postion_type){last_create_price = PositionGetDouble(POSITION_PRICE_OPEN);break;    }}}return last_create_price;}//开立订单//magic_number: 幻数(用来标记是EA建仓的单子)//open_lots: 开仓手数//symbol:货币名称//cmt: 订单注释信息//order_type: 订单类型 "BUY","SELL"double OpenOrder(ulong magic_number, string symbol, double open_lots, string cmt, string string_order_type){ENUM_ORDER_TYPE order_type;if(string_order_type == "BUY"){order_type = ORDER_TYPE_BUY;}else if(string_order_type == "SELL"){order_type = ORDER_TYPE_SELL;}else return 0;double open_price = 0;trade.SetExpertMagicNumber(magic_number);trade.PositionOpen(symbol,order_type,open_lots,0,0,0,cmt);string info = "【" + cmt + "】";if(order_type == ORDER_TYPE_BUY) info += "多单";else if(order_type == ORDER_TYPE_SELL) info += "空单";//获取返回状态描述信息      uint rel_code = trade.ResultRetcode();if(rel_code == 10009){open_price = trade.ResultPrice();info += "开仓成功 : 价格 = " + string(open_price);info += ";仓位 = " + string(open_lots);}else{info += "开仓失败 : " + string(rel_code);}SendInformation(info);return open_price;}//平仓//magic_number: 幻数(用来标记是EA建仓的单子)//symbol:货币名称//cmt: 订单注释信息//order_type: 订单类型 "BUY","SELL"bool CloseOrder(ulong magic_number, string symbol, string cmt, string order_type){ENUM_POSITION_TYPE postion_type;if(order_type == "BUY"){postion_type = POSITION_TYPE_BUY;}else if(order_type == "SELL"){postion_type = POSITION_TYPE_SELL;}else return false;double close_price = 0;trade.SetExpertMagicNumber(magic_number);int total = PositionsTotal();for(int i=total;i>=0;i--){ulong ticket=PositionGetTicket(i);if(PositionGetInteger(POSITION_MAGIC)==magic_number && PositionGetString(POSITION_SYMBOL)==symbol){if(PositionGetInteger(POSITION_TYPE)==postion_type){trade.PositionClose(ticket);string info = "【" + cmt + "】";if(postion_type == POSITION_TYPE_BUY) info += "多单";else if(postion_type == POSITION_TYPE_SELL) info += "空单";//获取返回状态描述信息  uint rel_code = trade.ResultRetcode();if(rel_code == 10009){close_price = trade.ResultPrice();double vloume = trade.ResultVolume();info += "平仓成功 : 价格 = " + string(close_price);info += ";仓位 = " + string(vloume);SendInformation(info); return true;}else{info += "平仓失败 : " + string(rel_code);SendInformation(info);return false;}   }}}return false;} //获取仓位信息//magic_number: 幻数(用来标记是EA建仓的单子)//symbol:货币名称//cmt: 订单注释信息//order_type: 订单类型 "BUY","SELL"double GetTotalOrders(ulong magic_number, string symbol, string cmt, string order_type){ENUM_POSITION_TYPE postion_type;if(order_type == "BUY"){postion_type = POSITION_TYPE_BUY;}else if(order_type == "SELL"){postion_type = POSITION_TYPE_SELL;}else return 0;ulong ticket;double volumes = 0;int total = PositionsTotal();for(int i=total;i>=0;i--){ticket=PositionGetTicket(i);if(PositionGetInteger(POSITION_MAGIC)==magic_number && PositionGetString(POSITION_SYMBOL)==symbol){if(PositionGetInteger(POSITION_TYPE)==postion_type){volumes += 1;}}}return volumes;}//发送消息    //information:要推送手机端/打印的消息void SendInformation(string information){Print(information);SendNotification(information);}};//EA模板
//两根均线,金叉买入,死叉卖出
class DemoSystem: public TradeSystem{
public:double base_lots;//每次开仓的数量string cmt;//订单注释信息ulong magic;//幻数string symbol;//货币名字double buy_open_price;//多单开仓价格double sell_open_price;//空单开仓价格int ma_peroid1;//短期均线周期int ma_peroid2;//长期均线周期//初始化EA系统void init(ulong p_magic, double p_lots, int p_ma_period1, int p_ma_period2){symbol = Symbol();base_lots = p_lots;cmt = symbol;magic = p_magic;ma_peroid1 = p_ma_period1;ma_peroid2 = p_ma_period2;//初始化信息string info = "【" + cmt + "】" + "初始化EA\n";info += "ma1:" + string(ma_peroid1) + ";ma2:" + string(ma_peroid2);SendInformation(info);}//多单开仓void OpenBuy(){//检查是否有多单仓位double buy_total_orders = GetTotalOrders(magic, symbol, cmt, "BUY");// 如果没有仓位就建仓if(buy_total_orders == 0){buy_open_price = OpenOrder(magic, symbol, base_lots, cmt, "BUY");}}//多单平仓void CloseBuy(){  //检查是否有多单仓位double buy_total_orders = GetTotalOrders(magic, symbol, cmt, "BUY");//如果有仓位就平仓if(buy_total_orders > 0){for(int i=0;i<=buy_total_orders;i++){if(CloseOrder(magic, symbol, cmt, "BUY")){buy_open_price = 0;}}}}//空单开仓void OpenSell(){//检查是否有空单仓位double sell_total_orders = GetTotalOrders(magic, symbol, cmt, "SELL");// 如果没有仓位就建仓if(sell_total_orders == 0){sell_open_price = OpenOrder(magic, symbol, base_lots, cmt, "SELL");}}//空单平仓void CloseSell(){//检查是否有空单仓位double sell_total_orders = GetTotalOrders(magic, symbol, cmt, "SELL");//如果有仓位就平仓if(sell_total_orders > 0){for(int i=0;i<=sell_total_orders;i++){if(CloseOrder(magic, symbol, cmt, "SELL")){sell_open_price = 0;}}}}//运行EAvoid run(){//获取行情数据double close1 = iClose(symbol, 0, 1);// 初始化数组存放ma1指标double Buffer_ma1[]; // 时间序列化数组ArraySetAsSeries(Buffer_ma1,true);// 获取ma指标int handle_ma1 = iMA(symbol,0,ma_peroid1,0,MODE_SMA,PRICE_CLOSE);// 赋值指标值到数组maBufferCopyBuffer(handle_ma1,0,0,10,Buffer_ma1);// 获取当前K线的ma值和上一根K线的ma值double ma1_1 = Buffer_ma1[1];double ma1_2 = Buffer_ma1[2];// 初始化数组存放ma2指标double Buffer_ma2[]; // 时间序列化数组ArraySetAsSeries(Buffer_ma2,true);// 获取ma指标int handle_ma2 = iMA(symbol,0,ma_peroid2,0,MODE_SMA,PRICE_CLOSE);// 赋值指标值到数组maBufferCopyBuffer(handle_ma2,0,0,10,Buffer_ma2);// 获取当前K线的ma值和上一根K线的ma值double ma2_1 = Buffer_ma2[1];double ma2_2 = Buffer_ma2[2];//金叉建多单if(ma1_2 < ma2_2 && ma1_1 > ma2_1){CloseSell();OpenBuy();}//死叉建空单else if(ma1_2 > ma2_2 && ma1_1 < ma2_1){CloseBuy();OpenSell();}}};ulong input_magic = 20210101;//幻数
input double input_lots = 0.01;//仓位
input int input_ma_period1 = 10;//MA短周期
input int input_ma_period2 = 50;//MA长周期// 实例化EA类
DemoSystem ds;//初始化脚本的时候执行一次
int OnInit(){ds.init(input_magic, input_lots, input_ma_period1, input_ma_period2);return(INIT_SUCCEEDED);}//价格每次变化执行一次
void OnTick(){ds.run();}

git项目地址:https://github.com/lvhaiyang/mql_framework

欢迎加入量化投资技术交流QQ群:157528427

mq5 EA模板及双均线交叉策略EAdemo相关推荐

  1. 量化均线策略-简单移动平均数、指数加权移动平均数、双均线交叉和异同移动平均线(MACD)...

    概述 根据求平均的方式不同,可以有简单移动平均数( Simple moving Average,SMA).加权移动平均数( Weighted Moving Average,WMA)和指数移动平均数(E ...

  2. 均线交叉策略、海龟策略:基于backtrader框架的实现

    原创文章第74篇,专注"个人成长与财富自由.世界运作的逻辑, AI量化投资". 前面系列文章,把backtrader的方方面面介绍了一下,如何使用,内部运作机制,如何扩展. 客观讲 ...

  3. 1-3移动均线交叉策略2

    第一阶段.一个简单策略入门量化投资 1-3移动均线交叉策略2 上一篇文章1-2 移动均线交叉策略1中我们最后提到: 如果我们从第一天买入股票,一直持有股票,最后一天卖出,获得的收益是每股124.02美 ...

  4. 1-2 移动均线交叉策略1

    第一阶段.一个简单策略入门量化投资 1-2 移动均线交叉策略1 第一阶段一个简单策略入门量化投资 1-2 移动均线交叉策略1 前言 获取数据 移动均线交叉策略 数据可视化 绘制折线图 绘制K线图 绘制 ...

  5. 量化交易学习(10)均线交叉策略

    均线交叉策略 均线介绍 均线交叉策略 回测策略 优化策略参数 代码 总结 均线介绍 均线计算: 在某一时间段的收盘价之和进行算术平均的方法,并随着时间的推移将这些平均值连成一条线便可得出SMA. 趋势 ...

  6. Python量化交易学习笔记(14)——均线交叉策略

    本文使用均线交叉策略,对平安银行自2018年1月1日至2020年2月28日的日线数据进行回测分析. 策略会用到短期移动均线及长期移动均线两个技术指标,在backtrader自定义策略init方法中,添 ...

  7. 用 Pandas 分析均线交叉策略收益率

    在这篇文章中,我们会利用上一篇文章中的均线交叉策略回测中获得的结果(<用 Python 基于均线交叉策略进行回测>),并花一些时间更深入地挖掘权益曲线并生成一些关键绩效指标和一些有趣的数据 ...

  8. 1-4移动均线交叉策略3

    第一阶段.一个简单策略入门量化投资 1-4移动均线交叉策略3 上一文1-3移动均线交叉策略2中,我们得到的结果是令人失望的.但我们的探索还要继续. 我们知道,使用投资组合的方式进行分散投资是降低风险的 ...

  9. 用 Python 基于均线交叉策略进行回测

    本篇文章中,我将用 Python 构建一个简单的移动平均线交叉交易策略进行回测,并使用 标准普尔 500 指数(S&P500) 进行测试. 一个简单的移动平均线交叉策略可能是使用技术指标的量化 ...

最新文章

  1. Git CMD - show: Show various types of objects
  2. 数据中心ups电源七个故障分析
  3. Gradle学习网站
  4. matlab中服从高斯分布的矩阵_推荐基础算法之矩阵分解PMF
  5. VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏[转]
  6. UML学生成绩管理系统需求分析
  7. Android TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题
  8. android 屏幕飘动,Android自定义View实现飘动的叶子效果(三)
  9. VB 判断当前是否连接网络API实现
  10. php if and,【PHP】与and的’别名’关系
  11. js时间对象相关函数
  12. 计算机考研专业课数字,2020北京航空航天大学计算机考研初试专业课经验
  13. 华为p4支持鸿蒙功能吗_华为鸿蒙2.0系统支持的手机型号 华为鸿蒙2.0系统详解[多图]...
  14. 编程珠玑--粗略估算
  15. 把SD卡制作为启动卡的操作步骤
  16. .Net 微信支付集成
  17. ARM汇编指令—CPSR访问指令(mrsmsr)
  18. CBA第32轮:八一南昌男篮再胜北控 完成赛季“四连杀”
  19. 幼儿教师计算机水平证,电脑上怎么报考幼儿教师资格证
  20. 修改SpringBoot内置Tomcat的端口

热门文章

  1. 破解WINDOWS7密码
  2. GPS基础知识(五)、GPS导航电文
  3. linux shm open,undefined reference to \'shm_open\'解决办法-j_cle-ChinaUnix博客
  4. Java项目:SSH学生请假管理系统
  5. ESP8266开发板+mysql数据库+DHT11
  6. 【过一下14】自习室的一天
  7. 计算机奖学金用英语怎么说,奖学金证书的翻译,三好学生荣誉证书,优秀学生干部荣誉证书的英语,英语四、六级和计算机证书,辅修证书的英语怎么说, 教学实践单项奖,社会实践单项奖用英语怎么说...
  8. Qgis的下载安装(Qgis3.16.12)
  9. ChatGPT 之父传奇:8岁学编程,16岁出柜,37岁颠覆科技圈,网友:“天选 CEO!”...
  10. java练习之输入一个字母,如果是小写,转换成大写并输出,如果是大写就不变化并输出。