Ejemplo n.º 1
0
            public Recordset Keltner(Navigator pNav, Recordset pOHLCV, int Periods, double Factor, IndicatorType MAType, string Alias)
            {   // Same as STARC
                Recordset Results     = new Recordset();
                int       recordCount = pOHLCV.GetField("Close").RecordCount;
                Field     top         = new Field();

                top.Initialize(recordCount, Alias + " Top");
                Field bottom = new Field();

                bottom.Initialize(recordCount, Alias + " Bottom");
                Oscillator    os     = new Oscillator();
                Field         tr     = os.TrueRange(pNav, pOHLCV, "atr").GetField("atr");
                MovingAverage ma     = new MovingAverage();
                Field         atr    = ma.SimpleMovingAverage(pNav, tr, Periods, "atr").GetField("atr");
                Field         median = ma.MovingAverageSwitch(pNav, pOHLCV.GetField("Close"), Periods, MAType, Alias + " Median").GetField(Alias + " Median");

                for (int record = 1; record < recordCount + 1; record++)
                {
                    double shift = Factor * atr.ValueEx(record);
                    top.SetValue(record, median.Value(record) + shift);
                    bottom.SetValue(record, median.Value(record) - shift);
                }

                Results.AddField(top);
                Results.AddField(median);
                Results.AddField(bottom);

                return(Results);
            }
Ejemplo n.º 2
0
            ///<summary>
            /// High Low Bands
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="HighPrice">Field High Price</param>
            ///<param name="LowPrice">Field Low Price</param>
            ///<param name="ClosePrice">Field ClosePrice</param>
            ///<param name="periods">Periods</param>
            ///<returns>Recordset</returns>
            public Recordset HighLowBands(Navigator pNav, Field HighPrice, Field LowPrice, Field ClosePrice, int periods)
            {
                MovingAverage MA      = new MovingAverage();
                Recordset     Results = new Recordset();

                if (periods < 6 || periods > pNav.RecordCount)
                {
                    return(null);
                }

                Recordset RS1 = MA.VIDYA(pNav, HighPrice, periods, 0.8, "High Low Bands Top");
                Recordset RS2 = MA.VIDYA(pNav, ClosePrice, periods / 2, 0.8, "High Low Bands Median");
                Recordset RS3 = MA.VIDYA(pNav, LowPrice, periods, 0.8, "High Low Bands Bottom");

                Results.AddField(RS1.GetField("High Low Bands Top"));
                Results.AddField(RS2.GetField("High Low Bands Median"));
                Results.AddField(RS3.GetField("High Low Bands Bottom"));

                // Remove fields so recordset can be deleted
                RS1.RemoveField("High Low Bands Top");
                RS2.RemoveField("High Low Bands Median");
                RS3.RemoveField("High Low Bands Bottom");

                pNav.MoveFirst();
                return(Results);
            }
Ejemplo n.º 3
0
            ///<summary>
            /// Commodity Channel Index
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV Recordset</param>
            ///<param name="periods">Periods</param>
            ///<param name="Alias">Alias</param>
            ///<returns>Recordset</returns>
            public Recordset CommodityChannelIndex(Navigator pNav, Recordset pOHLCV, int periods, string Alias)
            {
                General       GN      = new General();
                MovingAverage MA      = new MovingAverage();
                Recordset     Results = new Recordset();
                int           Record;

                int   RecordCount = pNav.RecordCount;
                Field Field1      = new Field(RecordCount, Alias);

                Recordset TPrs = GN.TypicalPrice(pNav, pOHLCV, "TP");
                Recordset MArs = MA.SimpleMovingAverage(pNav, TPrs.GetField("TP"), periods, "TPMA");

                for (Record = 1; Record != (2 * periods) + 1; ++Record)
                {
                    Field1.Value(Record, 0);
                }

                for (Record = (2 * periods); Record != RecordCount + 1; ++Record)
                {
                    double dMeanDeviation = 0;
                    double dTmp;
                    int    Count;
                    for (Count = (Record - periods); Count != Record + 1; ++Count)
                    {
                        double?d1 = TPrs.GetField("TP").Value(Count);
                        double?d2 = MArs.GetField("TPMA").Value(Count);
                        d1             = d1.HasValue ? d1 : 0.0;
                        d2             = d2.HasValue ? d2 : 0.0;
                        dTmp           = Math.Abs(d1.Value - d2.Value);
                        dMeanDeviation = dMeanDeviation + dTmp;
                    } //Count
                    dMeanDeviation = dMeanDeviation / periods;
                    dTmp           = (double)((TPrs.GetField("TP").Value(Record) - MArs.GetField("TPMA").Value(Record)) / (dMeanDeviation * 0.015));
                    Field1.Value(Record, dTmp);
                } //Record

                pNav.MoveFirst();
                Results.AddField(Field1);

                return(Results);
            }
