protected override void OnOpenLongPosition(OpenPositionInfo info) { CombinedStrategyDataItem item = (CombinedStrategyDataItem)StrategyData.Last(); info.CandlestickTime = item.Time; item.Value = info.CurrentValue; }
protected virtual void UpdateCurrentLoss() { if (StrategyData.Count > 0) { CombinedStrategyDataItem last = (CombinedStrategyDataItem)StrategyData.Last(); last.CurrentLoss = Math.Min(last.CurrentLoss, OpenedOrders.Sum(o => o.CurrentLoss)); } }
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); }
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); }
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); }
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); }
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); }
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); } }
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; }