Exemplo n.º 1
0
        //populate
        public override void Populate()
        {
            TimeSeries source = Parameters[0].AsTimeSeries;
            TimeSeries ds     = new TimeSeries(source.DateTimes, false);

            ds.Values.AddRange(source.Values);

            Int32 rsiPeriod = Parameters[1].AsInt;
            Int32 wmaPeriod = Parameters[2].AsInt;

            DateTimes = ds.DateTimes;
            int period = Math.Max(rsiPeriod, wmaPeriod);

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }

            var FirstValidValue = Math.Max(rsiPeriod * 3, wmaPeriod);

            if (FirstValidValue > ds.Count)
            {
                FirstValidValue = ds.Count;
            }

            // Clip the raw Put/Call Ratio data
            for (int bar = 0; bar < ds.Count; bar++)
            {
                if (ds[bar] > 0.9)
                {
                    ds[bar] = 0.9;
                }
                else if (ds[bar] < 0.45)
                {
                    ds[bar] = 0.45;
                }
            }
            // TEMA smoothing
            ds = new TEMA_TASC(ds, 5);

            // Rainbow smoothing
            var rbw = new TimeSeries(DateTimes);
            var ma  = new WMA(ds, 2);

            for (int w = 1; w <= 9; w++)
            {
                ma   = new WMA(ma, 2);
                rbw += ma;
            }
            rbw /= 10d;

            rbw = new RSI(rbw, rsiPeriod);
            for (int bar = wmaPeriod - 1; bar < ds.Count; bar++)
            {
                Values[bar] = new WMA(rbw, wmaPeriod)[bar];
            }
        }
        //populate
        public override void Populate()
        {
            BarHistory ds           = Parameters[0].AsBarHistory;
            Int32      period       = Parameters[1].AsInt;
            Int32      periodSmooth = Parameters[1].AsInt;

            DateTimes = ds.DateTimes;

            if (period <= 0 || periodSmooth <= 0 || ds.Count == 0)
            {
                return;
            }

            //Assign first bar that contains indicator data
            var FirstValidValue = Math.Max(periodSmooth, period);

            if (FirstValidValue > ds.Count)
            {
                FirstValidValue = ds.Count;
            }

            if (ds.Count < 2)
            {
                return;
            }

            var _avg = (ds.Open + ds.High + ds.Low + ds.Close) / 4d;

            //TODO fill with 0 in the loop
            var _haOpen = new TimeSeries(DateTimes);
            var _haC    = new TimeSeries(DateTimes);

            _haOpen[0] = _avg[0];
            _haC[0]    = _avg[0];

            for (int bar = 1; bar < ds.Count; bar++)
            {
                _haOpen[bar] = (_avg[bar - 1] + _haOpen[bar - 1]) / 2d;
                _haC[bar]    = (_avg[bar] + _haOpen[bar]
                                + Math.Max(ds.High[bar], _haOpen[bar])
                                + Math.Min(ds.Low[bar], _haOpen[bar])) / 4d;
            }

            var TMA1 = new TEMA_TASC(_haC, periodSmooth);
            var TMA2 = new TEMA_TASC(TMA1, periodSmooth);
            var Diff = TMA1 - TMA2;
            var ZLHA = TMA1 + Diff;

            var temaZLHA = new TEMA_TASC(ZLHA, periodSmooth);
            var _sd      = new StdDev(temaZLHA, period);
            var _wma     = new WMA(temaZLHA, period);

            for (int bar = FirstValidValue; bar < ds.Count; bar++)
            {
                Values[bar] = 100 * (temaZLHA[bar] + 2 * _sd[bar] - _wma[bar]) / (4 * _sd[bar]);
            }
        }