Ejemplo n.º 4
0
            ///<summary>
            /// Median Price
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV RecordSet</param>
            ///<param name="Alias">Alias</param>
            ///<returns>Recordset</returns>
            public Recordset MedianPrice(Navigator pNav, Recordset pOHLCV, string Alias)
            {
                Recordset Results = new Recordset();
                int       Record;

                int   RecordCount = pNav.RecordCount;
                Field Field1      = new Field(RecordCount, Alias);

                pNav.MoveFirst();
                for (Record = 1; Record < RecordCount + 1; Record++)
                {
                    double Value = (pOHLCV.GetField("High").Value(Record).Value + pOHLCV.GetField("Low").Value(Record).Value) / 2;
                    Field1.Value(Record, Value);
                    pNav.MoveNext();
                } //Record

                pNav.MoveFirst();
                Results.AddField(Field1);
                return(Results);
            }
Ejemplo n.º 5
0
            ///<summary>
            /// Mass Index
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV Recordset</param>
            ///<param name="periods">Periods</param>
            ///<param name="Alias">Alias</param>
            ///<returns>Recordset</returns>
            public Recordset MassIndex(Navigator pNav, Recordset pOHLCV, int periods, string Alias)
            {
                Recordset     Results = new Recordset();
                General       GE      = new General();
                MovingAverage MA      = new MovingAverage();
                int           Record;

                int RecordCount = pNav.RecordCount;

                if (periods < 1 || periods > RecordCount)
                {
                    return(null);
                }

                Field Field1 = new Field(RecordCount, Alias);

                Recordset HML  = GE.HighMinusLow(pNav, pOHLCV, "HML");
                Field     Temp = HML.GetField("HML");
                Recordset EMA1 = MA.ExponentialMovingAverage(pNav, Temp, 9, "EMA");

                Temp = EMA1.GetField("EMA");
                Recordset EMA2 = MA.ExponentialMovingAverage(pNav, Temp, 9, "EMA");

                int Start = (periods * 2) + 1;

                pNav.Position = Start;
                for (Record = Start; Record < RecordCount + 2; Record++)
                {
                    double?Sum = 0;

                    pNav.Position = Record - periods;
                    int Period;
                    for (Period = 1; Period < periods + 1; Period++)
                    {
                        Sum = Sum + (EMA1.Value("EMA", pNav.Position) / EMA2.Value("EMA", pNav.Position));
                        pNav.MoveNext();
                    }//Period
                    pNav.MovePrevious();
                    Field1.Value(pNav.Position, Sum);

                    pNav.MoveNext();
                }//Record

                pNav.MoveFirst();
                Results.AddField(Field1);

                return(Results);
            }
