protected override void OnCalculate(bool fullRecalculation, DataBarUpdateType? updateType)
        {
            if (fullRecalculation)
            {
                double[] values1 = DataProvider.GetValuesAsDouble(_dataSource, 0, DataProvider.BarCount);

                Results.AddSetValues("Volume", 0, values1.Length, true, values1);
            }
            else
            {
                // How many steps to overlap for safety.
                int overlap = Math.Max(0, Math.Min(5, Results.SetLength - 1));

                if (Results.SetLength > DataProvider.BarCount)
                {// This happens sometimes and causes exception.
                    Results.ClipTo(DataProvider.BarCount);
                    return;
                }

                int startIndex = Math.Max(0, Results.SetLength - overlap);
                int count = DataProvider.BarCount - startIndex;

                double[] values1 = DataProvider.GetValuesAsDouble(_dataSource, startIndex, count);

                Results.AddSetValues("Volume", startIndex, count, true, values1);
            }
        }
    /// <summary>
    /// Quote dataDelivery was updated.
    /// </summary>
    protected override void OnDataBarPeriodUpdate(DataBarUpdateType updateType, int updatedBarsCount)
    {
        Indicator indicator = this.ObtainIndicator("Rsi");

        if (indicator.Results.GetValueSetCurrentValue(0).HasValue == false
            || this.CanPlaceOrders == false)
        {
            return;
        }

        Trace(indicator.Results.GetValueSetCurrentValue(0).Value.ToString());

        // Get the value of the [0] index operationResult set of this indicator.
        // Each indicator can have many operationResult sets - each represeting a "line" on the chart.
        if (indicator.Results.GetValueSetCurrentValue(0) > BuyValue)
        {// If the Rsi operationResult is above BuyValue, take some action.

            if (this.CurrentPositionVolume == 0)
            {// Open an order if none are already opened.
                this.OpenBuyOrder(10000);
            }
        }
        else if (indicator.Results.GetValueSetCurrentValue(0) < SellValue)
        { // If the Rsi operationResult is below SellValue, take some other action.

            if (this.CurrentPositionVolume > 0)
            {// Close the first open order.
                //this.OpenAndPendingOrders[0].Close();
                this.ClosePosition();
            }
        }
    }
    /// <summary>
    /// Quote dataDelivery was updated.
    /// </summary>
    protected override void OnDataBarPeriodUpdate(DataBarUpdateType updateType, int updatedBarsCount)
    {
        Indicator indicator = this.ObtainIndicator("Rsi");

        if (indicator.Results.GetValueSetCurrentValue(0).HasValue == false
            || this.CanPlaceOrders == false)
        {
            return;
        }

        Trace(indicator.Results.GetValueSetCurrentValue(0).Value.ToString());

        if (this.CurrentPositionVolume == 0)
        {

            // Get the value of the [0] index operationResult set of this indicator.
            // Each indicator can have many operationResult sets - each represeting a "line" on the chart.
            if (indicator.Results.GetValueSetCurrentValue(0) > BuyValue)
            {// If the Rsi operationResult is above BuyValue, take some action.
                this.OpenBuyOrder(10000);
            }
            else if (indicator.Results.GetValueSetCurrentValue(0) < SellValue)
            {
                this.OpenSellOrder(10000);
            }
        }
        else
        {// Maybe we need to close an open position.

            if (this.CurrentPositionVolume > 0
                && indicator.Results.GetValueSetCurrentValue(0) < ClosePositionValue)
            {// If the Rsi operationResult is below SellValue, close buy position.
                this.ClosePosition();
            }

            if (this.CurrentPositionVolume < 0
                && indicator.Results.GetValueSetCurrentValue(0) > ClosePositionValue)
            {// If the Rsi operationResult is above SellValue, close sell position.
                this.ClosePosition();
            }
        }
    }
Пример #4
0
    /// <summary>
    /// Quote dataDelivery was updated.
    /// </summary>
    protected override void OnDataBarPeriodUpdate(DataBarUpdateType updateType, int updatedBarsCount)
    {
        Indicator indicator = this.ObtainIndicator("Rsi");

        if (indicator.Results.GetValueSetCurrentValue(0).HasValue == false ||
            this.CanPlaceOrders == false)
        {
            return;
        }

        Trace(indicator.Results.GetValueSetCurrentValue(0).Value.ToString());

        if (this.CurrentPositionVolume == 0)
        {
            // Get the value of the [0] index operationResult set of this indicator.
            // Each indicator can have many operationResult sets - each represeting a "line" on the chart.
            if (indicator.Results.GetValueSetCurrentValue(0) > BuyValue)
            {// If the Rsi operationResult is above BuyValue, take some action.
                this.OpenBuyOrder(10000);
            }
            else if (indicator.Results.GetValueSetCurrentValue(0) < SellValue)
            {
                this.OpenSellOrder(10000);
            }
        }
        else
        {// Maybe we need to close an open position.
            if (this.CurrentPositionVolume > 0 &&
                indicator.Results.GetValueSetCurrentValue(0) < ClosePositionValue)
            {// If the Rsi operationResult is below SellValue, close buy position.
                this.ClosePosition();
            }

            if (this.CurrentPositionVolume < 0 &&
                indicator.Results.GetValueSetCurrentValue(0) > ClosePositionValue)
            {// If the Rsi operationResult is above SellValue, close sell position.
                this.ClosePosition();
            }
        }
    }
