Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
Float_v4
//+------------------------------------------------------------+
//| Float.mq4                                                  |
//+------------------------------------------------------------+

#property link      "https://t.me/ForexEaPremium"
#property version   "1.02"
#property strict

#property description "Float - Trend strength, volume, Fibonacci, and Dinapoli levels."

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrBlue
#property indicator_width1 1
#property indicator_label1 "Float Histogram"
#property indicator_color2 clrRed
#property indicator_width2 1
#property indicator_style2 STYLE_SOLID
#property indicator_label2 "Float Line"

input int             Float = 200;
input string          ObjectPrefix = "FI-";
input bool            DisableDinapoli = false;
input bool            DisableFibonacci = false;
input bool            DrawVerticalLinesAsBackground = false;
input color           SwingBorderColor = clrBlue;
input int             SwingBorderWidth = 1;
input ENUM_LINE_STYLE SwingBorderStyle = STYLE_SOLID;
input color           SwingLinesColor = clrRed;
input int             SwingLinesWidth = 1;
input ENUM_LINE_STYLE SwingLinesStyle = STYLE_DOT;
input color           FiboColor = clrGreen;
input int             FiboWidth = 1;
input ENUM_LINE_STYLE FiboStyle = STYLE_DASH;
input color           DinapoliColor = clrRed;
input int             DinapoliWidth = 1;
input ENUM_LINE_STYLE DinapoliStyle = STYLE_DOT;

int prevbars;
double Histogram[];
double Line[];

void OnInit()
{
    IndicatorShortName("Float");

    SetIndexStyle(0, DRAW_HISTOGRAM);
    SetIndexBuffer(0, Histogram);
    SetIndexDrawBegin(0, Float * 2);

    SetIndexStyle(1, DRAW_LINE);
    SetIndexBuffer(1, Line);
    SetIndexDrawBegin(1, Float * 2);
}

