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)); } }
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(); }
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); }
//Тест проверяет правильно ли срабатывает 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 ..."); }