Ejemplo n.º 6
0
            ///<summary>
            /// Stochastic Momentum Index
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV Recordser</param>
            ///<param name="KPeriods">K Periods</param>
            ///<param name="KSmooth">K Smooth</param>
            ///<param name="KDoubleSmooth">K Double Smooth</param>
            ///<param name="DPeriods">D Periods</param>
            ///<param name="MAType">Moving Average Type</param>
            ///<param name="PctD_MAType">%D Movering Average Type</param>
            ///<returns>Recordset</returns>
            public Recordset StochasticMomentumIndex(Navigator pNav, Recordset pOHLCV, int KPeriods, int KSmooth, int KDoubleSmooth,
                                                     int DPeriods, IndicatorType MAType, IndicatorType PctD_MAType)
            {
                MovingAverage MA      = new MovingAverage();
                Recordset     Results = new Recordset();
                General       GN      = new General();
                int           Record;
                double?       Value = 0;

                KSmooth += 1;
                int RecordCount = pNav.RecordCount;

                Field Field1 = new Field(RecordCount, "%K");


                Recordset Temp = GN.HHV(pNav, pOHLCV.GetField("High"), KPeriods, "HHV");
                Field     HHV  = new Field(RecordCount, "HHV");

                Temp.CopyField(HHV, "HHV");

                Temp = GN.LLV(pNav, pOHLCV.GetField("Low"), KPeriods, "LLV");
                Field LLV = new Field(RecordCount, "LLV");

                Temp.CopyField(LLV, "LLV");


                Field HHLL = new Field(RecordCount, "HHLL");

                for (Record = 1; Record != RecordCount + 1; ++Record)
                {
                    Value = HHV.Value(Record) - LLV.Value(Record);
                    HHLL.Value(Record, Value);
                }


                Field CHHLL = new Field(RecordCount, "CHHLL");

                for (Record = 1; Record != RecordCount + 1; ++Record)
                {
                    Value = pOHLCV.Value("Close", Record) - (0.5f * (HHV.Value(Record) + LLV.Value(Record)));
                    CHHLL.Value(Record, Value);
                }

                if (KSmooth > 1)
                {
                    switch (MAType)
                    {
                    case IndicatorType.SimpleMovingAverage:
                        Temp = MA.SimpleMovingAverage(pNav, CHHLL, KSmooth, "CHHLL");
                        break;

                    case IndicatorType.ExponentialMovingAverage:
                        Temp = MA.ExponentialMovingAverage(pNav, CHHLL, KSmooth, "CHHLL");
                        break;

                    case IndicatorType.TimeSeriesMovingAverage:
                        Temp = MA.TimeSeriesMovingAverage(pNav, CHHLL, KSmooth, "CHHLL");
                        break;

                    case IndicatorType.TriangularMovingAverage:
                        Temp = MA.TriangularMovingAverage(pNav, CHHLL, KSmooth, "CHHLL");
                        break;

                    case IndicatorType.VariableMovingAverage:
                        Temp = MA.VariableMovingAverage(pNav, CHHLL, KSmooth, "CHHLL");
                        break;

                    case IndicatorType.WeightedMovingAverage:
                        Temp = MA.WeightedMovingAverage(pNav, CHHLL, KSmooth, "CHHLL");
                        break;

                    case IndicatorType.VIDYA:
                        Temp = MA.VIDYA(pNav, CHHLL, KSmooth, 0.65, "CHHLL");
                        break;
                    }

                    Temp.CopyField(CHHLL, "CHHLL");
                }


                if (KDoubleSmooth > 1)
                {
                    switch (MAType)
                    {
                    case IndicatorType.SimpleMovingAverage:
                        Temp = MA.SimpleMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL");
                        break;

                    case IndicatorType.ExponentialMovingAverage:
                        Temp = MA.ExponentialMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL");
                        break;

                    case IndicatorType.TimeSeriesMovingAverage:
                        Temp = MA.TimeSeriesMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL");
                        break;

                    case IndicatorType.TriangularMovingAverage:
                        Temp = MA.TriangularMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL");
                        break;

                    case IndicatorType.VariableMovingAverage:
                        Temp = MA.VariableMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL");
                        break;

                    case IndicatorType.WeightedMovingAverage:
                        Temp = MA.WeightedMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL");
                        break;

                    case IndicatorType.VIDYA:
                        Temp = MA.VIDYA(pNav, CHHLL, KDoubleSmooth, 0.65, "CHHLL");
                        break;
                    }

                    Temp.CopyField(CHHLL, "CHHLL");
                }

                if (KSmooth > 1)
                {
                    switch (MAType)
                    {
                    case IndicatorType.SimpleMovingAverage:
                        Temp = MA.SimpleMovingAverage(pNav, HHLL, KSmooth, "HHLL");
                        break;

                    case IndicatorType.ExponentialMovingAverage:
                        Temp = MA.ExponentialMovingAverage(pNav, HHLL, KSmooth, "HHLL");
                        break;

                    case IndicatorType.TimeSeriesMovingAverage:
                        Temp = MA.TimeSeriesMovingAverage(pNav, HHLL, KSmooth, "HHLL");
                        break;

                    case IndicatorType.TriangularMovingAverage:
                        Temp = MA.TriangularMovingAverage(pNav, HHLL, KSmooth, "HHLL");
                        break;

                    case IndicatorType.VariableMovingAverage:
                        Temp = MA.VariableMovingAverage(pNav, HHLL, KSmooth, "HHLL");
                        break;

                    case IndicatorType.WeightedMovingAverage:
                        Temp = MA.WeightedMovingAverage(pNav, HHLL, KSmooth, "HHLL");
                        break;

                    case IndicatorType.VIDYA:
                        Temp = MA.VIDYA(pNav, HHLL, KSmooth, 0.65, "HHLL");
                        break;
                    }

                    Temp.CopyField(HHLL, "HHLL");
                }


                if (KDoubleSmooth > 1)
                {
                    switch (MAType)
                    {
                    case IndicatorType.SimpleMovingAverage:
                        Temp = MA.SimpleMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL");
                        break;

                    case IndicatorType.ExponentialMovingAverage:
                        Temp = MA.ExponentialMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL");
                        break;

                    case IndicatorType.TimeSeriesMovingAverage:
                        Temp = MA.TimeSeriesMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL");
                        break;

                    case IndicatorType.TriangularMovingAverage:
                        Temp = MA.TriangularMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL");
                        break;

                    case IndicatorType.VariableMovingAverage:
                        Temp = MA.VariableMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL");
                        break;

                    case IndicatorType.WeightedMovingAverage:
                        Temp = MA.WeightedMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL");
                        break;

                    case IndicatorType.VIDYA:
                        Temp = MA.VIDYA(pNav, HHLL, KDoubleSmooth, 0.65, "HHLL");
                        break;
                    }

                    Temp.CopyField(HHLL, "HHLL");
                }


                for (Record = KPeriods + 1; Record != RecordCount + 1; ++Record)
                {
                    double?a = CHHLL.Value(Record);
                    double?b = (0.5f * HHLL.Value(Record));
                    if (a != b && b != 0)
                    {
                        Value = 100.0f * (a / b);
                    }
                    Field1.Value(Record, Value);
                }


                if (DPeriods > 1)
                {
                    switch (PctD_MAType)
                    {
                    case IndicatorType.SimpleMovingAverage:
                        Temp = MA.SimpleMovingAverage(pNav, Field1, DPeriods, "%D");
                        break;

                    case IndicatorType.ExponentialMovingAverage:
                        Temp = MA.ExponentialMovingAverage(pNav, Field1, DPeriods, "%D");
                        break;

                    case IndicatorType.TimeSeriesMovingAverage:
                        Temp = MA.TimeSeriesMovingAverage(pNav, Field1, DPeriods, "%D");
                        break;

                    case IndicatorType.TriangularMovingAverage:
                        Temp = MA.TriangularMovingAverage(pNav, Field1, DPeriods, "%D");
                        break;

                    case IndicatorType.VariableMovingAverage:
                        Temp = MA.VariableMovingAverage(pNav, Field1, DPeriods, "%D");
                        break;

                    case IndicatorType.WeightedMovingAverage:
                        Temp = MA.WeightedMovingAverage(pNav, Field1, DPeriods, "%D");
                        break;

                    case IndicatorType.VIDYA:
                        Temp = MA.VIDYA(pNav, Field1, DPeriods, 0.65, "%D");
                        break;
                    }

                    Field Field2 = new Field(RecordCount, "%D");
                    Temp.CopyField(Field2, "%D");
                    Results.AddField(Field2);
                }
                Results.AddField(Field1);

                return(Results);
            }
