public void TestMethod1()
        {
            //Входные данные
            //Создать 2 условия
            int index1 = 0, index2 = 0;
            int curIndex                 = 60;
            ParameterCondition par1      = ParameterCondition.PriceClose;
            ParameterCondition par2      = ParameterCondition.PriceOpen;
            Predicate          predicate = Predicate.Less;

            Condition cond = new Condition(index1, index2, par1, par2, null, null, 0.0, 0.0, predicate);

            int index1_ = 1, index2_ = 1;
            ParameterCondition par1_      = ParameterCondition.Indicator;
            ParameterCondition par2_      = ParameterCondition.Indicator;
            Predicate          predicate_ = Predicate.MoreEqual;
            Indicator          ind1       = new SMA(14);
            Indicator          ind2       = new SMA(28);

            Condition cond2 = new Condition(index1_, index2_, par1_, par2_, ind1, ind2, 0.0, 0.0, predicate_);


            //Накопить данные для индикаторов
            for (int i = 0; i < curIndex; i++)
            {
                ind1.update_value(i, instrument);
                ind2.update_value(i, instrument);
            }


            //Создать правило
            TradingRule rule = new TradingRule();

            rule.add_condition(cond);
            rule.add_condition(cond2);

            string          name     = "TestStrategy1";
            DateTime        dateTime = DateTime.Now;
            TradingStrategy strat    = new TradingStrategy(name);

            strat.add_rule(rule);
            strat.save_to_xml();

            controller.add_strategy(new CaretakerStrategy(strat));

            TradingStrategy strat1 = controller.get_strategy(name).Originator;

            File.Delete("Strategies\\TestStrategy1.xml");

            Assert.AreEqual(strat.Loaded &&
                            strat.Name == name &&
                            strat.DateOfChange == dateTime &&
                            strat.DateOfCreation == dateTime, true);
        }
        public ResponseResult <Guid> SetUpAlert(TradingRule rule, bool callOnce = true)
        {
            var currentRate = _bitfinexClient.GetTrades(rule.Pair.Name.ToUpper(), 1).Data.First().Price;
            var wasShown    = false;

            var subscription = _bitfinexSocketClient.SubscribeToTradeUpdates("t" + rule.Pair.Name.ToUpper(), (data) =>
            {
                var input = data.Select(d => new TradeSimple()
                {
                    Price  = d.Price,
                    Amount = d.Amount
                }).First();

                if (!wasShown || !callOnce)
                {
                    if (currentRate < rule.Boundary)
                    {
                        if (input.Price >= rule.Boundary)
                        {
                            rule.Callback?.Invoke();
                            wasShown = true;
                        }
                    }
                    else if (currentRate > rule.Boundary)
                    {
                        if (input.Price <= rule.Boundary)
                        {
                            rule.Callback?.Invoke();
                            wasShown = true;
                        }
                    }
                    else
                    {
                        rule.Callback?.Invoke();
                        wasShown = true;
                    }
                }
            });

            if (!subscription.Success)
            {
                return(new ResponseResult <Guid>(subscription.Error.Message));
            }
            else
            {
                var id = Guid.NewGuid();
                Alerts.Add(id, subscription.Data);

                return(new ResponseResult <Guid>(id));
            }
        }
Exemple #3
0
        protected override async Task <Order> PlaceOrder(TradingRule rule)
        {
            // The order type: limit, market, or fill-or-kill
            var result = await client.NewOrderAsync(rule.OrderSide.ToString(), rule.Market, rule.OrderRate, rule.OrderVolume, rule.OrderType).ConfigureAwait(false);

            if (!result.Success)
            {
                throw new ApiException(result.Error);
            }
            var si = GetSymbolInformation(rule.Market);

            //return Convert(result.Data, si);
            throw new NotImplementedException();
        }
Exemple #4
0
        private TradingRule CreateTakeProfit(string pair, decimal trigger, decimal price, decimal amount)
        {
            var rule = new TradingRule();

            rule.Market        = pair;
            rule.Operator      = ThresholdOperator.GreaterOrEqual;
            rule.Property      = ThresholdType.BidPrice;
            rule.ThresholdRate = trigger;
            rule.OrderRate     = price;
            rule.OrderVolume   = amount;
            rule.OrderSide     = TradeSide.Sell;
            rule.OrderType     = "market";
            return(rule);
        }
