public MarketAction ClassifyRecord(ForexTreeData forexRecord)
        {
            if (!_initialised)
            {
                throw new BllException("Can't deduce market action because agent is not initialised.");
            }

            return _decisionTree.ClassifyRecord(forexRecord);
        }
Beispiel #2
0
        public static ForexTreeData BuildForexTreeRecord(ForexRecord record, ForexTrackData options)
        {
            var spread = record.Bid - record.Ask;

            var prevSize = options.CurrentRecord - 1;

            options.BidMean = (prevSize * options.BidMean + record.Bid) / options.CurrentRecord;
            options.AskMean = (prevSize * options.AskMean + record.Ask) / options.CurrentRecord;
            options.SpreadMean = (prevSize * options.SpreadMean + spread) / options.CurrentRecord;

            if (prevSize > 0)
            {
                var differenceBid = record.Bid - options.BidMean;
                options.BidVariance = (double)prevSize / options.CurrentRecord * options.BidVariance + 1.0 / prevSize * differenceBid * differenceBid;

                var differenceAsk = record.Ask - options.AskMean;
                options.AskVariance = (double)prevSize / options.CurrentRecord * options.AskVariance + 1.0 / prevSize * differenceAsk * differenceAsk;

                var differenceSpread = spread - options.SpreadMean;
                options.SpreadVariance = (double)prevSize / options.CurrentRecord * options.SpreadVariance + 1.0 / prevSize * differenceSpread * differenceSpread;
            }

            var forexTreeData = new ForexTreeData
            {
                Bid = record.Bid,
                Ask = record.Ask,
                Spread = MathHelpers.PreservePrecision(spread),

                BidChange = options.PreviousBid < 0.0 ? 0.0 : MathHelpers.PreservePrecision(record.Bid / options.PreviousBid - 1),
                AskChange = options.PreviousAsk < 0.0 ? 0.0 : MathHelpers.PreservePrecision(record.Ask / options.PreviousAsk - 1),
                SpreadChange = options.PreviousSpread >= 0.0 ? 0.0 : MathHelpers.PreservePrecision(spread / options.PreviousSpread - 1),

                BidStandardDeviation = MathHelpers.PreservePrecision(Math.Sqrt(options.BidVariance)),
                AskStandardDeviation = MathHelpers.PreservePrecision(Math.Sqrt(options.AskVariance)),
                SpreadStandardDeviation = MathHelpers.PreservePrecision(Math.Sqrt(options.SpreadVariance)),

                BidMovingAverage = MathHelpers.PreservePrecision(options.BidMean),
                AskMovingAverage = MathHelpers.PreservePrecision(options.AskMean),
                SpreadMovingAverage = MathHelpers.PreservePrecision(options.SpreadMean)
            };

            options.PreviousBid = record.Bid;
            options.PreviousAsk = record.Ask;
            options.PreviousSpread = spread;

            return forexTreeData;
        }
 public void PlaceBid(ForexTreeData record, MarketAction action)
 {
     switch (action)
     {
         case MarketAction.Buy:
             ExecuteBuy(record);
             break;
         case MarketAction.Sell:
             ExecuteSell(record);
             break;
         case MarketAction.Hold:
             SaveLogRecord(0.0, 0.0, 0.0, MarketAction.Hold, record.Action);
             break;
         default:
             throw new BllException("Incorrect market action.");
     }
 }
        private void ExecuteSell(ForexTreeData record)
        {
            if (BuyQuantities.Count < 1)
            {
                throw new BllException("You have no open positions to close for sell.");
            }

            var tradeUnits = BidSize / MarginRatio;
            var unitsSold = BuyQuantities[0];
            var profit = MathHelpers.GreedyCurrencyPrecision(unitsSold / record.Ask - tradeUnits);
            Profits.Add(profit);

            BuyQuantities.RemoveAt(0);
            SaveLogRecord(0.0, unitsSold, profit, MarketAction.Sell, record.Action);
        }
 private void ExecuteBuy(ForexTreeData record)
 {
     var tradeUnits = BidSize / MarginRatio;
     var unitsBought = tradeUnits * record.Bid;
     BuyQuantities.Add(unitsBought);
     SaveLogRecord(unitsBought, 0.0, 0.0, MarketAction.Buy, record.Action);
 }