Пример #1
0
 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;
 }
Пример #2
0
 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;
 }
Пример #3
0
        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;
        }
Пример #4
0
 public abstract void Insert(DateTime updateTime, Signal signal, SIGNAL_CODE code, decimal stockvalue);
Пример #5
0
 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;
 }
Пример #6
0
 protected bool _onHold(Signal signal, DateTime updateTime, Price value)
 {
     // hold your position; do nothing
     return true;
 }
Пример #7
0
 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;
     }
 }
Пример #8
0
 public void Subscribe(Signal.Tick onBuy, Signal.Tick onSell)
 {
     _onBuy = onBuy;
     _onSell = onSell;
     foreach (Indicator indicator in _mktIndicator)
         indicator.Subscribe(OnUpdate, null);
 }
Пример #9
0
 protected abstract bool Process(MarketData indicator, DateTime updateTime, Price value, ref Signal.Tick tradingOrder);
Пример #10
0
 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;
 }
Пример #11
0
 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;
 }
Пример #12
0
 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;
 }
Пример #13
0
 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;
 }
Пример #14
0
 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;
 }
Пример #15
0
 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);
     }
 }
Пример #16
0
 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);
 }
Пример #17
0
 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;
 }
Пример #18
0
 protected abstract bool Sell(Signal signal, DateTime time, Price stockValue);