Exemplo n.º 3
0
        //populate
        public override void Populate()
        {
            TimeSeries ds     = Parameters[0].AsTimeSeries;
            Int32      period = Parameters[1].AsInt;

            DateTimes = ds.DateTimes;

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }

            var FirstValidValue = period * 3;

            if (ds == null || ds.Count == 0)
            {
                return;
            }

            var R  = new TimeSeries(DateTimes);
            var SP = new TimeSeries(DateTimes);

            for (int bar = 0; bar < ds.Count; bar++)
            {
                if (bar < period)
                {
                    R[bar] = 0d;
                }
                else
                {
                    R[bar] = (ds[bar] > ds[bar - 1]) ? 1 : -1;
                }
            }

            var sp = new TEMA_TASC(R, period);

            for (int bar = 0; bar < ds.Count; bar++)
            {
                if (bar >= FirstValidValue)
                {
                    Values[bar] = 100 * (sp[bar] / period);
                }
                else
                {
                    Values[bar] = 0d;
                }
            }
        }
Exemplo n.º 4
0
        public override void Populate()
        {
            BarHistory bars     = Parameters[0].AsBarHistory;
            Int32      smooth   = Parameters[1].AsInt;
            Int32      sdPeriod = Parameters[2].AsInt;

            DateTimes = bars.DateTimes;
            var period = Math.Max(smooth, sdPeriod);

            if (period <= 0 || DateTimes.Count == 0 || bars.Count < period)
            {
                return;
            }

            FastSMA    sma     = new FastSMA(bars.Close, 2);
            TimeSeries sma1    = sma * 5;
            TimeSeries sma2    = new FastSMA(sma, 2) * 4;
            TimeSeries sma3    = new FastSMA(new FastSMA(sma, 2), 2) * 3;
            TimeSeries sma4    = new FastSMA(new FastSMA(new FastSMA(sma, 2), 2), 2) * 2;
            TimeSeries sma5    = new FastSMA(new FastSMA(new FastSMA(new FastSMA(sma, 2), 2), 2), 2);
            TimeSeries sma6    = new FastSMA(sma5, 2);
            TimeSeries sma7    = new FastSMA(sma6, 2);
            TimeSeries sma8    = new FastSMA(sma7, 2);
            TimeSeries sma9    = new FastSMA(sma8, 2);
            TimeSeries sma10   = new FastSMA(sma9, 2);
            TimeSeries Rainbow = (sma1 + sma2 + sma3 + sma4 + sma5 + sma6 + sma7 + sma8 + sma9 + sma10) / 20;

            TimeSeries ema1 = new EMA(Rainbow, smooth);
            TimeSeries ema2 = new EMA(ema1, smooth);
            TimeSeries diff = ema1 - ema2;
            TimeSeries ZLRB = ema1 + diff;
            TEMA_TASC  tema = new TEMA_TASC(ZLRB, smooth);
            StdDev     sd   = new StdDev(tema, sdPeriod);
            WMA        wma  = new WMA(tema, sdPeriod);
            var        PB   = (tema + sd * 2 - wma) / (sd * 4) * 100;

            for (int bar = 0; bar < bars.Count; bar++)
            {
                base[bar] = PB[bar];
            }
        }