Ejemplo n.º 7
0
            ///<summary>
            /// Money Flow Index
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV Recordset</param>
            ///<param name="periods">Periods</param>
            ///<param name="Alias">Alias</param>
            ///<returns>Recordset</returns>
            public Recordset MoneyFlowIndex(Navigator pNav, Recordset pOHLCV, int periods, string Alias)
            {
                Recordset Results = new Recordset();
                int       Record;

                int RecordCount = pNav.RecordCount;

                if (periods < 1 || periods > RecordCount)
                {
                    return(null);
                }

                Field Field1 = new Field(RecordCount, Alias);

                int Start = periods + 2;

                pNav.Position = Start;

                for (Record = Start; Record < RecordCount + 2; Record++)
                {
                    double PosFlow = 0;
                    double NegFlow = 0;

                    pNav.Position = Record - periods;
                    int Period;
                    for (Period = 1; Period < periods + 1; Period++)
                    {
                        pNav.MovePrevious();
                        double Price1 = (pOHLCV.GetField("High").Value(pNav.Position).Value +
                                         pOHLCV.GetField("Low").Value(pNav.Position).Value +
                                         pOHLCV.GetField("Close").Value(pNav.Position).Value) / 3;
                        pNav.MoveNext();
                        double V = pOHLCV.GetField("Volume").Value(pNav.Position).Value;
                        if (V < 1)
                        {
                            V = 1;
                        }
                        double Price2 = (pOHLCV.GetField("High").Value(pNav.Position).Value +
                                         pOHLCV.GetField("Low").Value(pNav.Position).Value +
                                         pOHLCV.GetField("Close").Value(pNav.Position).Value) / 3;

                        if (Price2 > Price1)
                        {
                            PosFlow += Price2 * V;
                        }
                        else if (Price2 < Price1)
                        {
                            NegFlow += Price2 * V;
                        }

                        pNav.MoveNext();
                    }//Period

                    pNav.MovePrevious();
                    if (PosFlow != 0 && NegFlow != 0)
                    {
                        double MoneyRatio = PosFlow / NegFlow;
                        double MoneyIndex = 100 - (100 / (1 + MoneyRatio));
                        Field1.Value(pNav.Position, MoneyIndex);
                    }
                }//Record

                pNav.MoveFirst();
                Results.AddField(Field1);
                return(Results);
            }
