mql4 TTM Squeeze 指标

bbsqueeze_darkw1b.mq4

//+----------------------------------------------------------------------+
//|                                                        bbsqueeze.mq4 |
//|                    Copyright © 2005, Nick Bilak, beluck[AT]gmail.com |
//|               enhanced a little bit by CJ Rivas, carlos[AT]vealo.com |
//|                               not for sale, rent, auction, nor lease |
//|     https://forex-station.com/viewtopic.php?p=1295400114#p1295400114 |
//+----------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link      "http://metatrader.50webs.com/"

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 clrAqua
#property indicator_color2 clrMagenta
#property indicator_color3 clrTeal
#property indicator_color4 clrViolet
#property indicator_color5 clrRed
#property indicator_width5 4
#property indicator_color6 clrLime
#property indicator_width6 4

//---- input parameters
extern string note1 = "----about Bollinger Band-------------------------------------";
extern int       MovingAveragePeriod = 20;
extern double    BollingerBandDeviation = 2.0;
extern ENUM_MA_METHOD MovingAverageMethod = MODE_SMA;
extern ENUM_APPLIED_PRICE MovingAverageAppliedPrice = PRICE_CLOSE;
extern string note2 = "----about Keltner Channel------------------------------------";
extern int       KeltnerChannelPeriod = 20;
extern double    KeltnerFactor = 1.5;
extern string note3 = "-----------------------------------------";
//extern int       momPrd=12;
//---- buffers
double upB[];
double upB2[];
double loB[];
double loB2[];
double upK[];
double loK[];

int i, j, slippage = 3;
double breakpoint = 0.0;
double ema = 0.0;
int peakf = 0;
int peaks = 0;
int valleyf = 0;
int valleys = 0;
double ccis[61], ccif[61];
double delta = 0;
double ugol = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
    SetIndexStyle(0, DRAW_HISTOGRAM, EMPTY, 3);
    SetIndexBuffer(0, upB);
    SetIndexEmptyValue(0, EMPTY_VALUE);

    SetIndexStyle(1, DRAW_HISTOGRAM, EMPTY, 3);
    SetIndexBuffer(1, loB);
    SetIndexEmptyValue(1, EMPTY_VALUE);

    SetIndexStyle(4, DRAW_ARROW, EMPTY, indicator_width5);
    SetIndexBuffer(4, upK);
    SetIndexEmptyValue(4, EMPTY_VALUE);
    SetIndexArrow(4, 251); //do not trade on red x

    SetIndexStyle(5, DRAW_ARROW, EMPTY, indicator_width6);
    SetIndexBuffer(5, loK);
    SetIndexEmptyValue(5, EMPTY_VALUE);
    SetIndexArrow(5, 159);

    SetIndexStyle(2, DRAW_HISTOGRAM, EMPTY, 3);
    SetIndexEmptyValue(2, EMPTY_VALUE);
    SetIndexBuffer(2, upB2);

    SetIndexStyle(3, DRAW_HISTOGRAM, EMPTY, 3);
    SetIndexEmptyValue(3, EMPTY_VALUE);
    SetIndexBuffer(3, loB2);

//----
    return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----

//----
    return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
    int shift;
    double diff, d, dPrev, std, bbs;

    int counted_bars = IndicatorCounted();
    if(counted_bars < 0)  return(-1);
    if(counted_bars > 0) counted_bars--;
    int limit = Bars - counted_bars;
    if(counted_bars == 0) limit -= 1 + 2 * MovingAveragePeriod;

    for(shift = limit; shift >= 0; shift--) {
        //d=iMomentum(NULL,0,momPrd,PRICE_CLOSE,shift);
        d = LinearRegressionValue(MovingAveragePeriod, shift);
        dPrev = LinearRegressionValue(MovingAveragePeriod, shift + 1);
        if(d > 0) {
            if((dPrev > 0) && (dPrev > d)) {
                upB2[shift] = d;
                upB[shift] = 0;
            } else {
                upB[shift] = d;
                upB2[shift] = 0;
            }
            //upB[shift]=0;
            loB[shift] = 0;
            loB2[shift] = 0;
        } else {
            if((dPrev < 0) && (dPrev < d)) {
                loB2[shift] = d;
                loB[shift] = 0;
            } else {
                loB[shift] = d;
                loB2[shift] = 0;
            }
            upB[shift] = 0;
            upB2[shift] = 0;
            //loB[shift]=d;
        }
        diff = iATR(NULL, 0, KeltnerChannelPeriod, shift) * KeltnerFactor;
        std = iStdDev(NULL, 0, MovingAveragePeriod, MovingAverageMethod, 0, MovingAverageAppliedPrice, shift);
        bbs = BollingerBandDeviation * std / diff;
        if(bbs < 1) {
            upK[shift] = 0;
            loK[shift] = EMPTY_VALUE;
        } else {
            loK[shift] = 0;
            upK[shift] = EMPTY_VALUE;
        }
    }

    return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LinearRegressionValue(int Len, int shift) {
    double SumBars = 0;
    double SumSqrBars = 0;
    double SumY = 0;
    double Sum1 = 0;
    double Sum2 = 0;
    double Slope = 0;

    SumBars = Len * (Len - 1) * 0.5;
    SumSqrBars = (Len - 1) * Len * (2 * Len - 1) / 6;

    for(int x = 0; x <= Len - 1; x++) {
        double HH = Low[x + shift];
        double LL = High[x + shift];
        for(int y = x; y <= (x + Len) - 1; y++) {
            HH = MathMax(HH, High[y + shift]);
            LL = MathMin(LL, Low[y + shift]);
        }
        Sum1 += x * (Close[x + shift] - ((HH + LL) / 2 + iMA(NULL, 0, Len, 0, MovingAverageMethod, MovingAverageAppliedPrice, x + shift)) / 2);
        SumY += (Close[x + shift] - ((HH + LL) / 2 + iMA(NULL, 0, Len, 0, MovingAverageMethod, MovingAverageAppliedPrice, x + shift)) / 2);
    }
    Sum2 = SumBars * SumY;
    double Num1 = Len * Sum1 - Sum2;
    double Num2 = SumBars * SumBars - Len * SumSqrBars;

    if(Num2 != 0.0) {
        Slope = Num1 / Num2;
    } else {
        Slope = 0;
    }

    double Intercept = (SumY - Slope * SumBars) / Len;
    double LinearRegValue = Intercept + Slope * (Len - 1);

    return (LinearRegValue);

}
//+------------------------------------------------------------------+
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