├── 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 | 
32 | 迄今为止最亮的自定义指标
33 | 
34 |
35 | 
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 |
--------------------------------------------------------------------------------