Пример #5
0
 void _dataProvider_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     Calculate(false, updateType);
 }
 void DataBarHistory_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     if (updateType == DataBarUpdateType.Initial)
     {// Only executes on initial adding of many items.
         WinFormsHelper.BeginFilteredManagedInvoke(this, new GeneralHelper.GenericDelegate <bool, bool>(chartControl.MasterPane.FitDrawingSpaceToScreen), true, true);
     }
 }
 protected virtual void OnDataBarPeriodUpdate(DataBarUpdateType updateType, int updatedBarsCount)
 {
 }
        /// <summary>
        /// Since we are in back test delivery, it is possible to receive this before we are initialized,
        /// since the underlying data bar provider gets launched before this class does.
        /// </summary>
        void _sourceDataBarProvider_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
        {
            SystemMonitor.CheckError(provider == _sourceDataBarProvider, "Data provider update not expected.");

            RestoreLastStep();

            if (_pendingSessionInfo.HasValue && _pendingRequest.HasValue)
            {// Executed only the first time.
                _pendingSessionInfo = null;
                _pendingRequest     = null;

                RequestDataHistoryUpdate(_pendingSessionInfo.Value, _pendingRequest.Value, false);
            }
        }
 protected override void OnCalculate(bool fullRecalculation, DataBarUpdateType? updateType)
 {
     if (_isUpdating == false)
     {
         GeneralHelper.FireAndForget(Update);
     }
 }
Пример #10
0
 void _dataProvider_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     Calculate(false, updateType);
 }
Пример #11
0
 /// <summary>
 /// Perform calculation on the given piece of dataDelivery.
 /// </summary>
 protected abstract void OnCalculate(bool fullRecalculation, DataBarUpdateType? updateType);
Пример #12
0
        /// <summary>
        /// Calculation helper function.
        /// </summary>
        public void Calculate(bool fullRecalculation, DataBarUpdateType? updateType)
        {
            if (this.Initialized == false || this.Enabled == false)
            {
                return;
            }

            if (_dataProvider.BarCount == 0)
            {
                return;
            }

            // Calculate the indicator level lines.
            OnCalculate(fullRecalculation, updateType);

            //// Start the mostly child performed signal analisys.
            //Signals.PerformCrossingResultAnalysis(ProvideSignalAnalysisLines());

            //Signals.PerformExtremumResultAnalysis();

            if (IndicatorCalculatedEvent != null)
            {
                IndicatorCalculatedEvent(this, fullRecalculation);
            }
        }
 void DataBarHistory_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     OnDataBarPeriodUpdate(updateType, updatedBarsCount);
 }
 protected virtual void OnDataBarPeriodUpdate(DataBarUpdateType updateType, int updatedBarsCount)
 {
 }
 void DataBarHistory_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     if (updateType != DataBarUpdateType.CurrentBarUpdate)
     {// Do the full update only on actual bar update.
         UpdateValues(updatedBarsCount);
     }
     else
     {
         RaiseSeriesValuesUpdated(true);
     }
 }
