コード例 #1
0
        protected override void OnOpenLongPosition(OpenPositionInfo info)
        {
            CombinedStrategyDataItem item = (CombinedStrategyDataItem)StrategyData.Last();

            info.CandlestickTime = item.Time;
            item.Value           = info.CurrentValue;
        }
コード例 #2
0
 protected virtual void UpdateCurrentLoss()
 {
     if (StrategyData.Count > 0)
     {
         CombinedStrategyDataItem last = (CombinedStrategyDataItem)StrategyData.Last();
         last.CurrentLoss = Math.Min(last.CurrentLoss, OpenedOrders.Sum(o => o.CurrentLoss));
     }
 }
コード例 #3
0
        protected virtual CombinedStrategyDataItem AddStrategyData(int candleStickIndex)
        {
            CombinedStrategyDataItem item = new CombinedStrategyDataItem();

            StrategyData.Add(item);

            item.Index            = StrategyData.Count;
            item.Earned           = Earned;
            item.AvailableDeposit = MaxAllowedDeposit;
            item.Candle           = Ticker.CandleStickData[candleStickIndex];
            return(item);
        }
コード例 #4
0
        protected override DelayedPositionInfo AddDelayedPosition(string mark, double value, double amount, double closeValue, int liveTimeLength)
        {
            DelayedPositionInfo res = base.AddDelayedPosition(mark, value, amount, closeValue, liveTimeLength);

            if (res != null)
            {
                CombinedStrategyDataItem last = (CombinedStrategyDataItem)StrategyData.Last();
                //last.Mark = mark + " DL";
                last.Value = value;
            }
            return(res);
        }
コード例 #5
0
        protected bool AlreadyOpenedBreakUpPosition()
        {
            //if(OpenedOrders.Count > 0 && OpenedOrders.Last().CurrentValue > OpenedOrders.Last().StopLoss)
            //    return true;
            CombinedStrategyDataItem last = (CombinedStrategyDataItem)StrategyData.Last();

            foreach (OpenPositionInfo info in OpenedOrders)
            {
                if (info.Mark == "BU" && last.Index - info.DataItemIndex < 30)
                {
                    return(true);
                }
                //if(info.Mark != "BU")
                //    continue;
                //SRValue res = (SRValue)info.Tag2;
                //if(info.Type == OrderType.Buy && SRIndicator.BelongsSameResistanceLevel(res))
                //    return true;
            }
            return(false);
        }
コード例 #6
0
        protected bool AlreadyOpenedPingPongPosition()
        {
            if (OpenedOrders.Count > 0 && OpenedOrders.Last().CurrentValue > OpenedOrders.Last().StopLoss)
            {
                return(true);
            }
            CombinedStrategyDataItem last = (CombinedStrategyDataItem)StrategyData.Last();

            foreach (OpenPositionInfo info in OpenedOrders)
            {
                if (info.Mark != "PP")
                {
                    continue;
                }
                SRValue res = SRIndicator2.FindSupportByTime(info.CandlestickTime);
                if (res != null && info.Type == OrderType.Buy && (SRIndicator2.BelongsSameSupportLevel(res) || last.Index - info.DataItemIndex < 5))
                {
                    return(true);
                }
            }
            return(false);
        }
コード例 #7
0
        protected virtual bool ProcessDCA(OpenPositionInfo info)
        {
            if (!info.AllowDCA || info.Type != OrderType.Buy)
            {
                return(false);
            }
            double highBid = Ticker.OrderBook.Bids[0].Value;

            if (highBid >= info.DCAInfo.Start.Value)
            {
                return(false);
            }
            int zoneIndex = info.DCAInfo.GetZoneIndex(info.CurrentValue);

            if (zoneIndex == -1 || info.DCAInfo.IsExecuted(zoneIndex))
            {
                return(false);
            }
            double           amount = info.DCATotalAmount * info.DCAInfo.GetAmountInPc(zoneIndex) / 100;
            double           lowAsk = Ticker.OrderBook.Asks[0].Value;
            OpenPositionInfo dacPos = OpenLongPosition("D" + zoneIndex, lowAsk, amount, true, false, info.StopLossPercent, info.MinProfitPercent);

            if (dacPos != null)
            {
                dacPos.AllowDCA        = false;
                dacPos.ParentID        = info.ID;
                dacPos.StopLossDelta   = info.CloseValue - info.OpenValue;
                dacPos.StopLossPercent = (info.CloseValue - info.OpenValue) / info.OpenValue * 100 + 0.5;
                CombinedStrategyDataItem item = (CombinedStrategyDataItem)StrategyData.Last();
                info.DCAInfo.Executed[zoneIndex] = true;
                info.DACPositions.Add(dacPos);
                dacPos.CloseValue = info.CloseValue;// 2 * CalcFee(dacPos.Total) + dacPos.OpenValue * 0.01; // 1% profit at least
            }
            Save();
            return(true);
        }
