Пример #1
0
        /// <summary>Called when new data is received</summary>
        public override void Step()
        {
            base.Step();
            if (!Instrument.NewCandle)
            {
                return;
            }

            var mcs = Instrument.MCS;

            // If there is an existing position, wait for it to close
            if (Positions.Count() >= MaxPositions)
            {
                return;
            }

            // If there is no price channel
            if (Channel == null)
            {
                return;
            }

            // Cancel any pending orders and replace them with new ones based on this channel
            Broker.CancelAllPendingOrders(Label);

            Dump();

            // The Channel
            var chan = Channel.Value;
            var risk = Risk / MaxPositions;
            var sign = chan.PrecedingTrendSign;

            //		// Create a pending order on the side opposite the preceding trend
            //		var ep = sign > 0 ? chan.Price.End + 0.5*mcs : chan.Price.Beg - 0.5*mcs;
            //		var sl = (QuoteCurrency?)null;//sign > 0 ? chan.Price.Beg : chan.Price.End;
            //		var tp = (QuoteCurrency?)null;//ep + sign * Math.Abs(ep - sl);
            //		var sl_rel = 5*mcs;//Math.Abs(ep - sl);
            //		var vol = Broker.ChooseVolume(Instrument, sl_rel, risk:risk);
            //		var trade = new Trade(Instrument, CAlgo.SignToTradeType(chan.PrecedingTrendSign), Label, ep, sl, tp, vol);
            //		trade.Expiration = Instrument.ExpirationTime(5);
            //		Broker.CreatePendingOrder(trade);

            // Create pending orders on either side of the channel
            {
                var ep    = chan.Price.End + 0.5 * mcs;
                var sl    = chan.Price.Beg;
                var tp    = (QuoteCurrency?)null;             // ep + chan.Price.Size * 5;
                var vol   = Broker.ChooseVolume(Instrument, Math.Abs(ep - sl), risk: risk);
                var trade = new Trade(Instrument, TradeType.Buy, Label, ep, sl, tp, vol);
                trade.Expiration = Instrument.ExpirationTime(5);
                Broker.CreatePendingOrder(trade);
            }
            {
                var ep    = chan.Price.Beg - 0.5 * mcs;
                var sl    = chan.Price.End;
                var tp    = (QuoteCurrency?)null;             // ep - chan.Price.Size * 5;
                var vol   = Broker.ChooseVolume(Instrument, Math.Abs(ep - sl), risk: risk);
                var trade = new Trade(Instrument, TradeType.Sell, Label, ep, sl, tp, vol);
                trade.Expiration = Instrument.ExpirationTime(5);
                Broker.CreatePendingOrder(trade);
            }

            // Debugging
            {
                var c = chan;
                for (; Channels.Count != 0 && c.Idx.Contains(Channels.Back().Idx);)
                {
                    Channels.PopBack();
                }
                Channels.Add(c);
            }
        }