实例介绍
【实例截图】

【核心代码】
// ------------------------------------------------------------------
//| MACross.mq5 |
//| Copyright 2024, MetaQuotes Software Corp. |
//| https://www.mql5.com |
// ------------------------------------------------------------------
#property copyright "Copyright 2024, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4
// 绘图设置
#property indicator_type1 DRAW_ARROW
#property indicator_type2 DRAW_ARROW
#property indicator_type3 DRAW_TEXT
#property indicator_type4 DRAW_TEXT
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_color3 clrGold
#property indicator_color4 clrLime
#property indicator_label1 "20-60 Death Cross"
#property indicator_label2 "20-60 Gold Cross"
#property indicator_label3 "5-60 Gold Cross"
#property indicator_label4 "5-60 Death Cross"
// 定义缓冲区
double DeathCross20_60[];
double GoldCross20_60[];
double GoldCross5_60[];
double DeathCross5_60[];
// 五角星符号代码
#define STAR_CHAR 110
// ------------------------------------------------------------------
//| Custom indicator initialization function |
// ------------------------------------------------------------------
int OnInit()
{
// 设置指标缓冲区
SetIndexBuffer(0, DeathCross20_60, INDICATOR_DATA);
SetIndexBuffer(1, GoldCross20_60, INDICATOR_DATA);
SetIndexBuffer(2, GoldCross5_60, INDICATOR_DATA);
SetIndexBuffer(3, DeathCross5_60, INDICATOR_DATA);
// 设置箭头属性
PlotIndexSetInteger(0, PLOT_ARROW, STAR_CHAR);
PlotIndexSetInteger(1, PLOT_ARROW, STAR_CHAR);
PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, 0);
PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 0);
PlotIndexSetInteger(0, PLOT_ARROW_SIZE, 8);
PlotIndexSetInteger(1, PLOT_ARROW_SIZE, 8);
// 设置文本属性
PlotIndexSetString(2, PLOT_LABEL, "1");
PlotIndexSetString(3, PLOT_LABEL, "2");
PlotIndexSetInteger(2, PLOT_LABEL_FONT_SIZE, 14);
PlotIndexSetInteger(3, PLOT_LABEL_FONT_SIZE, 14);
// 设置空值
ArrayInitialize(DeathCross20_60, EMPTY_VALUE);
ArrayInitialize(GoldCross20_60, EMPTY_VALUE);
ArrayInitialize(GoldCross5_60, EMPTY_VALUE);
ArrayInitialize(DeathCross5_60, EMPTY_VALUE);
return(INIT_SUCCEEDED);
}
// ------------------------------------------------------------------
//| Custom indicator iteration function |
// ------------------------------------------------------------------
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// 设置数组为时间序列
ArraySetAsSeries(close, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(time, true);
// 需要至少60根K线
if (rates_total < 60)
return(0);
// 计算起始位置
int start;
if (prev_calculated == 0) {
start = 60;
} else {
start = prev_calculated - 1;
}
// 主循环
for (int i = start; i < rates_total && !IsStopped(); i )
{
// 重置缓冲区值
DeathCross20_60[i] = EMPTY_VALUE;
GoldCross20_60[i] = EMPTY_VALUE;
GoldCross5_60[i] = EMPTY_VALUE;
DeathCross5_60[i] = EMPTY_VALUE;
// 计算均线值
double ma5_0 = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, i);
double ma5_1 = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, i-1);
double ma20_0 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i);
double ma20_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i-1);
double ma60_0 = iMA(NULL, 0, 60, 0, MODE_SMA, PRICE_CLOSE, i);
double ma60_1 = iMA(NULL, 0, 60, 0, MODE_SMA, PRICE_CLOSE, i-1);
// 计算动态偏移量(使用ATR)
double atr = iATR(NULL, 0, 14, i);
double offset = atr * 0.5;
// 1. 20日均线死叉60日均线(蓝色五角星)
if (ma20_0 < ma60_0 && ma20_1 >= ma60_1) {
DeathCross20_60[i] = low[i] - offset;
}
// 2. 20日均线金叉60日均线(红色五角星)
if (ma20_0 > ma60_0 && ma20_1 <= ma60_1) {
GoldCross20_60[i] = high[i] offset;
}
// 3. 5日均线金叉60日均线(数字1)
if (ma5_0 > ma60_0 && ma5_1 <= ma60_1) {
GoldCross5_60[i] = high[i] offset * 1.5;
}
// 4. 5日均线死叉60日均线(数字2)
if (ma5_0 < ma60_0 && ma5_1 >= ma60_1) {
DeathCross5_60[i] = low[i] - offset * 1.5;
}
}
return(rates_total);
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论