Exemplo n.º 5
0
        public override void Populate()
        {
            BarHistory bars   = Parameters[0].AsBarHistory;
            Int32      period = Parameters[1].AsInt;
            Double     cutoff = Parameters[2].AsDouble;

            DateTimes = bars.DateTimes;

            if (period <= 0 || DateTimes.Count == 0)
            {
                return;
            }

            #region Create Heikin-Ashi series
            BarHistory haBars = new BarHistory(bars.Symbol.ToString() + " (Heikin-Ashi)", HistoryScale.Daily);
            var        HO     = bars.Open + 0;
            var        HH     = bars.High + 0;
            var        HL     = bars.Low + 0;
            var        HC     = (bars.Open + bars.High + bars.Low + bars.Close) / 4;

            for (int bar = 1; bar < bars.Count; bar++)
            {
                double o1 = HO[bar - 1];
                double c1 = HC[bar - 1];
                HO[bar] = (o1 + c1) / 2;
                HH[bar] = Math.Max(HO[bar], bars.High[bar]);
                HL[bar] = Math.Min(HO[bar], bars.Low[bar]);

                haBars.Add(bars.DateTimes[bar], HO[bar], HH[bar], HL[bar], HC[bar], bars.Volume[bar]);
            }
            #endregion

            //Smooth Heikin-Ashi closing price
            HC = new TEMA_TASC(HC, Math.Max((int)1, Convert.ToInt32(period / 1.6d)));

            //Medium term MA of Volume to limit extremes and division factor
            var vave = new SMA(bars.Volume, period * 5) >> 1;
            var vmax = vave * 2;
            var vc   = new TimeSeries(DateTimes);
            for (int bar = 0; bar < bars.Count; bar++)
            {
                if (bars.Volume[bar] < vmax[bar])
                {
                    vc[bar] = bars.Volume[bar];
                }
                else
                {
                    vc[bar] = vmax[bar];
                }
            }

            //Basic volume trend
            var vtr = new TEMA_TASC(new LRSlope(bars.Volume, period), period);

            //SVAPO result of price and volume}
            var tempSeries = new TimeSeries(DateTimes);

            for (int bar = 2; bar < bars.Count; bar++)
            {
                double temp = 0;

                bool hcRising          = HC[bar] > (HC[bar - 1] * (1 + cutoff / 1000d));
                bool hcDeclining       = HC[bar] < (HC[bar - 1] * (1 - cutoff / 1000d));
                bool lame2PeriodAlert1 = (vtr[bar] >= vtr[bar - 1]) || (vtr[bar - 1] >= vtr[bar - 2]);
                bool lame2PeriodAlert2 = (vtr[bar] > vtr[bar - 1]) || (vtr[bar - 1] > vtr[bar - 2]);

                temp = (hcRising && lame2PeriodAlert1) ? vc[bar] :
                       (hcDeclining && lame2PeriodAlert2) ? -vc[bar] : 0;

                tempSeries[bar] = temp;
            }

            var sumSeries = tempSeries.Sum(period);
            var svapo     = new TEMA_TASC((sumSeries + vave + 1), period);

            for (int bar = period; bar < bars.Count; bar++)
            {
                Values[bar] = svapo[bar];
            }
        }
