public MarketAction ClassifyRecord(ForexTreeData forexRecord) { if (!_initialised) { throw new BllException("Can't deduce market action because agent is not initialised."); } return _decisionTree.ClassifyRecord(forexRecord); }
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); }