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);
        }
Пример #2
0
        public MarketAction ClassifyRecord(ForexTreeData forexRecord)
        {
            if (!_initialised)
            {
                throw new BllException("Can't deduce market action because agent is not initialised.");
            }

            return(_decisionTree.ClassifyRecord(forexRecord));
        }
        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);
        }
        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.");
            }
        }