Ejemplo n.º 8
0
            ///<summary>
            /// Swing Index
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV Recordset</param>
            ///<param name="LimitMoveValue">Limit Move Value</param>
            ///<param name="Alias">Alias</param>
            ///<returns>RecordSet</returns>
            public Recordset SwingIndex(Navigator pNav, Recordset pOHLCV, double LimitMoveValue, string Alias)
            {
                TASDK     TASDK1  = new TASDK();
                Recordset Results = new Recordset();
                int       Record;
                double    R = 0;

                int RecordCount = pNav.RecordCount;

                if (LimitMoveValue <= 0)
                {
                    return(null);
                }

                Field Field1 = new Field(RecordCount, Alias);

                const int Start = 2;

                pNav.Position = Start;
                for (Record = Start; Record < RecordCount + 1; Record++)
                {
                    double Oy = pOHLCV.GetField("Open").Value(pNav.Position - 1).Value;
                    double Ot = pOHLCV.GetField("Open").Value(pNav.Position).Value;
                    double Ht = pOHLCV.GetField("High").Value(pNav.Position).Value;
                    double Lt = pOHLCV.GetField("Low").Value(pNav.Position).Value;
                    double Cy = pOHLCV.GetField("Close").Value(pNav.Position - 1).Value;
                    double Ct = pOHLCV.GetField("Close").Value(pNav.Position).Value;

                    double K = TASDK1.max(Math.Abs(Ht - Cy), Math.Abs(Lt - Cy), 0.0);

                    double A = Math.Abs(Ht - Cy);
                    double B = Math.Abs(Lt - Cy);
                    double C = Math.Abs(Ht - Lt);

                    if (A > B && A > C)
                    {
                        R = Math.Abs(Ht - Cy) - 0.5 * Math.Abs(Lt - Cy) + 0.25 * Math.Abs(Cy - Oy);
                    }
                    else if (B > A && B > C)
                    {
                        R = Math.Abs(Lt - Cy) - 0.5 * Math.Abs(Ht - Cy) + 0.25 * Math.Abs(Cy - Oy);
                    }
                    else if (C > A && C > B)
                    {
                        R = Math.Abs(Ht - Lt) + 0.25 * Math.Abs(Cy - Oy);
                    }

                    double Value;
                    if (R > 0 && LimitMoveValue > 0)
                    {
                        Value = 50 * ((Ct - Cy) + 0.5 * (Ct - Ot) + 0.25 * (Cy - Oy)) / R * K / LimitMoveValue;
                    }
                    else
                    {
                        Value = 0;
                    }

                    Field1.Value(pNav.Position, Value);

                    pNav.MoveNext();
                }//Record

                pNav.MoveFirst();
                Results.AddField(Field1);
                return(Results);
            }