Пример #16
0
        protected override void OnDataBarPeriodUpdate(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
        {
            lock (this)
            {
                if (provider != null)
                {
                    //Console.WriteLine("Bars: {0}", provider.BarCount);

                    //Keep bars have no more limit than the quotes
                    if (provider.DataBarLimit > this.QuotesLimit)
                    {
                        provider.DataBarLimit = this.QuotesLimit;
                    }
                }
            }
        }
Пример #17
0
        protected override void OnCalculate(bool fullRecalculation, DataBarUpdateType? updateType)
        {
            double[] values1, values2;

            int startingIndex = 0;
            int indecesCount = DataProvider.BarCount - 1;

            if (UseOpenClose)
            {
                values1 = DataProvider.GetValuesAsDouble(DataBar.DataValueEnum.Open, startingIndex, indecesCount);
                values2 = DataProvider.GetValuesAsDouble(DataBar.DataValueEnum.Close, startingIndex, indecesCount);
            }
            else
            {
                values1 = DataProvider.GetValuesAsDouble(DataBar.DataValueEnum.High, startingIndex, indecesCount);
                values2 = DataProvider.GetValuesAsDouble(DataBar.DataValueEnum.Low, startingIndex, indecesCount);
            }

            System.Diagnostics.Debug.Assert(values1.Length == values2.Length);

            if (indecesCount == 0)
            {
                Results.AddSetValues("ZigZag", startingIndex, indecesCount, true, new double[] { });
                return;
            }

            // This is simple indicator, it can directly write to the signals array.
            double[] signals = new double[indecesCount];
            signals[0] = (double)ZigZagStates.PeakHigh;

            int lastPeakIndex = 0;
            ZigZagStates lastPeakState = ZigZagStates.PeakHigh;

            // Perform actual calculation.
            for (int i = 0; i < values1.Length; i++)
            {
                double requiredDifferenceValue = (SignificancePercentage / 100) * values1[i];

                double high = Math.Max(values1[i], values2[i]);
                double low = Math.Min(values1[i], values2[i]);

                double lastPeakValue = 0;
                if (lastPeakState == ZigZagStates.PeakHigh)
                {
                    lastPeakValue = Math.Max(values1[lastPeakIndex], values2[lastPeakIndex]);
                }
                else if (lastPeakState == ZigZagStates.PeakLow)
                {
                    lastPeakValue = Math.Min(values1[lastPeakIndex], values2[lastPeakIndex]);
                }

                bool newLow = (lastPeakState == ZigZagStates.PeakHigh && (lastPeakValue - low >= requiredDifferenceValue)) || (lastPeakState == ZigZagStates.PeakLow && low < lastPeakValue);
                bool newHigh = (lastPeakState == ZigZagStates.PeakLow && (high - lastPeakValue >= requiredDifferenceValue)) || (lastPeakState == ZigZagStates.PeakHigh && high > lastPeakValue);

                //System.Diagnostics.Debug.Assert(newLow == false || newHigh == false);

                if (newLow && newHigh)
                {// Favor the extension of existing peak in this case.
                    if (lastPeakState == ZigZagStates.PeakHigh)
                    {
                        newLow = false;
                    }
                    else
                    {
                        newHigh = false;
                    }
                }

                if (newHigh)
                {
                    if (lastPeakState == ZigZagStates.PeakHigh)
                    {// Update the high.
                        signals[lastPeakIndex] = (double)ZigZagStates.Default;
                    }
                    else if (lastPeakState == ZigZagStates.PeakLow)
                    {// New high found.
                        lastPeakState = ZigZagStates.PeakHigh;
                    }
                    else
                    {
                        System.Diagnostics.Debug.Fail("Unexpected case.");
                    }

                    lastPeakIndex = i;
                    signals[i] = (double)ZigZagStates.PeakHigh;
                }
                else if (newLow)
                {
                    if (lastPeakState == ZigZagStates.PeakLow)
                    {// Update the low.
                        signals[lastPeakIndex] = (double)ZigZagStates.Default;
                    }
                    else if (lastPeakState == ZigZagStates.PeakHigh)
                    {// New low found.
                        lastPeakState = ZigZagStates.PeakLow;
                    }

                    lastPeakIndex = i;
                    signals[lastPeakIndex] = (double)ZigZagStates.PeakLow;
                }

            }

            // Finish with a signal.
            if (signals[signals.Length - 1] == (double)ZigZagStates.Default)
            {
                if (lastPeakState == ZigZagStates.PeakHigh)
                {
                    signals[signals.Length - 1] = (double)ZigZagStates.PeakLow;
                }
                else
                {
                    signals[signals.Length - 1] = (double)ZigZagStates.PeakHigh;
                }
            }

            // Finally create the results, that shows a line moving between the peak values - like a proper ZigZag indicator.
            lastPeakIndex = 0;
            lastPeakState = ZigZagStates.PeakHigh;
            double[] results = new double[indecesCount];

            for (int i = 1; i < signals.Length; i++)
            {
                if (signals[i] != (double)ZigZagStates.Default)
                {
                    double lastPeakValue, currentPeakValue;

                    if (lastPeakState == ZigZagStates.PeakHigh)
                    {
                        lastPeakValue = Math.Max(values1[lastPeakIndex], values2[lastPeakIndex]);
                        currentPeakValue = Math.Min(values1[i], values2[i]);
                    }
                    else
                    {
                        lastPeakValue = Math.Min(values1[lastPeakIndex], values2[lastPeakIndex]);
                        currentPeakValue = Math.Max(values1[i], values2[i]);
                    }

                    double[] midValues = MathHelper.CreateConnectionValues(lastPeakValue, currentPeakValue, i - lastPeakIndex);
                    midValues.CopyTo(results, lastPeakIndex);

                    lastPeakIndex = i;
                    lastPeakState = (ZigZagStates)signals[i];
                }

            }

            Results.AddSetValues("ZigZag", startingIndex, indecesCount - 1, true, results);

            // Only after we add the operationResult set, the signals become available.
            Signals.Signals = signals;
        }
 void DataBarHistory_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     if (updateType != DataBarUpdateType.CurrentBarUpdate)
     {// Do the full update only on actual bar update.
         UpdateValues(updatedBarsCount);
     }
     else
     {
         RaiseSeriesValuesUpdated(true);
     }
 }
