コード例 #1
0
        public void TestRemove()
        {
            for (var i = 0; i < 10; i++)
            {
                list.AddLast(i);
            }
            Assert.AreEqual(0, list.First.Value);
            Assert.AreEqual(9, list.Last.Value);
            list.RemoveFirst();
            Assert.AreEqual(1, list.First.Value);
            Assert.AreEqual(9, list.Last.Value);
            list.RemoveLast();
            Assert.AreEqual(1, list.First.Value);
            Assert.AreEqual(8, list.Last.Value);
            list.Remove(4);
            list.Remove(7);
            list.Remove(8);
            list.Remove(1);
            var node = list.First;

            Assert.AreEqual(2, node.Value);
            node = node.Next;
            Assert.AreEqual(3, node.Value);
            node = node.Next;
            Assert.AreEqual(5, node.Value);
            node = node.Next;
            Assert.AreEqual(6, node.Value);
            node = node.Next;
            Assert.AreEqual(null, node);
        }
コード例 #2
0
        public override void OnChangeTrade(TransactionPairBinary comboTrade, LogicalFill fill, LogicalOrder filledOrder)
        {
            var tick     = Ticks[0];
            var midpoint = (tick.Ask + tick.Bid) / 2;

            if (!fill.IsComplete)
            {
                return;
            }
            if (Position.Size > maxTradeSize)
            {
                maxTradeSize = Position.Size;
            }
            if (comboTrade.CurrentPosition > 0 && fill.Price < maxExcursionLine[0])
            {
                maxExcursionLine[0] = fill.Price;
            }
            if (comboTrade.CurrentPosition < 0 && fill.Price > maxExcursionLine[0])
            {
                maxExcursionLine[0] = fill.Price;
            }
            var size   = Math.Abs(comboTrade.CurrentPosition);
            var lots   = size / lotSize;
            var change = size - lastSize;

            lastSize = size;
            if (change > 0)
            {
                if (enableManageRisk)
                {
                    state = StrategyState.HighRisk;
                }
                var tempIndifference = CalcIndifferencePrice(comboTrade);
                if (Position.IsLong && tempIndifference < bestIndifferenceLine[0])
                {
                    bestIndifferenceLine[0] = tempIndifference;
                }
                if (Position.IsShort && tempIndifference > bestIndifferenceLine[0])
                {
                    bestIndifferenceLine[0] = tempIndifference;
                }
                if (lots > nextIncreaseLots)
                {
                    nextIncreaseLots = (nextIncreaseLots * 3) / 2;
                }
                sequentialIncreaseCount++;
                var changed = false;
                change = Math.Abs(change);
                if (fills.First != null)
                {
                    var firstFill = fills.First.Value;
                    if (firstFill.Size + change <= lotSize)
                    {
                        firstFill.Size += change;
                        changed         = true;
                    }
                }
                if (!changed)
                {
                    fills.AddFirst(new LocalFill(change, fill.Price, fill.Time));
                }
                SetupBidAsk(fill.Price);
            }
            else
            {
                sequentialIncreaseCount = 0;
                change = Math.Abs(change);
                var prevFill = fills.First.Value;
                if (change <= prevFill.Size)
                {
                    prevFill.Size -= change;
                    if (prevFill.Size == 0)
                    {
                        fills.RemoveFirst();
                        if (fills.Count > 0)
                        {
                            SetupBidAsk(fill.Price);
                        }
                    }
                    return;
                }
                change -= prevFill.Size;
                fills.RemoveFirst();
                SetupBidAsk(fill.Price);
                return;

                //for (var current = fills.Last; current != null; current = current.Previous)
                //{
                //    prevFill = current.Value;
                //    if (change > prevFill.Size)
                //    {
                //        change -= prevFill.Size;
                //        fills.Remove(current);
                //        if (fills.Count > 0)
                //        {
                //            SetupBidAsk(fill.Price);
                //        }
                //    }
                //    else
                //    {
                //        prevFill.Size -= change;
                //        if (prevFill.Size == 0)
                //        {
                //            fills.Remove(current);
                //            if (fills.Count > 0)
                //            {
                //                SetupBidAsk(fill.Price);
                //            }
                //        }
                //        break;
                //    }
                //}
            }
            LogFills("OnChange");
        }