void OnDeinit(const int reason)
{
    ObjectsDeleteAll(ChartID(), ObjectPrefix);
    Comment("");
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time_timeseries[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[]
               )
{
    if (Bars - prevbars < 1) return rates_total; // Do not recalculate yet.
    prevbars = Bars;
    
    bool first = true;
    long cumulativeV = 0;
    double FLOATV = 0, high_bar = 0, low_bar = 0;
    int bars_high = 0, bars_low = 0, shift, swing_time = 0, cvstart = 0, cvend = 0;

    int loopbegin = Bars - Float;
    for (shift = loopbegin; shift >= 0; shift--)
    {
        // Find bar counts.
        bars_high = iHighest(NULL, 0, MODE_HIGH, Float, 1);
        bars_low  = iLowest(NULL, 0, MODE_LOW, Float, 1);

        // Find the high and low values over the period.
        high_bar = High[bars_high];
        low_bar  =  Low[bars_low];

        // Find cumulative volume for float period.
        if (bars_high < bars_low) // Uptrend.
        {
            cvstart = bars_low;
            cvend = bars_high;
        }
        else // Downtrend.
        {
            cvstart = bars_high;
            cvend = bars_low;
        }

        if ((first) && (FLOATV == 0))
        {
            for (shift = cvstart; shift >= cvend; shift--)
            {
                FLOATV = FLOATV + Volume[shift];
                first = false;
            }
        }
    }

    // Find float time barcount.
    swing_time = MathAbs(bars_low - bars_high);

    // Find cumulative volume since last turnover.
    for (shift = cvstart; shift >= 0; shift--)
    {
        cumulativeV += Volume[shift];

        if (cumulativeV >= FLOATV) cumulativeV = 0;

        Histogram[shift] = cumulativeV * 0.001; // Blue histogram.
        Line[shift] = FLOATV * 0.001; // Red line.
    }

    Comment(
        "\n", "High was   ", bars_high, "  bars ago",
        "\n", "Low was    ", bars_low, " bars ago", "\n",
        "\n", "Float time was    = ", swing_time, " bars",
        "\n", "Float volume left = ", FLOATV - cumulativeV,
        "\n", "Float volume      = ", FLOATV);

    ObjectDelete(ObjectPrefix + "Swingtop");
    ObjectCreate(ObjectPrefix + "Swingtop", OBJ_TREND, 0, Time[cvstart], high_bar, Time[1], high_bar);
    ObjectSet(ObjectPrefix + "Swingtop", OBJPROP_STYLE, SwingBorderStyle);
    ObjectSet(ObjectPrefix + "Swingtop", OBJPROP_COLOR, SwingBorderColor);
    ObjectSet(ObjectPrefix + "Swingtop", OBJPROP_RAY, 0);
    ObjectSet(ObjectPrefix + "Swingtop", OBJPROP_WIDTH, SwingBorderWidth);

    ObjectDelete(ObjectPrefix + "Swingbottom");
    ObjectCreate(ObjectPrefix + "Swingbottom", OBJ_TREND, 0, Time[cvstart], low_bar, Time[1], low_bar);
    ObjectSet(ObjectPrefix + "Swingbottom", OBJPROP_STYLE, SwingBorderStyle);
    ObjectSet(ObjectPrefix + "Swingbottom", OBJPROP_COLOR, SwingBorderColor);
    ObjectSet(ObjectPrefix + "Swingbottom", OBJPROP_RAY, 0);
    ObjectSet(ObjectPrefix + "Swingbottom", OBJPROP_WIDTH, SwingBorderWidth);

    if ((!DisableDinapoli) || (!DisableFibonacci))
    {
        // Fibonacci.
        ObjectDelete(ObjectPrefix + "Fib23");
        ObjectDelete(ObjectPrefix + "Fib38");
        ObjectDelete(ObjectPrefix + "Fib50");
        ObjectDelete(ObjectPrefix + "Fib62");
        ObjectDelete(ObjectPrefix + "Fib76");
        ObjectDelete(ObjectPrefix + "Fib23t");
        ObjectDelete(ObjectPrefix + "Fib38t");
        ObjectDelete(ObjectPrefix + "Fib50t");
        ObjectDelete(ObjectPrefix + "Fib62t");
        ObjectDelete(ObjectPrefix + "Fib76t");

        ObjectDelete(ObjectPrefix + "Dinap0");
        ObjectDelete(ObjectPrefix + "Dinap1");
        ObjectDelete(ObjectPrefix + "Dinap2");
        ObjectDelete(ObjectPrefix + "Dinap3");
        ObjectDelete(ObjectPrefix + "Dinap4");
        ObjectDelete(ObjectPrefix + "Dinap5");

        double Fib23 = ((high_bar - low_bar) * 0.236) + low_bar;
        double Fib38 = ((high_bar - low_bar) * 0.382) + low_bar;
        double Fib50 = ((high_bar - low_bar) / 2) + low_bar;
        double Fib62 = ((high_bar - low_bar) * 0.618) + low_bar;
        double Fib76 = ((high_bar - low_bar) * 0.764) + low_bar;

        if (!DisableFibonacci)
        {
            ObjectCreate(ObjectPrefix + "Fib23", OBJ_TREND, 0, Time[cvstart], Fib23, Time[1], Fib23);
            ObjectSet(ObjectPrefix + "Fib23", OBJPROP_STYLE, FiboStyle);
            ObjectSet(ObjectPrefix + "Fib23", OBJPROP_COLOR, FiboColor);
            ObjectSet(ObjectPrefix + "Fib23", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Fib23", OBJPROP_WIDTH, FiboWidth);
            ObjectCreate(ObjectPrefix + "Fib23t", OBJ_TEXT, 0, Time[1], Fib23);
            ObjectSetText(ObjectPrefix + "Fib23t", "23.6", 8, "Arial", FiboColor);

            ObjectCreate(ObjectPrefix + "Fib38", OBJ_TREND, 0, Time[cvstart], Fib38, Time[1], Fib38);
            ObjectSet(ObjectPrefix + "Fib38", OBJPROP_STYLE, FiboStyle);
            ObjectSet(ObjectPrefix + "Fib38", OBJPROP_COLOR, FiboColor);
            ObjectSet(ObjectPrefix + "Fib38", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Fib38", OBJPROP_WIDTH, FiboWidth);
            ObjectCreate(ObjectPrefix + "Fib38t", OBJ_TEXT, 0, Time[1], Fib38);
            ObjectSetText(ObjectPrefix + "Fib38t", "38.2", 8, "Arial", FiboColor);

            ObjectCreate(ObjectPrefix + "Fib50", OBJ_TREND, 0, Time[cvstart], Fib50, Time[1], Fib50);
            ObjectSet(ObjectPrefix + "Fib50", OBJPROP_STYLE, STYLE_SOLID);
            ObjectSet(ObjectPrefix + "Fib50", OBJPROP_COLOR, FiboColor);
            ObjectSet(ObjectPrefix + "Fib50", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Fib50", OBJPROP_WIDTH, FiboWidth + 1);
            ObjectCreate(ObjectPrefix + "Fib50t", OBJ_TEXT, 0, Time[1], Fib50);
            ObjectSetText(ObjectPrefix + "Fib50t", "50", 8, "Arial", FiboColor);

            ObjectCreate(ObjectPrefix + "Fib62", OBJ_TREND, 0, Time[cvstart], Fib62, Time[1], Fib62);
            ObjectSet(ObjectPrefix + "Fib62", OBJPROP_STYLE, FiboStyle);
            ObjectSet(ObjectPrefix + "Fib62", OBJPROP_COLOR, FiboColor);
            ObjectSet(ObjectPrefix + "Fib62", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Fib62", OBJPROP_WIDTH, FiboWidth);
            ObjectCreate(ObjectPrefix + "Fib62t", OBJ_TEXT, 0, Time[1], Fib62);
            ObjectSetText(ObjectPrefix + "Fib62t", "61.8", 8, "Arial", FiboColor);

            ObjectCreate(ObjectPrefix + "Fib76", OBJ_TREND, 0, Time[cvstart], Fib76, Time[1], Fib76);
            ObjectSet(ObjectPrefix + "Fib76", OBJPROP_STYLE, FiboStyle);
            ObjectSet(ObjectPrefix + "Fib76", OBJPROP_COLOR, FiboColor);
            ObjectSet(ObjectPrefix + "Fib76", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Fib76", OBJPROP_WIDTH, FiboWidth);
            ObjectCreate(ObjectPrefix + "Fib76t", OBJ_TEXT, 0, Time[1], Fib76);
            ObjectSetText(ObjectPrefix + "Fib76t", "76.4", 8, "Arial", FiboColor);
        }

        // Dinapoli.
        if (!DisableDinapoli)
        {
            double Dinap0 = (low_bar + Fib23) / 2;
            double Dinap1 = (Fib23 + Fib38) / 2;
            double Dinap2 = (Fib38 + Fib50) / 2;
            double Dinap3 = (Fib50 + Fib62) / 2;
            double Dinap4 = (Fib62 + Fib76) / 2;
            double Dinap5 = (high_bar + Fib76) / 2;
            
            ObjectCreate(ObjectPrefix + "Dinap0", OBJ_TREND, 0, Time[cvstart], Dinap0, Time[1], Dinap0);
            ObjectSet(ObjectPrefix + "Dinap0", OBJPROP_STYLE, DinapoliStyle);
            ObjectSet(ObjectPrefix + "Dinap0", OBJPROP_COLOR, DinapoliColor);
            ObjectSet(ObjectPrefix + "Dinap0", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Dinap0", OBJPROP_WIDTH, DinapoliWidth);

            ObjectCreate(ObjectPrefix + "Dinap1", OBJ_TREND, 0, Time[cvstart], Dinap1, Time[1], Dinap1);
            ObjectSet(ObjectPrefix + "Dinap1", OBJPROP_STYLE, DinapoliStyle);
            ObjectSet(ObjectPrefix + "Dinap1", OBJPROP_COLOR, DinapoliColor);
            ObjectSet(ObjectPrefix + "Dinap1", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Dinap1", OBJPROP_WIDTH, DinapoliWidth);

            ObjectCreate(ObjectPrefix + "Dinap2", OBJ_TREND, 0, Time[cvstart], Dinap2, Time[1], Dinap2);
            ObjectSet(ObjectPrefix + "Dinap2", OBJPROP_STYLE, DinapoliStyle);
            ObjectSet(ObjectPrefix + "Dinap2", OBJPROP_COLOR, DinapoliColor);
            ObjectSet(ObjectPrefix + "Dinap2", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Dinap2", OBJPROP_WIDTH, DinapoliWidth);

            ObjectCreate(ObjectPrefix + "Dinap3", OBJ_TREND, 0, Time[cvstart], Dinap3, Time[1], Dinap3);
            ObjectSet(ObjectPrefix + "Dinap3", OBJPROP_STYLE, DinapoliStyle);
            ObjectSet(ObjectPrefix + "Dinap3", OBJPROP_COLOR, DinapoliColor);
            ObjectSet(ObjectPrefix + "Dinap3", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Dinap3", OBJPROP_WIDTH, DinapoliWidth);

            ObjectCreate(ObjectPrefix + "Dinap4", OBJ_TREND, 0, Time[cvstart], Dinap4, Time[1], Dinap4);
            ObjectSet(ObjectPrefix + "Dinap4", OBJPROP_STYLE, DinapoliStyle);
            ObjectSet(ObjectPrefix + "Dinap4", OBJPROP_COLOR, DinapoliColor);
            ObjectSet(ObjectPrefix + "Dinap4", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Dinap4", OBJPROP_WIDTH, DinapoliWidth);

            ObjectCreate(ObjectPrefix + "Dinap5", OBJ_TREND, 0, Time[cvstart], Dinap5, Time[1], Dinap5);
            ObjectSet(ObjectPrefix + "Dinap5", OBJPROP_STYLE, DinapoliStyle);
            ObjectSet(ObjectPrefix + "Dinap5", OBJPROP_COLOR, DinapoliColor);
            ObjectSet(ObjectPrefix + "Dinap5", OBJPROP_RAY, 0);
            ObjectSet(ObjectPrefix + "Dinap5", OBJPROP_WIDTH, DinapoliWidth);
        }
    }

    // Vertical float lines. These draw the lines that calculate the float.
    // If you change "trendline" to "vertical line", it will draw through oscillators too. Might be fun.
    ObjectDelete(ObjectPrefix + "CVSTART");
    ObjectCreate(ObjectPrefix + "CVSTART", OBJ_TREND, 0, Time[cvstart], high_bar, Time[cvstart], low_bar * Point);
    ObjectSet(ObjectPrefix + "CVSTART", OBJPROP_STYLE, SwingBorderStyle);
    ObjectSet(ObjectPrefix + "CVSTART", OBJPROP_COLOR, SwingBorderColor);
    ObjectSet(ObjectPrefix + "CVSTART", OBJPROP_RAY, 0);
    ObjectSet(ObjectPrefix + "CVSTART", OBJPROP_WIDTH, SwingBorderWidth);
    ObjectSet(ObjectPrefix + "CVSTART", OBJPROP_BACK, DrawVerticalLinesAsBackground);

    ObjectDelete(ObjectPrefix + "CVEND");
    ObjectCreate(ObjectPrefix + "CVEND", OBJ_TREND, 0, Time[cvend], high_bar, Time[cvend], low_bar * Point);
    ObjectSet(ObjectPrefix + "CVEND", OBJPROP_STYLE, SwingBorderStyle);
    ObjectSet(ObjectPrefix + "CVEND", OBJPROP_COLOR, SwingBorderColor);
    ObjectSet(ObjectPrefix + "CVEND", OBJPROP_RAY, 0);
    ObjectSet(ObjectPrefix + "CVEND", OBJPROP_WIDTH, SwingBorderWidth);
    ObjectSet(ObjectPrefix + "CVEND", OBJPROP_BACK, DrawVerticalLinesAsBackground);

    // Vertical float predictions. These are time-based only.
    // See blue histogram for real float values.
    // If you change "trendline" to "vertical line", it will draw through oscillators too. Might be fun.
    
    ObjectDelete(ObjectPrefix + "Swingend");
    if (cvend - swing_time > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend", OBJ_TREND, 0, Time[(cvend - swing_time) + 5], high_bar, Time[cvend - swing_time + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend2");
    if (cvend - (swing_time * 2) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend2", OBJ_TREND, 0, Time[(cvend - (swing_time * 2)) + 5], high_bar, Time[cvend - (swing_time * 2) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend2", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend2", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend2", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend2", OBJPROP_WIDTH, SwingLinesWidth);
    }
    
    ObjectDelete(ObjectPrefix + "Swingend3");
    if (cvend - (swing_time * 3) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend3", OBJ_TREND, 0, Time[(cvend - (swing_time * 3)) + 5], high_bar, Time[cvend - (swing_time * 3) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend3", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend3", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend3", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend3", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend4");
    if (cvend - (swing_time * 4) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend4", OBJ_TREND, 0, Time[(cvend - (swing_time * 4)) + 5], high_bar, Time[cvend - (swing_time * 4) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend4", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend4", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend4", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend4", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend5");
    if (cvend - (swing_time * 5) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend5", OBJ_TREND, 0, Time[(cvend - (swing_time * 5)) + 5], high_bar, Time[cvend - (swing_time * 5) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend5", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend5", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend5", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend5", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend6");
    if (cvend - (swing_time * 6) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend6", OBJ_TREND, 0, Time[cvend - (swing_time * 6) + 5], high_bar, Time[cvend - (swing_time * 6) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend6", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend6", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend6", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend6", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend7");
    if (cvend - (swing_time * 7) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend7", OBJ_TREND, 0, Time[cvend - (swing_time * 7) + 5], high_bar, Time[cvend - (swing_time * 7) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend7", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend7", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend7", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend7", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend8");
    if (cvend - (swing_time * 8) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend8", OBJ_TREND, 0, Time[cvend - (swing_time * 8) + 5], high_bar, Time[cvend - (swing_time * 8) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend8", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend8", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend8", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend8", OBJPROP_WIDTH, SwingLinesWidth);
    }

    ObjectDelete(ObjectPrefix + "Swingend9");
    if (cvend - (swing_time * 9) > 0)
    {
        ObjectCreate(ObjectPrefix + "Swingend9", OBJ_TREND, 0, Time[cvend - (swing_time * 9) + 5], high_bar, Time[cvend - (swing_time * 9) + 5], low_bar);
        ObjectSet(ObjectPrefix + "Swingend9", OBJPROP_STYLE, SwingLinesStyle);
        ObjectSet(ObjectPrefix + "Swingend9", OBJPROP_COLOR, SwingLinesColor);
        ObjectSet(ObjectPrefix + "Swingend9", OBJPROP_RAY, 0);
        ObjectSet(ObjectPrefix + "Swingend9", OBJPROP_WIDTH, SwingLinesWidth);
    }

    return rates_total;
}
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---