Exemple #5
0
        //Тест проверяет правильно ли срабатывает TradingRule
        public void test_TradingRule()
        {
            //Входные данные

            //Создать 2 условия
            int index1 = 0, index2 = 0;
            int curIndex                 = 60;
            ParameterCondition par1      = ParameterCondition.PriceMax;
            ParameterCondition par2      = ParameterCondition.PriceMin;
            Predicate          predicate = Predicate.Less;

            Condition cond = new Condition(index1, index2, par1, par2, null, null, 0.0, 0.0, predicate);

            int index1_ = 1, index2_ = 1;
            ParameterCondition par1_      = ParameterCondition.Indicator;
            ParameterCondition par2_      = ParameterCondition.Indicator;
            Predicate          predicate_ = Predicate.MoreEqual;
            Indicator          ind1       = new SMA(14);
            Indicator          ind2       = new MACD(28);

            Condition cond2 = new Condition(index1_, index2_, par1_, par2_, ind1, ind2, 0.0, 0.0, predicate_);


            //Накопить данные для индикаторов
            for (int i = 0; i < curIndex; i++)
            {
                ind1.update_value(i, instrument);
                ind2.update_value(i, instrument);
            }


            //Создать правило
            TradingRule rule = new TradingRule(Signal.Buy);

            rule.add_condition(cond);
            rule.add_condition(cond2);

            bool expected = instrument.get_interval(curIndex, index1).ClosingPrice <
                            instrument.get_interval(curIndex, index1).OpeningPrice&&
                            ind1.get_value(curIndex, index1_) >= ind2.get_value(curIndex, index2_);

            Assert.AreEqual(expected, rule.check(curIndex, instrument));
        }
        // TODO: below FUNC is EXACT COPY of ExecuteOrder(), so do home work and refactor.
        protected override async Task <Order> PlaceOrder(TradingRule rule)
        {
            var si        = GetSymbolInformation(rule.Market);
            var orderType = Binance.OrderType.MARKET;

            Enum.TryParse <Binance.OrderType>(rule.OrderType, ignoreCase: true, result: out orderType);
            decimal?price = null;

            if (orderType == Binance.OrderType.LIMIT)
            {
                if (rule.OrderSide == TradeSide.Buy)
                {
                    price = si.ClampPrice(rule.ThresholdRate * 1.01m);
                }
                else
                {
                    price = si.ClampPrice(rule.ThresholdRate * 0.99m);
                }
            }
            var result = await client.PlaceOrderAsync(
                rule.Market,
                rule.OrderSide == TradeSide.Buy?Binance.TradeSide.BUY : Binance.TradeSide.SELL,
                orderType,
                rule.OrderVolume,
                price,
                null,
                orderType == Binance.OrderType.LIMIT?Binance.TimeInForce.IOC : Binance.TimeInForce.GTC
                ).ConfigureAwait(false);

            if (result.Success)
            {
                return(Convert(result.Data));
            }
            else
            {
                throw new ApiException(result.Error);
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Started ...");

            TradingMarket market;

            Console.WriteLine("Choose traiding market (0-bitfinex): ");
            var marketNum = Convert.ToInt32(Console.ReadLine());

            market = (TradingMarket)marketNum;

            IMarketClient marketClient;

            switch (market)
            {
            case TradingMarket.Bitfinex:
                marketClient = new BitfinexClient();
                break;

            default:
                marketClient = new BitfinexClient();
                break;
            }
            Console.WriteLine("You chose next market: {0}", marketClient.Name);

            TradingPair pair;

            do
            {
                Console.WriteLine("Choose currency pair (e.g. 'btcusd'): ");
                var name = Console.ReadLine();
                pair = marketClient.GetPairByName(name);
            }while (pair == null);
            Console.WriteLine("Info for {0}/{1} :", pair.Title, pair.Name);


            Console.WriteLine("Enter boundary (or 'no' if you don't want): ");
            var boundary = Console.ReadLine();

            decimal parsedBoundary;

            if (boundary != "no" && decimal.TryParse(boundary, out parsedBoundary))
            {
                var rule = new TradingRule();
                rule.Pair     = pair;
                rule.Boundary = parsedBoundary;
                rule.Callback = () => Console.WriteLine("We broke boundary, sending smth to telegram or viber!");

                marketClient.SetUpAlert(rule, false);
            }

            var previous = default(decimal);

            using (marketClient)
            {
                var subscriptionResult = marketClient.SubscribeToTraidingPair(pair, (data) =>
                {
                    var current = data.Price;

                    ConsoleColor color;
                    if (previous > current)
                    {
                        color = ConsoleColor.Red;
                    }
                    else if (previous < current)
                    {
                        color = ConsoleColor.Green;
                    }
                    else
                    {
                        color = ConsoleColor.Yellow;
                    }

                    Console.ForegroundColor = color;

                    previous = current;
                    Console.WriteLine(current);
                });
                Console.ReadLine();
                marketClient.UnsubscribeTraidingPair(subscriptionResult.Data);
            }

            Console.WriteLine("Finished ...");
        }