Пример #19
0
 protected virtual void OnDataBarPeriodUpdate(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
 }
 void DataBarHistory_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     OnDataBarPeriodUpdate(updateType, updatedBarsCount);
 }
        // Parameters format of TaLibCore functions.
        //int startIdx, - mandatory
        //int endIdx, - mandatory
        //double[] inReal[added 0/1] or/and inOpen or/and inLow or/and inHigh or/and inClose
        //int/double optIn[NAME] or/and another one or none - parameters
        //out int outBegIdx,
        //out int outNBElement,
        //double/int[] out[Real/Integer] and or another one
        // Example:
        //TicTacTec.TA.Library.Core.RetCode code = TicTacTec.TA.Library.Core.Sma(0, indecesCount - 1, _closeResultValues, Period, out beginIndex, out number, ma);        }
        /// <summary>
        /// Actual calculation routine.
        /// </summary>
        protected override void OnCalculate(bool fullRecalculation, DataBarUpdateType? updateType)
        {
            // Format of a TA baseMethod.
            //int startIdx, - mandatory
            //int endIdx, - mandatory
            //double[] inReal[added 0/1] or/and inOpen or/and inLow or/and inHigh or/and inClose
            //int/double optIn[NAME] or/and another one or none - parameters

            //out int outBegIdx,
            //out int outNBElement,
            //double/int[] out[Real/Integer] and or another one

            // Example:
            //TicTacTec.TA.Library.Core.RetCode code = TicTacTec.TA.Library.Core.Sma(0, indecesCount - 1, _closeResultValues, Period, out beginIndex, out number, ma);        }

            EstablishLookback();

            // Prepare parameters.
            int dataProviderStartIndex = 0;

            if (fullRecalculation == false)
            {
                dataProviderStartIndex = Math.Max(0, Results.SetLength - _lookbackCount.Value - 1);
            }

            int startIndex = 0;
            int endIndex = DataProvider.BarCount - dataProviderStartIndex - 1;

            //if (StepByStepCalculation)
            //{
            //    int outBeginIdxPosition;
            //    object[] parameters = SetupParameters(startIndex, endIndex, dataProviderStartIndex, out outBeginIdxPosition);
            //    for (int i = 0; i < DataProvider.BarCount - Results.SetLength; i++)
            //    {
            //        parameters[0] = i;
            //        parameters[1] = endIndex - i;
            //        Calc(parameters, outBeginIdxPosition, dataProviderStartIndex);
            //    }
            //}

            int outBeginIdxPosition;
            object[] parameters = SetupParameters(startIndex, endIndex, dataProviderStartIndex, out outBeginIdxPosition);
            PerformCalculation(parameters, outBeginIdxPosition, dataProviderStartIndex);
        }
        /// <summary>
        /// Since we are in back test delivery, it is possible to receive this before we are initialized, 
        /// since the underlying data bar provider gets launched before this class does.
        /// </summary>
        void _sourceDataBarProvider_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
        {
            SystemMonitor.CheckError(provider == _sourceDataBarProvider, "Data provider update not expected.");

            RestoreLastStep();

            if (_pendingSessionInfo.HasValue && _pendingRequest.HasValue)
            {// Executed only the first time.
                _pendingSessionInfo = null;
                _pendingRequest = null;

                RequestDataHistoryUpdate(_pendingSessionInfo.Value, _pendingRequest.Value, false);
            }
        }
 void DataBarHistory_DataBarHistoryUpdateEvent(IDataBarHistoryProvider provider, DataBarUpdateType updateType, int updatedBarsCount)
 {
     if (updateType == DataBarUpdateType.Initial)
     {// Only executes on initial adding of many items.
         WinFormsHelper.BeginFilteredManagedInvoke(this, new GeneralHelper.GenericDelegate<bool, bool>(chartControl.MasterPane.FitDrawingSpaceToScreen), true, true);
     }
 }