MT4 超级经典的绝密背离信号指标


根据显示的 蓝色 和 红色 箭头提供买入和卖出信号. 它还有内建的提醒功能. 和最初的指标一样, 牛势背离以绿色线画出而熊势背离用红色线画出. 如果背离是经典类型, 线就是实线儿如果类型是反转的线就是虚线.

值得提醒:在强势涨跌行情下,背离可以持续发生多次背离,直到背离的让猜顶摸底的人绝望。所有以注重顺势而为,在反弹的重点价位参考背离,或者宽幅震荡的时候参考。

点击下载程序与源码 文件大小:3.13 KB

MQL4/ MQL4/Indicators/ MQL4/Indicators/绝密背离信号.mq4 必须读我.txt 策汇在线.url

MQL4/Indicators/绝密背离信号.mq4代码片段:

#property copyright "" #property link "" #property indicator_separate_window #property indicator_buffers 5 #property indicator_color1 LimeGreen #property indicator_color2 FireBrick #property indicator_color3 DodgerBlue #property indicator_color4 Red #property indicator_color5 Black extern string separator1 = "*** OSMA 移动平均震荡设置 ***"; extern int fastEMA = 12; extern int slowEMA = 26; extern int signal = 9; extern string separator2 = "*** 指标参数设置 ***"; extern double positiveSensitivity = 0.0001; extern double negativeSensitivity = -0.0001; extern double historyBarsCount = 0.0; extern bool drawDivergenceLines = TRUE; extern bool displayAlert = TRUE; double g_ibuf_136[]; double g_ibuf_140[]; double g_ibuf_144[]; double g_ibuf_148[]; double g_ibuf_152[]; datetime g_time_156; // 标签显示MACD void ads() { SetLab("ads01", 1, 10, 3, "MACD", 11, "Arial", Red); } // 设置显示标签 void SetLab(string a_name_0, int a_x_8, int a_y_12, int a_corner_16, string a_text_20, int a_fontsize_28, string a_fontname_32, color a_color_40 = -1) { ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0); ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_8); ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_12); ObjectSet(a_name_0, OBJPROP_CORNER, a_corner_16); ObjectSetText(a_name_0, a_text_20, a_fontsize_28, a_fontname_32, a_color_40); } // 初始化 int init() { SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2); SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2); SetIndexStyle(2, DRAW_ARROW); SetIndexStyle(3, DRAW_ARROW); SetIndexStyle(4, DRAW_NONE); SetIndexBuffer(0, g_ibuf_136); SetIndexBuffer(1, g_ibuf_140); SetIndexBuffer(2, g_ibuf_144); SetIndexBuffer(3, g_ibuf_148); SetIndexBuffer(4, g_ibuf_152); SetIndexArrow(2, 233); SetIndexArrow(3, 234); IndicatorDigits(Digits + 2); IndicatorShortName("MACD 1.1 (" + fastEMA + "," + slowEMA + "," + signal + ")"); return (0); } int deinit() { string l_name_4; ads(); for (int li_0 = ObjectsTotal() - 1; li_0 >= 0; li_0--) { l_name_4 = ObjectName(li_0); if (StringSubstr(l_name_4, 0, 14) == "DivergenceLine") ObjectDelete(l_name_4); } return (0); } // 开始指标 int start() { int l_ind_counted_0 = IndicatorCounted(); if (l_ind_counted_0 < 0) l_ind_counted_0 = 0; CalculateIndicator(l_ind_counted_0); return (0); } // 计算指标 void CalculateIndicator(int ai_0) { for (int li_4 = Bars - ai_0; li_4 >= 0; li_4--) { CalculateOsMA(li_4); CatchBullishDivergence(li_4 + 2); CatchBearishDivergence(li_4 + 2); } } // 计算MA void CalculateOsMA(int ai_0) { g_ibuf_152[ai_0] = iOsMA(NULL, 0, fastEMA, slowEMA, signal, PRICE_CLOSE, ai_0); if (g_ibuf_152[ai_0] > 0.0) { g_ibuf_136[ai_0] = g_ibuf_152[ai_0]; g_ibuf_140[ai_0] = 0; return; } if (g_ibuf_152[ai_0] < 0.0) { g_ibuf_140[ai_0] = g_ibuf_152[ai_0]; g_ibuf_136[ai_0] = 0; return; } g_ibuf_136[ai_0] = 0; g_ibuf_140[ai_0] = 0; } // 捕捉看涨(牛市)背离 void CatchBullishDivergence(int ai_0) { int li_4; int li_8; if (IsIndicatorTrough(ai_0) != 0) { li_4 = ai_0; li_8 = GetIndicatorLastTrough(ai_0); if (g_ibuf_152[li_4] > g_ibuf_152[li_8] && Low[li_4] < Low[li_8]) { g_ibuf_144[li_4] = g_ibuf_152[li_4]; if (drawDivergenceLines == TRUE) { DrawPriceTrendLine(Time[li_4], Time[li_8], Low[li_4], Low[li_8], Green, STYLE_SOLID); DrawIndicatorTrendLine(Time[li_4], Time[li_8], g_ibuf_152[li_4], g_ibuf_152[li_8], Green, STYLE_SOLID); } if (displayAlert == TRUE) DisplayAlert("经典多头背离: 做多", li_4); } if (g_ibuf_152[li_4] < g_ibuf_152[li_8] && Low[li_4] > Low[li_8]) { g_ibuf_144[li_4] = g_ibuf_152[li_4]; if (drawDivergenceLines == TRUE) { DrawPriceTrendLine(Time[li_4], Time[li_8], Low[li_4], Low[li_8], Green, STYLE_DOT); DrawIndicatorTrendLine(Time[li_4], Time[li_8], g_ibuf_152[li_4], g_ibuf_152[li_8], Green, STYLE_DOT); } if (displayAlert == TRUE) DisplayAlert("反向多头背离 做空: ", li_4); } } } // 捕获看跌(熊市)背离 void CatchBearishDivergence(int ai_0) { int li_4; int li_8; if (IsIndicatorPeak(ai_0) != 0) { li_4 = ai_0; li_8 = GetIndicatorLastPeak(ai_0); if (g_ibuf_152[li_4] < g_ibuf_152[li_8] && High[li_4] > High[li_8]) { g_ibuf_148[li_4] = g_ibuf_152[li_4]; if (drawDivergenceLines == TRUE) { DrawPriceTrendLine(Time[li_4], Time[li_8], High[li_4], High[li_8], Red, STYLE_SOLID); DrawIndicatorTrendLine(Time[li_4], Time[li_8], g_ibuf_152[li_4], g_ibuf_152[li_8], Red, STYLE_SOLID); } if (displayAlert == TRUE) DisplayAlert("经典空头背离: 做空", li_4); } if (g_ibuf_152[li_4] > g_ibuf_152[li_8] && High[li_4] < High[li_8]) { g_ibuf_148[li_4] = g_ibuf_152[li_4]; if (drawDivergenceLines == TRUE) { DrawPriceTrendLine(Time[li_4], Time[li_8], High[li_4], High[li_8], Red, STYLE_DOT); DrawIndicatorTrendLine(Time[li_4], Time[li_8], g_ibuf_152[li_4], g_ibuf_152[li_8], Red, STYLE_DOT); } if (displayAlert == TRUE) DisplayAlert("反向空头背离: 做多", li_4); } } } int IsIndicatorPeak(int ai_0) { if (g_ibuf_152[ai_0] > positiveSensitivity + 0.0 && g_ibuf_152[ai_0] > g_ibuf_152[ai_0 + 1] && g_ibuf_152[ai_0] > g_ibuf_152[ai_0 - 1]) { for (int li_4 = ai_0 + 1; li_4 < Bars; li_4++) { if (g_ibuf_152[li_4] < 0.0) return (1); if (g_ibuf_152[li_4] > g_ibuf_152[ai_0]) break; } } return (0); } int IsIndicatorTrough(int ai_0) { if (g_ibuf_152[ai_0] < negativeSensitivity + 0.0 && g_ibuf_152[ai_0] < g_ibuf_152[ai_0 + 1] && g_ibuf_152[ai_0] < g_ibuf_152[ai_0 - 1]) { for (int li_4 = ai_0 + 1; li_4 < Bars; li_4++) { if (g_ibuf_152[li_4] > 0.0) return (1); if (g_ibuf_152[li_4] < g_ibuf_152[ai_0]) break; } } return (0); } int GetIndicatorLastPeak(int ai_0) { bool li_4 = FALSE; for (int li_ret_8 = ai_0; li_ret_8 < Bars; li_ret_8++) { if (g_ibuf_152[li_ret_8] > 0.0 && li_4 == FALSE) continue; if (g_ibuf_152[li_ret_8] < 0.0) li_4 = TRUE; else { if (g_ibuf_152[li_ret_8] >= positiveSensitivity) if (g_ibuf_152[li_ret_8] > g_ibuf_152[li_ret_8 + 1] && g_ibuf_152[li_ret_8] > g_ibuf_152[li_ret_8 - 1]) return (li_ret_8); } } return (-1); } // 获取指标通道 int GetIndicatorLastTrough(int ai_0) { bool li_4 = FALSE; for (int li_ret_8 = ai_0; li_ret_8 < Bars; li_ret_8++) { if (g_ibuf_152[li_ret_8] < 0.0 && li_4 == FALSE) continue; if (g_ibuf_152[li_ret_8] > 0.0) li_4 = TRUE; else { if (g_ibuf_152[li_ret_8] <= negativeSensitivity) if (g_ibuf_152[li_ret_8] < g_ibuf_152[li_ret_8 + 1] && g_ibuf_152[li_ret_8] < g_ibuf_152[li_ret_8 - 1]) return (li_ret_8); } } return (-1); } // 显示警报 void DisplayAlert(string as_0, int ai_8) { if (ai_8 <= 2 && Time[ai_8] != g_time_156) { g_time_156 = Time[ai_8]; Alert(as_0, Symbol(), " , ", Period(), " minutes chart"); } } // 绘制价格趋势线 void DrawPriceTrendLine(int a_datetime_0, int a_datetime_4, double a_price_8, double a_price_16, color a_color_24, double a_style_28) { string l_name_36 = "DivergenceLine2.0# " + DoubleToStr(a_datetime_0, 0); ObjectDelete(l_name_36); ObjectCreate(l_name_36, OBJ_TREND, 0, a_datetime_0, a_price_8, a_datetime_4, a_price_16, 0, 0); ObjectSet(l_name_36, OBJPROP_RAY, FALSE); ObjectSet(l_name_36, OBJPROP_COLOR, a_color_24); ObjectSet(l_name_36, OBJPROP_STYLE, a_style_28); } // 绘制指标趋势线 void DrawIndicatorTrendLine(int a_datetime_0, int a_datetime_4, double a_price_8, double a_price_16, color a_color_24, double a_style_28) { string l_name_40; int l_window_36 = WindowFind("FX5_Divergence_v2.0(" + fastEMA + "," + slowEMA + "," + signal + ")"); if (l_window_36 >= 0) { l_name_40 = "DivergenceLine2.0$# " + DoubleToStr(a_datetime_0, 0); ObjectDelete(l_name_40); ObjectCreate(l_name_40, OBJ_TREND, l_window_36, a_datetime_0, a_price_8, a_datetime_4, a_price_16, 0, 0); ObjectSet(l_name_40, OBJPROP_RAY, FALSE); ObjectSet(l_name_40, OBJPROP_COLOR, a_color_24); ObjectSet(l_name_40, OBJPROP_STYLE, a_style_28); } }