protected override bool Process(MarketData indicator, DateTime updateTime, Price value, ref Signal.Tick tradingOrder) { KeyValuePair<DateTime, Price>? timeValueLow = _low.TimeSeries[updateTime]; KeyValuePair<DateTime, Price>? timeValueHigh = _high.TimeSeries[updateTime]; if (timeValueLow == null || timeValueHigh == null) return false; if (_high.TimeSeries.TotalMinutes(updateTime) < _high.Period / 60) return false; Price lowWMA = timeValueLow.Value.Value; Price highWMA = timeValueHigh.Value.Value; var signalValue = lowWMA - highWMA; SIGNAL_CODE oldSignalCode = _signalCode; if (signalValue.Offer > 0) { tradingOrder = _onBuy; _signalCode = SIGNAL_CODE.BUY; } else if (signalValue.Bid < 0) { tradingOrder = _onSell; _signalCode = SIGNAL_CODE.SELL; } else return false; return oldSignalCode != SIGNAL_CODE.UNKNOWN && oldSignalCode != SIGNAL_CODE.HOLD && oldSignalCode != _signalCode; }
protected override bool Buy(Signal signal, DateTime time, Price stockValue) { if (base.Buy(signal, time, stockValue)) { Console.WriteLine(time + " Signal " + signal.Id + " buy " + signal.TradingAsset.Id + " " + stockValue.Bid); return true; } return false; }
protected override bool Process(MarketData indicator, DateTime updateTime, Price value, ref Signal.Tick tradingOrder) { if (indicator.TimeSeries.Count == 0) return false; _indicatorLatestValues[indicator.Id] = new KeyValuePair<DateTime, Price>(updateTime, indicator.TimeSeries.Last()); DateTime dt = DateTime.MinValue; foreach (var ind in _indicatorLatestValues) { if (dt == DateTime.MinValue) { dt = ind.Value.Key; continue; } if (dt != ind.Value.Key) return false; } _inputValues.Clear(); if (!ComputeOutput()) return false; _ann.CalculateOutput(_inputValues); var output = _ann.GetOutput()[0]; if (output > 0.5 && _signalCode != SIGNAL_CODE.BUY) { tradingOrder = _onBuy; _signalCode = SIGNAL_CODE.BUY; } else if (output < -0.5 && _signalCode != SIGNAL_CODE.SELL) { tradingOrder = _onSell; _signalCode = SIGNAL_CODE.SELL; } else{ tradingOrder = _onHold; _signalCode = SIGNAL_CODE.HOLD; } return true; }
public abstract void Insert(DateTime updateTime, Signal signal, SIGNAL_CODE code, decimal stockvalue);
protected override bool Buy(Signal signal, DateTime time, Price stockValue) { if (_ptf.GetPosition(_index.Id).Quantity < 0) { signal.Trade.Price = stockValue.Offer; _ptf.ClosePosition(signal.Trade, time); string tradeRef = signal.Trade == null ? "" : " " + signal.Trade.Reference; Log.Instance.WriteEntry(time + tradeRef + " Signal " + signal.Id + ": BUY " + signal.TradingAsset.Id + " " + stockValue.Offer, EventLogEntryType.Information); } return true; }
protected bool _onHold(Signal signal, DateTime updateTime, Price value) { // hold your position; do nothing return true; }
protected override bool Process(MarketData indicator, DateTime updateTime, Price value, ref Signal.Tick tradingOrder) { if (_tradingOrder == _onSell) { tradingOrder = _onBuy; _tradingOrder = _onBuy; return true; } else { tradingOrder = _onSell; _tradingOrder = _onSell; return true; } }
public void Subscribe(Signal.Tick onBuy, Signal.Tick onSell) { _onBuy = onBuy; _onSell = onSell; foreach (Indicator indicator in _mktIndicator) indicator.Subscribe(OnUpdate, null); }
protected abstract bool Process(MarketData indicator, DateTime updateTime, Price value, ref Signal.Tick tradingOrder);
protected override bool Buy(Signal signal, DateTime time, Price stockValue) { if (_ptf.GetPosition(_tradingIndex.Id).Quantity < 0) { if (time >= _closingTime) { signal.Trade.Price = stockValue.Offer; _ptf.ClosePosition(signal.Trade, time, null, null, signal); string closeRef = signal.Trade == null ? "" : " " + signal.Trade.Reference; Log.Instance.WriteEntry(time + closeRef + " Signal close " + signal.Id + ": BUY " + signal.TradingAsset.Id + " " + stockValue.Bid, EventLogEntryType.Information); return false; } else { if (_trendAssumption != SIGNAL_CODE.SELL) signal.Trade.Size = _tradeSize * 2; _ptf.BookTrade(signal.Trade); } } else if (_trendAssumption != SIGNAL_CODE.SELL && _ptf.GetPosition(_tradingIndex.Id).Quantity == 0) { if (time <= _closingTime) { _tradeSize = signal.Trade.Size; _ptf.BookTrade(signal.Trade); } else return false; } else return false; string tradeRef = signal.Trade == null ? "" : " " + signal.Trade.Reference; Log.Instance.WriteEntry(time + tradeRef + " Signal " + signal.Id + ": BUY " + signal.TradingAsset.Id + " " + stockValue.Bid, EventLogEntryType.Information); return true; }
protected override bool Process(MarketData indicator, DateTime updateTime, Price value, ref Signal.Tick tradingOrder) { if (base.Process(indicator, updateTime, value, ref tradingOrder)) { if (_trendAssumption != SIGNAL_CODE.BUY && tradingOrder == _onSell) { if (_low.TimeSeries.Count >= 2) { var lowVal = _low.TimeSeries[updateTime].Value.Value; var prevValues = _low.TimeSeries.Values(updateTime, new TimeSpan(0, 1, 0), true); if (prevValues != null) { if (prevValues.Count >= 2) { var prevVal = prevValues[prevValues.Count - 2].Value; if (_cascading) { if (_localMinimum > lowVal.Bid) _localMinimum = lowVal.Bid; if (_localMaximum < lowVal.Bid) _localMaximum = lowVal.Bid; if (_buying) { if (lowVal.Bid < _localMaximum - _threshold) { _pivot = _localMaximum; _localMinimum = _localMaximum; _buying = false; } else if (lowVal.Bid > _pivot + _threshold) { _signalCode = SIGNAL_CODE.BUY; tradingOrder = _onBuy; } } else { if (lowVal.Bid > _localMinimum + _threshold) { _pivot = _localMinimum; _localMaximum = _localMinimum; _signalCode = SIGNAL_CODE.BUY; tradingOrder = _onBuy; _buying = true; } } } else { _cascading = true; _localMinimum = lowVal.Bid; _localMaximum = lowVal.Bid; _pivot = _localMaximum; _buying = false; } return true; } } } } else if (_trendAssumption != SIGNAL_CODE.SELL && tradingOrder == _onBuy) { if (_low.TimeSeries.Count >= 2) { var lowVal = _low.TimeSeries[updateTime].Value.Value; var prevValues = _low.TimeSeries.Values(updateTime, new TimeSpan(0, 1, 0), true); if (prevValues != null) { if (prevValues.Count >= 2) { var prevVal = prevValues[prevValues.Count - 2].Value; if (_cascading) { if (_localMinimum > lowVal.Offer) _localMinimum = lowVal.Offer; if (_localMaximum < lowVal.Offer) _localMaximum = lowVal.Offer; if (_selling) { if (lowVal.Offer > _localMinimum + _threshold) { _pivot = _localMinimum; _localMaximum = _localMinimum; _selling = false; } else if (lowVal.Offer < _pivot - _threshold) { _signalCode = SIGNAL_CODE.SELL; tradingOrder = _onSell; } } else { if (lowVal.Offer < _localMaximum - _threshold) { _pivot = _localMaximum; _localMinimum = _localMaximum; _signalCode = SIGNAL_CODE.SELL; tradingOrder = _onSell; _selling = true; } } } else { _cascading = true; _localMinimum = lowVal.Offer; _localMaximum = lowVal.Offer; _pivot = _localMinimum; _selling = false; } return true; } } } } _cascading = false; _buying = false; _selling = false; return true; } return false; }
protected override bool Sell(Signal signal, DateTime time, Price stockValue) { if (_tradingSet.PlaceTrade(signal.Trade, stockValue.Bid)) Console.WriteLine(time + " Signal " + signal.Id + " sell " + signal.TradingAsset.Id + " " + stockValue.Bid); return false; }
protected override bool Sell(Signal signal, DateTime time, Price stockValue) { if (_ptf.GetPosition(_index.Id).Quantity > 0) { _ptf.BookTrade(signal.Trade); Log.Instance.WriteEntry(time + " Signal " + signal.Id + ": Unexpected positive position. SELL " + signal.Trade.Id + " " + stockValue.Offer, EventLogEntryType.Error); } else if (_ptf.GetPosition(_index.Id).Quantity == 0) { if (!_ptf.BookTrade(signal.Trade)) return false; string tradeRef = signal.Trade == null ? "" : " " + signal.Trade.Reference; Log.Instance.WriteEntry(time + tradeRef + " Signal " + signal.Id + ": SELL " + signal.TradingAsset.Id + " " + stockValue.Bid, EventLogEntryType.Information); } return true; }
protected virtual bool OnSell(Signal signal, DateTime time, Price stockValue) { if (_tradingSignals != null) { if (_tradingSignals.Contains(signal.Id)) { var pos = _ptf.GetPosition(signal.TradingAsset.Id); if (pos == null) { Reset(time, stockValue.Mid(), true); return false; } if (pos.Quantity < 0) { Log.Instance.WriteEntry(time + " Signal " + signal.Id + ": Some trades are still open. last trade: " + signal.Trade.Id + " " + stockValue.Bid + ". Closing all positions...", EventLogEntryType.Error); Portfolio.Instance.CloseAllPositions(time, signal.TradingAsset.Id, stockValue.Offer, signal); return false; } signal.Trade = new Trade(time, signal.TradingAsset.Id, SIGNAL_CODE.SELL, _amount, stockValue.Bid, 0, Reset); return Sell(signal, time, stockValue); } } return false; }
public override void Insert(DateTime updateTime, Signal signal, SIGNAL_CODE code, decimal stockvalue) { var time = new DateTime(updateTime.Year, updateTime.Month, updateTime.Day, updateTime.Hour, updateTime.Minute, updateTime.Second); if (((SIGNAL_CODE)_expectedSignalData[signal.Id].Value(time).Value.Value.Bid != code) || Math.Abs(_expectedSignalData[signal.Id].Value(time).Value.Value.Offer - stockvalue) > TOLERANCE) { string error; if ((SIGNAL_CODE)_expectedSignalData[signal.Id].Value(time).Value.Value.Bid != code) error = "Test failed: signal " + signal.Name + " time " + time.ToShortTimeString() + " expected value " + ((SIGNAL_CODE)_expectedSignalData[signal.Id].Value(time).Value.Value.Bid).ToString() + " != " + code.ToString(); else error = "Test failed: signal stock value " + signal.Name + " time " + time.ToShortTimeString() + " expected value " + (_expectedSignalData[signal.Id].Value(time).Value.Value.Offer).ToString() + " != " + stockvalue.ToString(); Log.Instance.WriteEntry(error, EventLogEntryType.Error); throw new ApplicationException(error); } }
public override void Insert(DateTime updateTime, Signal signal, SIGNAL_CODE code, decimal stockvalue) { check(updateTime, signal.Id); string tradeRef = signal.Trade == null ? "" : " " + signal.Trade.Reference; var newLine = string.Format("{0},{1},{2},{3},{4},{5}{6}", DATATYPE_SIGNAL, signal.Id, formatDateTime(updateTime), tradeRef, (int)code, stockvalue, Environment.NewLine); _csvSignalStringBuilder.Append(newLine); }
protected override bool Sell(Signal signal, DateTime time, Price stockValue) { if (!_ptf.BookTrade(signal.Trade)) return false; string tradeRef = signal.Trade == null ? "" : " " + signal.Trade.Reference; Log.Instance.WriteEntry(time + tradeRef + " Signal " + signal.Id + ": SELL " + signal.TradingAsset.Id + " " + stockValue.Offer, EventLogEntryType.Information); return true; }
protected abstract bool Sell(Signal signal, DateTime time, Price stockValue);