コード例 #8
0
        protected override void CloseLongPosition(OpenPositionInfo info)
        {
            TradingResult res = MarketSell(Ticker.OrderBook.Bids[0].Value, info.Amount);

            if (res != null)
            {
                double earned = res.Total - CalcFee(res.Total);
                MaxAllowedDeposit += earned;
                info.UpdateCurrentValue(DataProvider.CurrentTime, res.Value);
                info.Earned    += earned;
                info.Amount    -= res.Amount;
                info.Total     -= res.Total;
                info.CloseValue = res.Value;
                CombinedStrategyDataItem item = (CombinedStrategyDataItem)StrategyData.FirstOrDefault(i => ((CombinedStrategyDataItem)i).Time == info.CandlestickTime);
                if (item != null)
                {
                    item.Closed      = true;
                    item.CloseLength = ((CombinedStrategyDataItem)StrategyData.Last()).Index - item.Index;
                }
                CombinedStrategyDataItem last = (CombinedStrategyDataItem)StrategyData.Last();
                if (info.Amount < 0.000001)
                {
                    OpenedOrders.Remove(info);
                    last.ClosedPositions.Add(info);
                    info.CloseTime = DataProvider.CurrentTime;
                    Earned        += info.Earned - info.Spent;
                }
                last.ClosedOrder = true;
                last.Value       = Ticker.OrderBook.Bids[0].Value;
                if (item != null)
                {
                    item.Profit = earned - info.Spent;
                }
                last.AddMark("Close " + info.Mark);
            }
        }
コード例 #9
0
        protected virtual void ProcessTickerCore()
        {
            if (Ticker.CandleStickData.Count < StrategyStartItemsCount) /// need back data for simulation
            {
                return;
            }
            if (Ticker.OrderBook.IsDirty || Ticker.OrderBook.Asks.Count == 0)
            {
                return;
            }
            CombinedStrategyDataItem item = (CombinedStrategyDataItem)StrategyData.Last();

            if (!string.IsNullOrEmpty(item.Mark)) // processed
            {
                return;
            }

            if (SRIndicator.Resistance.Count == 0 || SRIndicator.Support.Count == 0 ||
                SRIndicator2.Resistance.Count == 0 || SRIndicator2.Support.Count == 0)
            {
                return;
            }

            SRValue lr = SRIndicator.Resistance.Last();
            SRValue ls = SRIndicator.Support.Last();
            //double spread = lr.Value - ls.Value;
            double lastAsk = Ticker.OrderBook.Asks[0].Value;
            double spreadFromResistance = lastAsk - SRIndicator2.Resistance.Last().Value; //(lastAsk - lr.Value);
            double spreadFromSupport    = (ls.Value - lastAsk);

            //item.BreakPercent = spreadFromResistance / item.SRSpread * 100;
            item.SpreadBaseResistance = spreadFromResistance;
            item.SRSpread             = (SRIndicator2.Resistance.Last().Value - SRIndicator.Support.Last().Value) / SRIndicator2.Support.Last().Value * 100;

            if (BreakUpSettings.Enable && spreadFromResistance > BreakUpSettings.MinBreakValue && spreadFromResistance < BreakUpSettings.MaxBreakValue)  // to high
            {
                if (!AlreadyOpenedBreakUpPosition())
                {
                    OpenBreakUpPosition(lastAsk);
                }
                //EnableTrailingForPingPong();
            }
            else if (BreakDownSettings.Enable && spreadFromSupport > BreakDownSettings.MinSupportBreakValue)  // to low
            {
                double probableBottom = GetProbableBottom(lastAsk);
                double openValue      = 0;
                if (probableBottom != 0)
                {
                    openValue = probableBottom + (ls.Value - probableBottom) * 0.1; // 10% addition
                }
                if (openValue == 0 || openValue >= lastAsk)
                {
                    probableBottom = 0;
                    openValue      = lastAsk;
                }
                if (!AlreadyOpenedBreakDownPosition(openValue))
                {
                    OpenBreakDownPosition(openValue, ls.Value, probableBottom != 0);
                }
            }
            else
            {
                SRValue lr2     = SRIndicator2.Resistance.Last();
                SRValue ls2     = SRIndicator2.Support.Last();
                double  spread2 = lr2.Value - ls2.Value;
                double  pc      = (lastAsk - ls2.Value) / spread2;
                if (PingPongSettings.Enable &&
                    item.SRSpread > PingPongSettings.MinimalPriceRangeInPc &&
                    pc > 0 && pc < 0.1 && ls.Length > PingPongSettings.SupportLevelLength)   // minimal spread
                {
                    if (!AlreadyOpenedPingPongPosition())
                    {
                        OpenPingPongPosition(lastAsk, lr2.Value, ls2.Value);
                    }
                }
            }

            ProcessDelayedPositions();
            ProcessLongPositions();
            item.Earned = Earned;

            return;
        }