Exemplo n.º 6
0
        //populate
        public override void Populate()
        {
            BarHistory bars         = Parameters[0].AsBarHistory;
            Int32      period       = Parameters[1].AsInt;
            Double     CandleSize   = Parameters[2].AsDouble;
            Int32      setuptimeout = Parameters[3].AsInt;
            Int32      ShLTAvg      = Parameters[4].AsInt;

            DateTimes = bars.DateTimes;

            if (period <= 0 || bars.Count == 0)
            {
                return;
            }

            var FirstValidValue = Math.Max(ShLTAvg, period);
            //base.FirstValidValue = Math.Max(ShLTAvg, period) * 3;

            int  setup1bar = -1; int setup2bar = -1;
            bool keep1 = false; bool keep2 = false; bool keep3 = false;
            bool keeping = false; bool keepall = false; int keepallBar = -1;
            bool keep1d = false; bool keep2d = false; bool keep3d = false;
            bool keepingd = false; bool keepalld = false;
            int  keepallBard = -1; int keepingdBar = -1; int keepingBar = -1;
            bool utr = false; int utrBar = -1; int dtrBar = -1; bool dtr = false;
            bool upw = true; bool dnw = true; int lastOccurenceForLTResult = -1;
            int  i_result = 0; int LTResult = 0; int final_result = 0;

            /* Create LT Average */

            EMA LTAverage = new EMA(bars.Close, ShLTAvg);

            /* Create Heikin-Ashi candles */

            var HO  = bars.Open + 0;
            var HH  = bars.High + 0;
            var HL  = bars.Low + 0;
            var HC  = (bars.Open + bars.High + bars.Low + bars.Close) / 4;
            var haC = HC + 0;

            //haC.Description = "Heikin-Ashi Close";

            for (int bar = 1; bar < bars.Count; bar++)
            {
                double o1 = HO[bar - 1];
                double c1 = HC[bar - 1];
                HO[bar]  = (o1 + c1) / 2;
                HH[bar]  = Math.Max(HO[bar], bars.High[bar]);
                HL[bar]  = Math.Min(HO[bar], bars.Low[bar]);
                haC[bar] = (HC[bar] + HO[bar] + HH[bar] + HL[bar]) / 4;
            }

            /* Create "Crossover Formula" */

            var TMA1         = new TEMA_TASC(haC, period);
            var TMA2         = new TEMA_TASC(TMA1, period);
            var Diff         = TMA1 - TMA2;
            var ZlHa         = TMA1 + Diff;
            var AveragePrice = (bars.High + bars.Low) / 2;

            TMA1 = new TEMA_TASC(AveragePrice, period);
            TMA2 = new TEMA_TASC(TMA1, period);
            Diff = TMA1 - TMA2;
            var ZlCl  = TMA1 + Diff;
            var ZlDif = ZlCl - ZlHa;

            //ZlDif.Description = "Crossover formula (" + period + ")";

            for (int bar = FirstValidValue; bar < bars.Count; bar++)
            {
                /* Create green candle */

                // Metastock Alert function resource:
                // http://www.meta-formula.com/metastock-alert-function.html

                //20190228 evaluate the "new condition" on each bar
                bool newCondition = (bars.Close[bar] > haC[bar]) || (bars.High[bar] > bars.High[bar - 1] || bars.Low[bar] > bars.Low[bar - 1]);

                if (!keep1)
                {
                    if (haC[bar] >= HO[bar] || newCondition)
                    {
                        keep1     = true;
                        setup1bar = bar;
                    }
                }
                if (keep1)
                {
                    keep1 = bar + 1 - setup1bar < setuptimeout;
                }

                keep2 = (ZlDif[bar] >= 0);
                //keeping = (keep1 || keep2);
                keeping = ((keep1 || newCondition) || keep2);                   //20190228 "newCondition" should rather be evaluated on each bar

                // Save bar when "keeping" is true
                if (keeping)
                {
                    keepingBar = bar;
                }
                else
                {
                    keepingBar = 0;
                }

                keepall = keeping || (
                    // Implements Ref(keeping,-1)
                    ((keepingBar > 0) & (bar == keepingBar + 1)) &
                    (bars.Close[bar] >= bars.Open[bar]) | (bars.Close[bar] >= bars.Close[bar - 1]));

                // Save bar when "keepall" is true
                if (keepall == true)
                {
                    keepallBar = bar;
                }
                else
                {
                    keepallBar = 0;
                }

                keep3 = ((bars.Close - bars.Open).Abs()[bar] < ((bars.High[bar] - bars.Low[bar]) * CandleSize)) &
                        (bars.High[bar] >= bars.Low[bar - 1]);

                utr = keepall ||
                      // Implements Ref(keepall,-1)
                      ((keepallBar > 0) & (bar == keepallBar + 1) & keep3);

                if (utr == true)
                {
                    utrBar = bar;
                }
                else
                {
                    utrBar = 0;
                }


                /* Create red candle */

                // Metastock Alert function resource:
                // http://www.meta-formula.com/metastock-alert-function.html

                if (!keep1d)
                {
                    if (haC[bar] < HO[bar])
                    {
                        keep1d    = true;
                        setup2bar = bar;
                    }
                }
                if (keep1d)
                {
                    keep1d = bar + 1 - setup2bar < setuptimeout;
                }

                keep2d = (ZlDif[bar] < 0);
                keep3d = ((bars.Close - bars.Open).Abs()[bar] < ((bars.High[bar] - bars.Low[bar]) * CandleSize)) &
                         (bars.Low[bar] <= bars.High[bar - 1]);

                keepingd = (keep1d || keep2d);

                // Save bar when "keeping" is true
                if (keepingd)
                {
                    keepingdBar = bar;
                }
                else
                {
                    keepingdBar = 0;
                }

                keepalld = keepingd || (
                    // Implements Ref(keeping,-1)
                    ((keepingdBar > 0) & (bar == keepingdBar + 1)) &
                    (bars.Close[bar] < bars.Open[bar]) | (bars.Close[bar] < bars.Close[bar - 1]));

                // Save bar when "keepall" is true
                if (keepalld == true)
                {
                    keepallBard = bar;
                }
                else
                {
                    keepallBard = 0;
                }

                dtr = keepalld ||
                      // Implements Ref(keepall,-1)
                      ((keepallBard > 0) & ((bar == keepallBard + 1) & keep3d));

                if (dtr == true)
                {
                    dtrBar = bar;
                }
                else
                {
                    dtrBar = 0;
                }

                upw = !dtr || (((dtrBar > 0) & (bar == dtrBar + 1)) & utr);
                dnw = !utr || (((utrBar > 0) & (bar == utrBar + 1)) & dtr);

                /* HACOLT */

                //ValueWhen
                //http://www.meta-formula.com/metastock-valuewhen-function.html
                //Result:=If(upw,1, If(dnw,0, ValueWhen(1,upw+dnw,If(upw,1,0))));

                if (upw)
                {
                    i_result = 1;
                    lastOccurenceForLTResult = 1;
                }
                else
                if (dnw)
                {
                    i_result = 0;
                    lastOccurenceForLTResult = 0;
                }
                else
                {
                    if (lastOccurenceForLTResult > -1)
                    {
                        i_result = lastOccurenceForLTResult;
                    }
                }

                bool LTSell = bars.Close[bar] < LTAverage[bar];
                LTResult     = (i_result == 1) ? 1 : (i_result == 0 && LTSell) ? 0 : LTResult;
                final_result = (i_result == 1) ? 100 : (i_result == 0 && LTResult == 1) ? 50 : (i_result == 0 && LTResult == 0) ? 0 : final_result;

                Values[bar] = final_result;
            }
        }
