├── Fishe.mq4 ├── acct.png ├── xau.png ├── GBPAUD.png ├── Experts ├── BetaMT.mq4 ├── MATrend.mq4 ├── Pinball.mq4 ├── AutoCloseEA.mq4 ├── OKMA.mq4 ├── GoodMA.mq4 └── TrendMacd.mq4 ├── Indicators ├── KISS.mq4 ├── KISS.tpl ├── Pardon.mq4 ├── Discover.mq4 ├── Trend-V30.mq4 ├── EasyTrend.mq4 ├── XBands.mq4 └── Trend-V20.mq4 ├── Scripts └── CloseAll.mq4 └── README.md /Fishe.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Fishe.mq4 -------------------------------------------------------------------------------- /acct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/acct.png -------------------------------------------------------------------------------- /xau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/xau.png -------------------------------------------------------------------------------- /GBPAUD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/GBPAUD.png -------------------------------------------------------------------------------- /Experts/BetaMT.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Experts/BetaMT.mq4 -------------------------------------------------------------------------------- /Experts/MATrend.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Experts/MATrend.mq4 -------------------------------------------------------------------------------- /Experts/Pinball.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Experts/Pinball.mq4 -------------------------------------------------------------------------------- /Indicators/KISS.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Indicators/KISS.mq4 -------------------------------------------------------------------------------- /Indicators/KISS.tpl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Indicators/KISS.tpl -------------------------------------------------------------------------------- /Indicators/Pardon.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Indicators/Pardon.mq4 -------------------------------------------------------------------------------- /Scripts/CloseAll.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Scripts/CloseAll.mq4 -------------------------------------------------------------------------------- /Indicators/Discover.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Indicators/Discover.mq4 -------------------------------------------------------------------------------- /Indicators/Trend-V30.mq4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reference/EA-MQL4/master/Indicators/Trend-V30.mq4 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EA-MQL4 2 | 基于MQL4平台使用MQL4语言实现 3 | * Experts内为可以执行自动交易的EA 4 | * Indicators内为指标 5 | * Scripts内为一些便捷操作脚本,拖动到图表上就会立即执行 6 | 7 | ## 功能说明 8 | ### Experts自动交易 9 | AutoCloseEA.mq4是一个自动平仓EA,设定盈利金额启动后会一直执行检测,达到的话自定平掉所有仓单,无论是手动下的单还是自动下的单
10 | OKMA.mq4是一个基于均线交叉的自动交易EA
11 | TrendMacd.mq4一个基于MACD指标金叉死叉的趋势型EA
12 | GoodMA.mq4现阶段历史回测多品种最好的一个,以60MA作为支撑压力,突破后回踩入场
13 | Pinball.mq4 布林走平时,震荡行情超卖做多超买做空
14 | BetaMT.mq4 马丁格尔策略,爆仓是它最终的命运,不要被它美丽的资金曲线迷惑
15 | 16 | ### Indicators指标或基于ea的指标 17 | EasyTrend.mq4一个傻瓜式的趋势指示器,不要做禁止方向的单子,提高胜率
18 | XBands.mq4一个把中线调粗了点的布林,便于和其他加粗均线组成系统,而不用重复一条20均线
19 | Trend-V20.mq4一个指标解读
20 | Trend-V30.mq4 一个更加详细的趋势解读
21 | Fishe.mq4 迄今为止最亮的自定义指标,具体效果参考图表GBPAUD,4H的MACD用于指示方向,小周期的自定义均线组成交叉点构成信号,同时提示最大仓位防止重仓
22 | 23 | ### Scripts脚本 24 | CloseAll.mq4一键关闭所有订单,手动进行马丁式交易时快速平掉所有仓位
25 | 26 | ## 简单清晰的图表 27 | KISS.mq4 指标指示器,简易的解读,大小周期结合,蜡烛剩余时间,枢轴支阻线。
28 | 思路:大周期使用macd相对灵活不易错失机会,小周期使用均线组相对稳定过滤杂波,数轴线只保留了轴心和S1及R1保持简单作为参考。
29 | 注:折线图为系统自带指标ZigZag,去掉了之前不成熟的操作建议,留下思考空间,后续想法改进
30 | 目前相对满意的一个图表,配合图标模板KISS.tpl。
31 | ![伦敦金XAUUSD](https://github.com/Yumerain/EA-MQL4/blob/master/xau.png) 32 | 迄今为止最亮的自定义指标
33 | ![英镑兑澳元](https://github.com/Yumerain/EA-MQL4/blob/master/GBPAUD.png) 34 |
35 | ![马丁EA资金曲线](https://github.com/Yumerain/EA-MQL4/blob/master/acct.png) 36 | 不要迷信马丁,基础手数0.03,初始资金1000,2020.4.1至2020.9.2才没爆仓
37 | -------------------------------------------------------------------------------- /Experts/AutoCloseEA.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| AutoCloseEA.mq4 | 3 | //| Copyright 2018, MetaQuotes Software Corp. | 4 | //| https://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #property copyright "Copyright 2018, Aother." 7 | #property link "https://www.mql5.com" 8 | #property version "1.00" 9 | #property strict 10 | 11 | //--- 输入参数 12 | input double CloseAtProfit =100; //平仓盈利额,默认100 13 | 14 | 15 | //+------------------------------------------------------------------+ 16 | //| Expert initialization function | 17 | //+------------------------------------------------------------------+ 18 | int OnInit() 19 | { 20 | //--- 21 | 22 | //--- 23 | return(INIT_SUCCEEDED); 24 | } 25 | //+------------------------------------------------------------------+ 26 | //| Expert deinitialization function | 27 | //+------------------------------------------------------------------+ 28 | void OnDeinit(const int reason) 29 | { 30 | //--- 31 | 32 | } 33 | //+------------------------------------------------------------------+ 34 | //| Expert tick function | 35 | //+------------------------------------------------------------------+ 36 | void OnTick() 37 | { 38 | // 遍历订单,统计盈利 39 | double totalProfit = SumProfit(); 40 | Print("DEBUG=>统计利润=[",totalProfit,"],设定退出利润=[",CloseAtProfit,"]"); 41 | if(totalProfit >CloseAtProfit) 42 | { 43 | CloseAllOrder(); 44 | } 45 | } 46 | //+------------------------------------------------------------------+ 47 | 48 | //+------------------------------------------------------------------+ 49 | //| 统计盈利 50 | //+------------------------------------------------------------------+ 51 | double SumProfit() 52 | { 53 | double sum = 0; 54 | // 遍历订单,关闭全部 55 | for(int i=0;i注意!选中仓单失败!序号=[",i,"]"); 61 | continue; 62 | } 63 | sum += OrderProfit(); 64 | } 65 | return sum; 66 | } 67 | 68 | 69 | //+------------------------------------------------------------------+ 70 | //| 平仓,关闭所有订单 71 | //+------------------------------------------------------------------+ 72 | void CloseAllOrder() 73 | { 74 | // 遍历订单,关闭全部 75 | for(int i=0;i注意!选中仓单失败!序号=[",i,"]"); 81 | continue; 82 | } 83 | //如果 仓单编号不是本系统编号,或者 仓单货币对不是当前货币对时,跳过本次循环 84 | /*if(OrderMagicNumber() != MAGICMA || OrderSymbol()!= _Symbol) 85 | { 86 | Print("注意!订单魔术标记不符!仓单魔术编号=[",OrderMagicNumber(),"]","本EA魔术编号=[",MAGICMA,"]"); 87 | continue; 88 | }*/ 89 | Print("自动平仓=>处理订单ticket=[",OrderTicket(),"],品种=[",OrderSymbol(),"],手数=[",OrderLots(),"]"); 90 | // 多单平仓: 91 | if(OrderType()==OP_BUY) 92 | { 93 | if(!OrderClose(OrderTicket(),OrderLots(),Bid,2,White)) Print("自动平仓=>关闭[多]单出错",GetLastError()); 94 | continue; 95 | } 96 | // 空单平仓: 97 | if(OrderType()==OP_SELL) 98 | { 99 | if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White)) Print("自动平仓=>关闭[空]单出错",GetLastError()); 100 | continue; 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Experts/OKMA.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Moving Average.mq4 | 3 | //| Copyright 2005-2014, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | /* KISS */ 6 | /* Keep It Simple Stupid(保持键和傻瓜化) */ 7 | /* 好的交易系统不必复杂,保持交易系统的简单性可以带来较少的麻烦。 */ 8 | //+------------------------------------------------------------------+ 9 | #property copyright "Copyright 2018." 10 | #property link "https://www.mql5.com" 11 | #property version "1.00" 12 | #property strict 13 | 14 | //定义本EA操作的订单的唯一标识号码,由此可以实现在同一账户上多系统操作,各操作EA的订单标识码不同,就不会互相误操作。凡是EA皆不可缺少,非常非常重要! 15 | #define MAGICMA 20180328 16 | 17 | //--- 输入 18 | input double Lots =0.01; //每单(手数)的交易量 19 | //+------------------------------------------------------------------+ 20 | //| 平仓,关闭订单 21 | //+------------------------------------------------------------------+ 22 | void CheckForClose(double maFst,double maSlw) 23 | { 24 | // 遍历订单处理 25 | for(int i=0;imaSlw) 48 | { 49 | if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White)) Print("关闭[空]单出错",GetLastError()); 50 | continue; 51 | } 52 | } 53 | } 54 | 55 | //+------------------------------------------------------------------+ 56 | //| Expert initialization function | 57 | /* 58 | 函数是 初始化 事件处理程序。 必须是空型或者整型,无参数: 59 | 初始化事件处理程序在EA交易或者指标下载后即时生成;它不生成脚本。OnInit()函数用于初始化。如果OnInit()返回值为整型,非零结果意味着初始化失败,生成初始化失败原因代码REASON_INITFAILED 。 60 | 要优化EA交易的输入参数,推荐使用ENUM_INIT_RETCODE枚举值作为返回代码。这些值用于组织优化的过程,包括选择最合适的测试代理。在EA交易的初始化期间测试开始之前您可以使用TerminalInfoInteger() 函数请求一个代理的配置和资源信息(内核数量,空余内存额,等等)。根据所获得的信息,您可以在EA交易优化过程中选择允许使用这个测试代理,或拒绝使用它。 61 | */ 62 | //+------------------------------------------------------------------+ 63 | int OnInit() 64 | { 65 | Print("EA初始化了……"); 66 | return(INIT_SUCCEEDED); 67 | } 68 | 69 | //+------------------------------------------------------------------+ 70 | //| Expert deinitialization function | 71 | /* 72 | 函数称为失败初始化,是初始化失败事件处理程序。必须是空型且有一个包括初始化失败原因代码 的常量整型参数。如果声明不同类型,编译程序会发出警告,但函数不可调用。对于脚本来说不会生成初始化失败事件,因此OnDeinit()函数不用于脚本。 73 | 在以下情况下EA交易和指标生成初始化失败:Deinit事件在以下情况下为EA交易和指标而生成: 74 | 再次初始化前,mql5程序下的交易品种和图表周期发生变化; 75 | 再次初始化前,输入参数发生变化; 76 | mql5程序卸载前。 77 | */ 78 | //+------------------------------------------------------------------+ 79 | void OnDeinit(const int reason) 80 | { 81 | Print("EA运行结束,已经卸载。" ); 82 | } 83 | 84 | //+------------------------------------------------------------------+ 85 | //| Expert tick function | 86 | /* 87 | 仅仅EA交易依附的图表中,交易品种收到新订单号时EA交易会生成 新订单号 事件。自定义指标或者脚本中确定OnTick()函数是无效的,因为订单号事件不为它们而生。 88 | 订单号事件只为EA交易而生,但是却不意味着EA交易需要OnTick()函数,因为EA交易不仅需要生成订单号,也需要生成计时器,预定事件和图表事件。这些都需要空型,无参数: 89 | */ 90 | //+------------------------------------------------------------------+ 91 | void OnTick() 92 | { 93 | // 检测蜡烛图是否足够数量,数量少了不足以形成可靠的周期线 94 | if(Bars(_Symbol,_Period)<60) // 如果总柱数少于60 95 | { 96 | Print("我们只有不到60个报价柱,无法用于计算可靠的指标, EA 将要退出!!"); 97 | return; 98 | } 99 | // 当形成新的K线柱时才执行,判断方法:当前K线的成交价次数>1时,则返回 100 | if(Volume[0]>1) return; 101 | // 计算快、慢均线值 102 | double maInFst=iMA(_Symbol,PERIOD_CURRENT, 15,0,MODE_EMA,PRICE_CLOSE,0); 103 | double maInSlw=iMA(_Symbol,PERIOD_CURRENT, 50,0,MODE_SMA,PRICE_CLOSE,0); 104 | double maDirFst=iMA(_Symbol,PERIOD_CURRENT,144,0,MODE_EMA,PRICE_CLOSE,0); 105 | double maDirSlw=iMA(_Symbol,PERIOD_CURRENT,169,0,MODE_EMA,PRICE_CLOSE,0); 106 | CheckForClose(maInFst,maInSlw); 107 | // 持仓情况下不开新仓 108 | if(OrdersTotal()>0) 109 | { 110 | return; 111 | } 112 | Print("开仓信号检测:方向信号【快MA=[",DoubleToString(maDirFst),"],慢MA=[",DoubleToString(maDirSlw),"]】,入场信号【快MA=[",DoubleToString(maInFst),"],慢MA=[",DoubleToString(maInSlw),"]】"); 113 | // 看涨,开多单 114 | if(maInFst > maInSlw && maDirFst > maDirSlw) 115 | { 116 | //发送仓单(当前货币对,卖出方向,手数,买价,滑点=2,无止损,无止赢,EA编号,不过期,标上红色箭头) 117 | Print("【多】单开仓结果:",OrderSend(_Symbol,OP_BUY,Lots,Ask,2,0,0,"",MAGICMA,0,Red)); 118 | return; 119 | } 120 | // 看跌,开空单 121 | if(maInFst < maInSlw && maDirFst < maDirSlw) 122 | { 123 | //发送仓单(当前货币对,买入方向,手数,卖价,滑点=2,无止损,无止赢,EA编号,不过期,标上蓝色箭头) 124 | Print("【空】单开仓结果:",OrderSend(_Symbol,OP_SELL,Lots,Bid,2,0,0,"",MAGICMA,0,Blue)); 125 | return; 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /Indicators/EasyTrend.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Trend-V00.mq4 | 3 | //| Copyright 2017, MetaQuotes Software Corp. | 4 | //| https://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #property copyright "Copyright 2019, 环球外汇网友交流群@Aother,448036253@qq.com" 7 | #property link "https://www.mql5.com" 8 | #property version "1.00" 9 | #property strict 10 | 11 | input int MaSlwPeriod = 100; //慢速均线周期 12 | 13 | input int MaFstPeriod = 60; //快速均线周期 14 | 15 | 16 | //+------------------------------------------------------------------+ 17 | //| Expert initialization function | 18 | //+------------------------------------------------------------------+ 19 | int OnInit() 20 | { 21 | //创建对象 22 | ObjectCreate(0,"lblMaBig",OBJ_LABEL,0,NULL,NULL); 23 | ObjectCreate(0,"lblMaSmall",OBJ_LABEL,0,NULL,NULL); 24 | ObjectCreate(0,"lblAuthor",OBJ_LABEL,0,NULL,NULL); 25 | ObjectCreate(0,"lblConclusion",OBJ_LABEL,0,NULL,NULL); 26 | ObjectCreate(0,"lblAdvice",OBJ_LABEL,0,NULL,NULL); 27 | //设置内容 28 | ObjectSetString(0,"lblMaBig",OBJPROP_TEXT,"4H慢均线"); 29 | ObjectSetString(0,"lblMaSmall",OBJPROP_TEXT,"4H快均线"); 30 | ObjectSetString(0,"lblAuthor",OBJPROP_TEXT,"作者:环球外汇网@Aother"); 31 | ObjectSetString(0,"lblConclusion",OBJPROP_TEXT,"趋势感知"); 32 | ObjectSetString(0,"lblAdvice",OBJPROP_TEXT,"操作建议:无"); 33 | //设置颜色 34 | ObjectSetInteger(0,"lblMaBig",OBJPROP_COLOR,clrHotPink); 35 | ObjectSetInteger(0,"lblMaSmall",OBJPROP_COLOR,clrBlue); 36 | ObjectSetInteger(0,"lblAuthor",OBJPROP_COLOR,clrGray); 37 | ObjectSetInteger(0,"lblAdvice",OBJPROP_COLOR,clrRed); 38 | //--- 定位右上角 39 | ObjectSetInteger(0,"lblMaBig",OBJPROP_CORNER ,CORNER_RIGHT_UPPER); 40 | ObjectSetInteger(0,"lblMaSmall",OBJPROP_CORNER ,CORNER_RIGHT_UPPER); 41 | ObjectSetInteger(0,"lblAuthor",OBJPROP_CORNER,CORNER_RIGHT_UPPER); 42 | ObjectSetInteger(0,"lblConclusion",OBJPROP_CORNER,CORNER_RIGHT_UPPER); 43 | //--- 定位右下角 44 | ObjectSetInteger(0,"lblAdvice",OBJPROP_CORNER,CORNER_RIGHT_LOWER); 45 | //设置XY坐标 46 | ObjectSetInteger(0,"lblMaBig",OBJPROP_XDISTANCE,200); 47 | ObjectSetInteger(0,"lblMaBig",OBJPROP_YDISTANCE,80); 48 | ObjectSetInteger(0,"lblMaSmall",OBJPROP_XDISTANCE,200); 49 | ObjectSetInteger(0,"lblMaSmall",OBJPROP_YDISTANCE,100); 50 | ObjectSetInteger(0,"lblConclusion",OBJPROP_XDISTANCE,200); 51 | ObjectSetInteger(0,"lblConclusion",OBJPROP_YDISTANCE,120); 52 | ObjectSetInteger(0,"lblAuthor",OBJPROP_XDISTANCE,200); 53 | ObjectSetInteger(0,"lblAuthor",OBJPROP_YDISTANCE,140); 54 | ObjectSetInteger(0,"lblAdvice",OBJPROP_XDISTANCE,450); 55 | ObjectSetInteger(0,"lblAdvice",OBJPROP_YDISTANCE,20); 56 | 57 | 58 | return(INIT_SUCCEEDED); 59 | } 60 | //+------------------------------------------------------------------+ 61 | //| Expert deinitialization function | 62 | //+------------------------------------------------------------------+ 63 | void OnDeinit(const int reason) 64 | { 65 | ObjectsDeleteAll(0, 0, OBJ_LABEL); 66 | } 67 | //+------------------------------------------------------------------+ 68 | //| Expert tick function | 69 | //+------------------------------------------------------------------+ 70 | void OnTick() 71 | { 72 | // 趋势感知 73 | // 4H慢均线 74 | double maSlw = iMA(_Symbol,PERIOD_H4,MaSlwPeriod,1,MODE_SMA,PRICE_CLOSE,0); 75 | // 4H快均线 76 | double maFst = iMA(_Symbol,PERIOD_H4,MaFstPeriod,1,MODE_SMA,PRICE_CLOSE,0); 77 | // 当前K柱价格 78 | MqlTick lastTick; 79 | SymbolInfoTick(_Symbol,lastTick); 80 | // 取买价和卖价的均值(各自点差的一半) 81 | double price = (lastTick.bid + lastTick.ask)/2; 82 | string strTMP; 83 | // 精度减少1位,精确到一个点 84 | strTMP = "4H慢均线:%." + IntegerToString((int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)-1) + "f"; 85 | ObjectSetString(0,"lblMaBig",OBJPROP_TEXT,StringFormat(strTMP,maSlw)); 86 | strTMP = "4H快均线:%." + IntegerToString((int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)-1) + "f"; 87 | ObjectSetString(0,"lblMaSmall",OBJPROP_TEXT,StringFormat(strTMP,maFst)); 88 | 89 | // 操作建议 90 | string advice = ""; 91 | // 强势多头,打死坚决不做空,K价下探触及均线时支撑概率较大 92 | if(price > maSlw && price > maFst && maFst > maSlw) 93 | { 94 | ObjectSetString(0,"lblConclusion",OBJPROP_TEXT,"趋势感知:强势多头↑↑↑"); 95 | ObjectSetInteger(0,"lblConclusion",OBJPROP_COLOR,clrLime); 96 | advice = "操作建议:打死坚决不做空"; 97 | } 98 | // 强势空头,打死坚决不做多,K价下探触及均线时支撑概率较大 99 | else if(price < maSlw && price < maFst && maFst < maSlw) 100 | { 101 | ObjectSetString(0,"lblConclusion",OBJPROP_TEXT,"趋势感知:强势空头↓↓↓"); 102 | ObjectSetInteger(0,"lblConclusion",OBJPROP_COLOR,clrHotPink); 103 | advice = "操作建议:打死坚决不做多"; 104 | } 105 | else 106 | { 107 | ObjectSetString(0,"lblConclusion",OBJPROP_TEXT,"趋势感知:无"); 108 | ObjectSetInteger(0,"lblConclusion",OBJPROP_COLOR,clrBlack); 109 | advice = "操作建议:无"; 110 | } 111 | // 显示操作建议 112 | ObjectSetString(0,"lblAdvice",OBJPROP_TEXT,advice); 113 | ObjectSetInteger(0,"lblAdvice",OBJPROP_XDISTANCE,16*StringLen(advice) + 16); 114 | 115 | } 116 | -------------------------------------------------------------------------------- /Indicators/XBands.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| XBands.mq4 | 3 | //| Copyright 2018-2018, MetaQuotes Software Corp. | 4 | //| 自我改造的布林指标,将原始布林的中轨加粗以配合均线系统,可省掉一条均线 | 5 | //+------------------------------------------------------------------+ 6 | #property copyright "2018-2018, MetaQuotes Software Corp." 7 | #property link "http://www.mql4.com" 8 | #property description "XBollinger Bands" 9 | #property strict 10 | 11 | #include 12 | 13 | #property indicator_chart_window 14 | #property indicator_buffers 3 15 | #property indicator_color1 Green 16 | #property indicator_color2 LightSeaGreen 17 | #property indicator_color3 LightSeaGreen 18 | //--- indicator parameters 19 | input int InpBandsPeriod=21; // Bands Period 20 | input int InpBandsShift=0; // Bands Shift 21 | input double InpBandsDeviations=2.0; // Bands Deviations 22 | //--- buffers 23 | double ExtMovingBuffer[]; 24 | double ExtUpperBuffer[]; 25 | double ExtLowerBuffer[]; 26 | double ExtStdDevBuffer[]; 27 | //+------------------------------------------------------------------+ 28 | //| Custom indicator initialization function | 29 | //+------------------------------------------------------------------+ 30 | int OnInit(void) 31 | { 32 | //--- 1 additional buffer used for counting. 33 | IndicatorBuffers(4); 34 | IndicatorDigits(Digits); 35 | //--- middle line 36 | SetIndexStyle(0,DRAW_LINE); 37 | SetIndexBuffer(0,ExtMovingBuffer); 38 | SetIndexShift(0,InpBandsShift); 39 | SetIndexLabel(0,"Bands SMA"); 40 | //--- upper band 41 | SetIndexStyle(1,DRAW_LINE); 42 | SetIndexBuffer(1,ExtUpperBuffer); 43 | SetIndexShift(1,InpBandsShift); 44 | SetIndexLabel(1,"Bands Upper"); 45 | //--- lower band 46 | SetIndexStyle(2,DRAW_LINE); 47 | SetIndexBuffer(2,ExtLowerBuffer); 48 | SetIndexShift(2,InpBandsShift); 49 | SetIndexLabel(2,"Bands Lower"); 50 | //--- work buffer 51 | SetIndexBuffer(3,ExtStdDevBuffer); 52 | //--- check for input parameter 53 | if(InpBandsPeriod<=0) 54 | { 55 | Print("Wrong input parameter Bands Period=",InpBandsPeriod); 56 | return(INIT_FAILED); 57 | } 58 | //--- 59 | SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift); 60 | SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift); 61 | SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift); 62 | //--- initialization done 63 | return(INIT_SUCCEEDED); 64 | } 65 | //+------------------------------------------------------------------+ 66 | //| Bollinger Bands | 67 | //+------------------------------------------------------------------+ 68 | int OnCalculate(const int rates_total, 69 | const int prev_calculated, 70 | const datetime &time[], 71 | const double &open[], 72 | const double &high[], 73 | const double &low[], 74 | const double &close[], 75 | const long &tick_volume[], 76 | const long &volume[], 77 | const int &spread[]) 78 | { 79 | int i,pos; 80 | //--- 81 | if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0) 82 | return(0); 83 | //--- counting from 0 to rates_total 84 | ArraySetAsSeries(ExtMovingBuffer,false); 85 | ArraySetAsSeries(ExtUpperBuffer,false); 86 | ArraySetAsSeries(ExtLowerBuffer,false); 87 | ArraySetAsSeries(ExtStdDevBuffer,false); 88 | ArraySetAsSeries(close,false); 89 | //--- initial zero 90 | if(prev_calculated<1) 91 | { 92 | for(i=0; i1) 101 | pos=prev_calculated-1; 102 | else 103 | pos=0; 104 | //--- main cycle 105 | for(i=pos; i=period) 129 | { 130 | //--- calcualte StdDev 131 | for(int i=0; i1时 67 | if(Volume[0]<=1) { 68 | double heights[1], lows[1]; 69 | CopyHigh(_Symbol,PERIOD_CURRENT,1,1,heights); 70 | CopyLow(_Symbol,PERIOD_CURRENT,1,1,lows); 71 | double height = heights[0]; 72 | double low = lows[0]; 73 | double maDir=iMA(_Symbol,PERIOD_CURRENT,DirMaPeriod,0,MODE_SMA,PRICE_CLOSE,0); 74 | double maDirPre=iMA(_Symbol,PERIOD_CURRENT,DirMaPeriod,1,MODE_SMA,PRICE_CLOSE,0); 75 | // 多头 76 | if(height>=maDir && low>=maDir && maDirPre < maDir){ 77 | inited = true; 78 | direction = true; 79 | } 80 | // 空头 81 | else if(height<=maDir && low<=maDir && maDirPre > maDir){ 82 | inited = true; 83 | direction = false; 84 | } 85 | else{ 86 | inited = false; 87 | } 88 | Print("获取到方向[",direction,"],最高价=[",height,"],最低价=[",low,"],方向ma=[",maDir,"]"); 89 | } 90 | 91 | // 资金管理:计算开仓量 92 | 93 | // 开仓计算 94 | CalcForOpen(); 95 | 96 | } 97 | 98 | //+------------------------------------------------------------------+ 99 | /* 统计当前图表货币的持仓订单数 */ 100 | //+------------------------------------------------------------------+ 101 | int OrdersCount() 102 | { 103 | int count = 0; 104 | // 遍历订单处理 105 | for(int i=0;i0) 135 | { 136 | if(debug)Print("当前货币[",_Symbol,"]开仓数量=[",openCount,"]"); 137 | return; 138 | } 139 | 140 | // 没有获取到方向则不继续 141 | if(!inited) 142 | { 143 | if(debug)Print("没有获取到方向,不开仓"); 144 | return; 145 | } 146 | 147 | // 方向均线值 148 | double maDir=iMA(_Symbol,PERIOD_CURRENT,DirMaPeriod,0,MODE_SMA,PRICE_CLOSE,0); 149 | // 价格tick 150 | MqlTick lastTick; 151 | SymbolInfoTick(_Symbol,lastTick); 152 | 153 | if(direction) 154 | { 155 | // 多:当实时价格触及60均线时(小于或等于均线值),且方向向上,开多单,止损20点,或出现多空反转信号平仓 156 | if(lastTick.bid <= maDir) 157 | { 158 | //发送仓单(当前货币对,卖出方向,手数,买价,滑点=2,止损20点,止赢50点,EA编号,不过期,标上红色箭头) 159 | Print("【多】单开仓结果:",OrderSend(_Symbol,OP_BUY,Lots,Ask,2,Ask-SL*Point,Bid+TP*Point,"",MAGICMA,0,Red)); 160 | return; 161 | } 162 | } 163 | else 164 | { 165 | // 空:当实时价格触及60均线时(大于或等于均线值),且方向向下,开多单,止损20点,或出现多空反转信号平仓 166 | if(lastTick.bid >= maDir) 167 | { 168 | //发送仓单(当前货币对,买入方向,手数,卖价,滑点=2,止损20点,止赢50点,EA编号,不过期,标上蓝色箭头) 169 | Print("【空】单开仓结果:",OrderSend(_Symbol,OP_SELL,Lots,Bid,2,Bid+SL*Point,Ask-TP*Point,"",MAGICMA,0,Blue)); 170 | return; 171 | } 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /Experts/TrendMacd.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| TrendMacd.mq4 | 3 | //| Copyright Aother 448036253@qq.com | 4 | //| http://www.mql4.com | 5 | /* KISS */ 6 | /* Keep It Simple Stupid(保持键和傻瓜化) */ 7 | /* 好的交易系统不必复杂,保持交易系统的简单性可以带来较少的麻烦。 */ 8 | //+------------------------------------------------------------------+ 9 | #property copyright "Copyright 2017, MetaQuotes Software Corp." 10 | #property link "https://www.mql5.com" 11 | #property version "1.00" 12 | #property strict 13 | 14 | //定义本EA操作的订单的唯一标识号码,由此可以实现在同一账户上多系统操作,各操作EA的订单标识码不同,就不会互相误操作。凡是EA皆不可缺少,非常非常重要! 15 | #define MAGICMA 201808031 16 | 17 | //--- 输入 18 | input double Lots =0.01; //每单(手数)的交易量 19 | input double TP =1000; //止盈点数 20 | input double SL =300; //止损点数 21 | 22 | //+------------------------------------------------------------------+ 23 | //| Expert initialization function | 24 | /* 25 | 函数是 初始化 事件处理程序。 必须是空型或者整型,无参数: 26 | 初始化事件处理程序在EA交易或者指标下载后即时生成;它不生成脚本。OnInit()函数用于初始化。如果OnInit()返回值为整型,非零结果意味着初始化失败,生成初始化失败原因代码REASON_INITFAILED 。 27 | 要优化EA交易的输入参数,推荐使用ENUM_INIT_RETCODE枚举值作为返回代码。这些值用于组织优化的过程,包括选择最合适的测试代理。在EA交易的初始化期间测试开始之前您可以使用TerminalInfoInteger() 函数请求一个代理的配置和资源信息(内核数量,空余内存额,等等)。根据所获得的信息,您可以在EA交易优化过程中选择允许使用这个测试代理,或拒绝使用它。 28 | */ 29 | //+------------------------------------------------------------------+ 30 | int OnInit() 31 | { 32 | Print("EA初始化了……"); 33 | return(INIT_SUCCEEDED); 34 | } 35 | 36 | //+------------------------------------------------------------------+ 37 | //| Expert deinitialization function | 38 | /* 39 | 函数称为失败初始化,是初始化失败事件处理程序。必须是空型且有一个包括初始化失败原因代码 的常量整型参数。如果声明不同类型,编译程序会发出警告,但函数不可调用。对于脚本来说不会生成初始化失败事件,因此OnDeinit()函数不用于脚本。 40 | 在以下情况下EA交易和指标生成初始化失败:Deinit事件在以下情况下为EA交易和指标而生成: 41 | 再次初始化前,mql5程序下的交易品种和图表周期发生变化; 42 | 再次初始化前,输入参数发生变化; 43 | mql5程序卸载前。 44 | */ 45 | //+------------------------------------------------------------------+ 46 | void OnDeinit(const int reason) 47 | { 48 | Print("EA运行结束,已经卸载。" ); 49 | } 50 | 51 | //+------------------------------------------------------------------+ 52 | //| Expert tick function | 53 | /* 54 | 仅仅EA交易依附的图表中,交易品种收到新订单号时EA交易会生成 新订单号 事件。自定义指标或者脚本中确定OnTick()函数是无效的,因为订单号事件不为它们而生。 55 | 订单号事件只为EA交易而生,但是却不意味着EA交易需要OnTick()函数,因为EA交易不仅需要生成订单号,也需要生成计时器,预定事件和图表事件。这些都需要空型,无参数: 56 | */ 57 | //+------------------------------------------------------------------+ 58 | void OnTick() 59 | { 60 | // 检测蜡烛图是否足够数量,数量少了不足以形成可靠的周期线 61 | if(Bars(_Symbol,_Period)<60) // 如果总柱数少于60 62 | { 63 | Print("我们只有不到60个报价柱,无法用于计算可靠的指标, EA 将要退出!!"); 64 | return; 65 | } 66 | // 当形成新的K线柱时才执行,判断方法:当前K线的成交价次数>1时,则返回 67 | if(Volume[0]>1) return; 68 | 69 | // 计算当前周期的macd值 70 | // 指标 71 | double indicatorPrev=iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_MAIN,1); 72 | double indicator=iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_MAIN,0); 73 | // 信号 74 | double signalPrev=iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); 75 | double signal=iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); 76 | 77 | // (平空单) 78 | if(indicator>signal) 79 | { 80 | CloseForType(OP_SELL); 81 | } 82 | // (平多单) 83 | if(indicator0 && (indicator>signal && indicatorPrev < signalPrev) && CountOrder(OP_BUY)==0) 90 | { 91 | //发送仓单(当前货币对,卖出方向,手数,买价,滑点=2,止损,止赢,EA编号,不过期,标上红色箭头) 92 | //double stoploss=NormalizeDouble(Bid-SL*Point,Digits); 93 | //double takeprofit=NormalizeDouble(Bid+TP*Point,Digits); 94 | Print("【多】单开仓结果:",OrderSend(_Symbol,OP_BUY,Lots,Ask,2,0,0,"",MAGICMA,0,Red)); 95 | return; 96 | } 97 | 98 | // 信号为空头,死叉下空单 (平多单) 99 | if(signal<0 && (indicator signalPrev) && CountOrder(OP_SELL)==0) 100 | { 101 | //发送仓单(当前货币对,买入方向,手数,卖价,滑点=2,止损,止赢,EA编号,不过期,标上蓝色箭头) 102 | // double stoploss=NormalizeDouble(Ask+SL*Point,Digits); 103 | // double takeprofit=NormalizeDouble(Ask-TP*Point,Digits); 104 | Print("【空】单开仓结果:",OrderSend(_Symbol,OP_SELL,Lots,Bid,2,0,0,"",MAGICMA,0,Blue)); 105 | return; 106 | } 107 | } 108 | 109 | // 统计订单数量 110 | int CountOrder(int OP_Type) 111 | { 112 | int count = 0; 113 | // 遍历订单处理 114 | for(int i=0;i0) 158 | { 159 | if(macdBigMain>=macdBigSignal) 160 | { 161 | ObjectSetString(0,"lblBigPeriod",OBJPROP_TEXT,"MACD大周期:多头趋势"); 162 | advice = "操作建议:打死坚决不做空,宜突破进场、回踩进场,遇支撑涨概率大"; 163 | } 164 | else 165 | { 166 | ObjectSetString(0,"lblBigPeriod",OBJPROP_TEXT,"MACD大周期:多头调整"); 167 | advice = "操作建议:见好就收"; 168 | } 169 | } 170 | else if(macdBigSignal<0) 171 | { 172 | if(macdBigMain<=macdBigSignal) 173 | { 174 | ObjectSetString(0,"lblBigPeriod",OBJPROP_TEXT,"MACD大周期:空头趋势"); 175 | advice = "操作建议:打死坚决不做多,宜突破进场、回踩进场,遇阻回落概率大"; 176 | } 177 | else 178 | { 179 | ObjectSetString(0,"lblBigPeriod",OBJPROP_TEXT,"MACD大周期:空头调整"); 180 | advice = "操作建议:见好就收"; 181 | } 182 | } 183 | else 184 | { 185 | ObjectSetString(0,"lblBigPeriod",OBJPROP_TEXT,"MACD大周期:无信号"); 186 | advice = "操作建议:待定"; 187 | } 188 | 189 | // 当前周期 190 | double a = iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_MAIN,3); 191 | double b = iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_MAIN,2); 192 | double c = iMACD(_Symbol,PERIOD_CURRENT,12,26,9,PRICE_CLOSE,MODE_MAIN,1); 193 | if(macdSignal>0) 194 | { 195 | if(macdMain>=macdSignal) 196 | { 197 | if(a>=b && bc) 216 | { 217 | ObjectSetString(0,"lblMacd",OBJPROP_TEXT,"MACD感知:空头趋势,佛手空"); 218 | } 219 | else 220 | { 221 | ObjectSetString(0,"lblMacd",OBJPROP_TEXT,"MACD感知:空头趋势"); 222 | } 223 | } 224 | else 225 | { 226 | ObjectSetString(0,"lblMacd",OBJPROP_TEXT,"MACD感知:空头调整"); 227 | } 228 | } 229 | else 230 | { 231 | ObjectSetString(0,"lblMacd",OBJPROP_TEXT,"MACD感知:无信号"); 232 | } 233 | 234 | 235 | // 强势多头,打死坚决不做空,K价下探触及均线时支撑概率较大 236 | if(price > maSlw && price > maFst && maFst > maSlw) 237 | { 238 | ObjectSetString(0,"lblMa",OBJPROP_TEXT,"均线感知:多头趋势"); 239 | //ObjectSetInteger(0,"lblMa",OBJPROP_COLOR,clrLime); 240 | //advice = "操作建议:待定"; 241 | } 242 | // 强势空头,打死坚决不做多,K价下探触及均线时支撑概率较大 243 | else if(price < maSlw && price < maFst && maFst < maSlw) 244 | { 245 | ObjectSetString(0,"lblMa",OBJPROP_TEXT,"均线感知:空头趋势"); 246 | //ObjectSetInteger(0,"lblMa",OBJPROP_COLOR,clrHotPink); 247 | //advice = "操作建议:待定"; 248 | } 249 | // 震荡偏空 250 | else if(price < maSlw && price < maFst && maFst > maSlw) 251 | { 252 | ObjectSetString(0,"lblMa",OBJPROP_TEXT,"均线感知:偏空震荡"); 253 | //ObjectSetInteger(0,"lblMa",OBJPROP_COLOR,clrHotPink); 254 | //advice = "操作建议:待定"; 255 | } 256 | // 震荡偏多 257 | else if(price > maSlw && price > maFst && maFst < maSlw) 258 | { 259 | ObjectSetString(0,"lblMa",OBJPROP_TEXT,"均线感知:偏多震荡"); 260 | //ObjectSetInteger(0,"lblMa",OBJPROP_COLOR,clrHotPink); 261 | //advice = "操作建议:待定"; 262 | } 263 | else 264 | { 265 | ObjectSetString(0,"lblMa",OBJPROP_TEXT,"均线感知:震荡"); 266 | //ObjectSetInteger(0,"lblMa",OBJPROP_COLOR,clrBlack); 267 | //advice = "操作建议:待定"; 268 | } 269 | 270 | 271 | // 显示操作建议 272 | ObjectSetString(0,"lblAdvice",OBJPROP_TEXT,advice); 273 | ObjectSetInteger(0,"lblAdvice",OBJPROP_XDISTANCE,13*StringLen(advice) + 13); 274 | 275 | } 276 | //+------------------------------------------------------------------+ 277 | //| Timer function | 278 | //+------------------------------------------------------------------+ 279 | void OnTimer() 280 | { 281 | // 定时刷新计算当前蜡烛剩余时间 282 | long hour = Time[0] + 60 * Period() - TimeCurrent(); 283 | long minute = (hour - hour % 60) / 60; 284 | long second = hour % 60; 285 | ObjectSetString(0,"lblTimer",OBJPROP_TEXT,StringFormat("%s蜡烛剩余:%d分%d秒",_Symbol,minute,second)); 286 | } 287 | //+------------------------------------------------------------------+ 288 | //| ChartEvent function | 289 | //+------------------------------------------------------------------+ 290 | void OnChartEvent(const int id, 291 | const long &lparam, 292 | const double &dparam, 293 | const string &sparam) 294 | { 295 | 296 | } 297 | //+------------------------------------------------------------------+ 298 | --------------------------------------------------------------------------------