Ejemplo n.º 9
0
            ///<summary>
            /// Fractal Chaos bands
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pOHLCV">OHLCV Recordset</param>
            ///<param name="periods">Periods</param>
            ///<returns>Records</returns>
            public Recordset FractalChaosBands(Navigator pNav, Recordset pOHLCV, int periods)
            {
                MovingAverage MA      = new MovingAverage();
                Recordset     Results = new Recordset();

                int RecordCount = pNav.RecordCount;
                int Record;

                if (periods < 1)
                {
                    periods = 100;
                }

                Field fHiFractal = new Field(RecordCount, "Fractal High");
                Field fLoFractal = new Field(RecordCount, "Low High");
                Field fH         = pOHLCV.GetField("High");
                Field fL         = pOHLCV.GetField("Low");
                Field fFR        = new Field(RecordCount, "FR");

                Field fH1 = new Field(RecordCount, "High 1");
                Field fH2 = new Field(RecordCount, "High 2");
                Field fH3 = new Field(RecordCount, "High 3");
                Field fH4 = new Field(RecordCount, "High 4");

                Field fL1 = new Field(RecordCount, "Low 1");
                Field fL2 = new Field(RecordCount, "Low 2");
                Field fL3 = new Field(RecordCount, "Low 3");
                Field fL4 = new Field(RecordCount, "Low 4");

                for (Record = 5; Record < RecordCount + 1; ++Record)
                {
                    fH1.Value(Record, fH.ValueEx(Record - 4));
                    fL1.Value(Record, fL.ValueEx(Record - 4));

                    fH2.Value(Record, fH.ValueEx(Record - 3));
                    fL2.Value(Record, fL.ValueEx(Record - 3));

                    fH3.Value(Record, fH.ValueEx(Record - 2));
                    fL3.Value(Record, fL.ValueEx(Record - 2));

                    fH4.Value(Record, fH.ValueEx(Record - 1));
                    fL4.Value(Record, fL.ValueEx(Record - 1));
                }

                for (Record = 1; Record < RecordCount + 1; ++Record)
                {
                    fHiFractal.Value(Record, (fH.ValueEx(Record) + fL.ValueEx(Record)) / 3);
                }

                Recordset rsFractals = MA.SimpleMovingAverage(pNav, fHiFractal, periods, "Fractal High");

                fHiFractal = rsFractals.GetField("Fractal High");
                rsFractals.RemoveField("Fractal High");

                rsFractals = MA.SimpleMovingAverage(pNav, fLoFractal, periods, "Fractal Low");
                fLoFractal = rsFractals.GetField("Fractal Low");
                rsFractals.RemoveField("Fractal Low");

                for (Record = 1; Record < RecordCount + 1; ++Record)
                {
                    fHiFractal.Value(Record, fH3.ValueEx(Record) + fHiFractal.ValueEx(Record));
                    fLoFractal.Value(Record, fL3.ValueEx(Record) - fLoFractal.ValueEx(Record));
                }

                for (Record = 2; Record < RecordCount + 1; ++Record)
                {
                    if ((fH3.Value(Record) > fH1.Value(Record)) &&
                        (fH3.Value(Record) > fH2.Value(Record)) &&
                        (fH3.Value(Record) >= fH4.Value(Record)) &&
                        (fH3.Value(Record) >= fH.Value(Record)))
                    {
                        fFR.Value(Record, fHiFractal.Value(Record).Value);
                    }
                    else
                    {
                        fFR.Value(Record, 0);
                    }

                    if (fFR.Value(Record) == 0)
                    {
                        if ((fL3.Value(Record) < fL1.Value(Record)) &&
                            (fL3.Value(Record) < fL2.Value(Record)) &&
                            (fL3.Value(Record) <= fL4.Value(Record)) &&
                            (fL3.Value(Record) <= fL.Value(Record)))
                        {
                            fFR.Value(Record, fLoFractal.Value(Record));
                        }
                        else
                        {
                            fFR.Value(Record, 0);
                        }
                    }

                    if (fHiFractal.Value(Record) == fFR.Value(Record))
                    {
                        fHiFractal.Value(Record, fH3.Value(Record));
                    }
                    else
                    {
                        fHiFractal.Value(Record, fHiFractal.Value(Record - 1));
                    }

                    if (fLoFractal.Value(Record) == fFR.Value(Record))
                    {
                        fLoFractal.Value(Record, fL3.Value(Record));
                    }
                    else
                    {
                        fLoFractal.Value(Record, fLoFractal.Value(Record - 1));
                    }
                }

                // Added 12/19/2005 TW
                for (Record = 2; Record < RecordCount + 1; ++Record)
                {
                    if (fLoFractal.Value(Record) == 0)
                    {
                        fLoFractal.Value(Record, null);
                    }
                    if (fHiFractal.Value(Record) == 0)
                    {
                        fHiFractal.Value(Record, null);
                    }
                }

                Results.AddField(fHiFractal);
                Results.AddField(fLoFractal);

                return(Results);
            }