Exemplo n.º 7
0
        //populate
        public override void Populate()
        {
            BarHistory bars    = Parameters[0].AsBarHistory;
            Int32      period  = Parameters[1].AsInt;
            Int32      timeout = Parameters[2].AsInt;

            DateTimes = bars.DateTimes;

            if (period <= 0 || bars.Count == 0)
            {
                return;
            }

            int  setup1bar = -1, setup2bar = -1, keepallBar = -1, keepallBard = -1, keepingdBar = -1, keepingBar = -1, utrBar = -1, dtrBar = -1;
            bool keep1 = false, keep2 = false, keep3 = false, keeping = false, keepall = false, keep1d = false, keep2d = false, keep3d = false,
                 keepingd = false, keepalld = false, utr = false, dtr = false, upw = true, dnw = true, result = true;

            /* Create Heikin-Ashi candles */

            var HO  = bars.Open + 0;
            var HH  = bars.High + 0;
            var HL  = bars.Low + 0;
            var HC  = (bars.Open + bars.High + bars.Low + bars.Close) / 4;
            var haC = HC + 0;

            //haC.Description = "Heikin-Ashi Close";

            for (int bar = 1; bar < bars.Count; bar++)
            {
                double o1 = HO[bar - 1];
                double c1 = HC[bar - 1];
                HO[bar]  = (o1 + c1) / 2;
                HH[bar]  = Math.Max(HO[bar], bars.High[bar]);
                HL[bar]  = Math.Min(HO[bar], bars.Low[bar]);
                haC[bar] = (HC[bar] + HO[bar] + HH[bar] + HL[bar]) / 4;
            }

            /* Create "Crossover Formula" */

            var TMA1         = new TEMA_TASC(haC, period);
            var TMA2         = new TEMA_TASC(TMA1, period);
            var Diff         = TMA1 - TMA2;
            var ZlHa         = TMA1 + Diff;
            var AveragePrice = (bars.High + bars.Low) / 2;

            TMA1 = new TEMA_TASC(AveragePrice, period);
            TMA2 = new TEMA_TASC(TMA1, period);
            Diff = TMA1 - TMA2;
            var ZlCl  = TMA1 + Diff;
            var ZlDif = ZlCl - ZlHa;

            //ZlDif.Description = "Crossover formula (" + period + ")";

            for (int bar = period; bar < bars.Count; bar++)
            {
                /* Create green candle */

                // Metastock Alert function resource:
                // http://www.meta-formula.com/metastock-alert-function.html

                bool newCondition = (bars.Close[bar] > haC[bar]) || (bars.High[bar] > bars.High[bar - 1] || bars.Low[bar] > bars.Low[bar - 1]);

                if (!keep1)
                {
                    if (haC[bar] >= HO[bar])
                    {
                        keep1     = true;
                        setup1bar = bar;
                    }
                }
                if (keep1)
                {
                    keep1 = bar + 1 - setup1bar < timeout;
                }

                keep2 = (ZlDif[bar] >= 0);
                //keeping = ( keep1 || keep2 );
                keeping = ((keep1 || newCondition) || keep2);                   //20190217 "newCondition" should be evaluated on each bar

                // Save bar when "keeping" is true
                if (keeping)
                {
                    keepingBar = bar;
                }
                else
                {
                    keepingBar = 0;
                }

                keepall = keeping || (
                    // Implements Ref(keeping,-1)
                    ((keepingBar > 0) & (bar == keepingBar + 1)) &
                    (bars.Close[bar] >= bars.Open[bar]) | (bars.Close[bar] >= bars.Close[bar - 1]));

                // Save bar when "keepall" is true
                if (keepall == true)
                {
                    keepallBar = bar;
                }
                else
                {
                    keepallBar = 0;
                }

                keep3 = ((bars.Close - bars.Open).Abs()[bar] < ((bars.High[bar] - bars.Low[bar]) * 0.35)) &
                        (bars.High[bar] >= bars.Low[bar - 1]);

                utr = keepall ||
                      // Implements Ref(keepall,-1)
                      ((keepallBar > 0) & (bar == keepallBar + 1) & keep3);
                if (utr == true)
                {
                    utrBar = bar;
                }
                else
                {
                    utrBar = 0;
                }


                /* Create red candle */

                // Metastock Alert function resource:
                // http://www.meta-formula.com/metastock-alert-function.html

                if (!keep1d)
                {
                    if (haC[bar] < HO[bar])
                    {
                        keep1d    = true;
                        setup2bar = bar;
                    }
                }
                if (keep1d)
                {
                    keep1d = bar + 1 - setup2bar < timeout;
                }

                keep2d = (ZlDif[bar] < 0);
                keep3d = ((bars.Close - bars.Open).Abs()[bar] < ((bars.High[bar] - bars.Low[bar]) * 0.35)) &
                         (bars.Low[bar] <= bars.High[bar - 1]);

                keepingd = (keep1d || keep2d);

                // Save bar when "keeping" is true
                if (keepingd)
                {
                    keepingdBar = bar;
                }
                else
                {
                    keepingdBar = 0;
                }

                keepalld = keepingd || (
                    // Implements Ref(keeping,-1)
                    ((keepingdBar > 0) & (bar == keepingdBar + 1)) &
                    (bars.Close[bar] < bars.Open[bar]) | (bars.Close[bar] < bars.Close[bar - 1]));

                // Save bar when "keepall" is true
                if (keepalld == true)
                {
                    keepallBard = bar;
                }
                else
                {
                    keepallBard = 0;
                }

                dtr = keepalld ||
                      // Implements Ref(keepall,-1)
                      ((keepallBard > 0) & ((bar == keepallBard + 1) & keep3d));
                if (dtr == true)
                {
                    dtrBar = bar;
                }
                else
                {
                    dtrBar = 0;
                }

                upw = !dtr || (((dtrBar > 0) & (bar == dtrBar + 1)) & utr);
                dnw = !utr || (((utrBar > 0) & (bar == utrBar + 1)) & dtr);

                // Metastock's PREV is statement-based
                result = (upw) ? true : (dnw) ? false : result;

                /* HACO */

                if (result)
                {
                    Values[bar] = 1;
                }
                else
                {
                    Values[bar] = 0;
                }
            }
        }