예제 #1
0
        public void BaseAmountAndPrice()
        {
            // arrange
            var tradeSettings = new TradeSettings {
                CounterAmount = 10, BuyUnderPriceMargin = 1, BaseAmountSavingsRate = 5, SellPriceRate = 10
            };
            var ticker = new Ticker {
                Last = 9500
            };
            var pairInfo = new TradingPairInfo {
                BaseDecimals = 8, CounterDecimals = 2
            };

            // act
            var baseAmount     = tradeSettings.GetBuyBaseAmount(ticker, pairInfo);
            var basePrice      = tradeSettings.GetBuyBasePrice(ticker, pairInfo);
            var sellBaseAmount = tradeSettings.GetSellBaseAmount(ticker, pairInfo);
            var sellBasePrice  = tradeSettings.GetSellBasePrice(ticker, pairInfo);

            // assert
            Assert.AreEqual(baseAmount, 0.00106326M);
            Assert.AreEqual(basePrice, 9405M);
            Assert.AreEqual(sellBaseAmount, 0.001010097M);
            Assert.AreEqual(sellBasePrice, 10345.5M);
        }
예제 #2
0
        internal override async Task ExecuteAsync()
        {
            // get ticker
            var ticker = await BitstampTrader.GetTickerAsync(TradeSession.PairCode);

            _tickers.Add(ticker);

            if (ExecuteTradeHolders())
            {
                return;
            }

            if (!PriceDropped())
            {
                return;
            }

            // get pair info
            var pairInfo = CacheHelper.GetFromCache <List <TradingPairInfo> >("TradingPairInfo").First(i => i.PairCode == TradeSession.PairCode.ToLower());

            // buy currency on Bitstamp exchange
            var orderResult = await BitstampTrader.BuyLimitOrderAsync(TradeSession, TradeSettings.GetBuyBaseAmount(ticker, pairInfo), TradeSettings.GetBuyBasePrice(ticker, pairInfo));

            // update database
            BitstampTrader.AddNewOrderToDb(orderResult, ticker, TradeSettings, pairInfo);
        }
예제 #3
0
 protected TradeRuleBase(BitstampTrader bitstampTrader, TradeSettings tradeSettings, params ITradeHolder[] tradeHolders)
 {
     BitstampTrader        = bitstampTrader;
     TradeSettings         = tradeSettings;
     TradeSession.PairCode = tradeSettings.PairCode;
     _tradeHolders         = tradeHolders;
 }
예제 #4
0
        public void RemoveTradeSettings(TradeSettings tradeSettings)
        {
            var idx = _tradeSettings.FindIndex(x => x.Id == tradeSettings.Id);

            _tradeSettings.RemoveAt(idx);

            SaveTradeSettings();
        }
예제 #5
0
        static void Main()
        {
            try
            {
                // initialize logger
                Log.Logger = new LoggerConfiguration()
                             .WriteTo.Console()
                             .MinimumLevel.Debug()
                             .CreateLogger();

                // initialize trader
                _trader = new BitstampTrader(TimeSpan.FromSeconds(15));

                var paircodes = new[] { BitstampPairCode.btceur, BitstampPairCode.xrpeur, BitstampPairCode.ltceur, BitstampPairCode.etheur, BitstampPairCode.bcheur };
                foreach (var bitstampPairCode in paircodes)
                {
                    var tradeSettings = new TradeSettings
                    {
                        PairCode              = bitstampPairCode.ToString(),
                        BuyUnderPriceMargin   = 0.4M,
                        CounterAmount         = 17,
                        BaseAmountSavingsRate = 3.0M,
                        SellPriceRate         = 6
                    };

                    var tradeRule = new BuyAfterDropTradeRule(_trader, tradeSettings, 2.5M, TimeSpan.FromMinutes(60),
                                                              new WaitPeriodAfterBuyOrderHolder(TimeSpan.FromHours(6)),
                                                              new MaxNumberOfBuyOrdersHolder(1),
                                                              new MaxNumberOfSellOrdersHolder(12));

                    //var tradeRule = new BuyPeriodicTradeRule(_trader, tradeSettings,
                    //    new WaitPeriodAfterBuyOrderHolder(TimeSpan.FromHours(1)),
                    //    new MaxNumberOfBuyOrdersHolder(1));

                    _trader.AddTradeRule(tradeRule);
                }

                _trader.AddTradeRule(new LinearSpreadTradeRule(_trader, new TradeSettings {
                    PairCode = BitstampPairCode.btcusd.ToString(), BuyUnderPriceMargin = 0.2M, CounterAmount = 10, BaseAmountSavingsRate = 0.75M, SellPriceRate = 2
                }, 1.0M));

                _trader.ErrorOccured           += ErrorOccured;
                _trader.TickerRetrieved        += TickerRetrieved;
                _trader.BuyLimitOrderPlaced    += BuyLimitOrderPlaced;
                _trader.BuyLimitOrderExecuted  += BuyLimitOrderExecuted;
                _trader.SellLimitOrderPlaced   += SellLimitOrderPlaced;
                _trader.SellLimitOrderExecuted += SellLimitOrderExecuted;

                // start trader
                _trader.Start();

                System.Console.ReadLine();
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e);
            }
        }
예제 #6
0
 public static AccountView ToView(this AccountSettings account, TradeSettings tradeSettings)
 {
     return(new AccountView()
     {
         TradeSettings = tradeSettings.ToView(),
         Number = account.Account,
         Symbol = account.Symbol,
         Lots = account.Lot
     });
 }
예제 #7
0
        public void Init(TradeSettings tradeSettings)
        {
            _tradeSettings = tradeSettings;

            if (String.IsNullOrEmpty(_tradeSettings.Id))
            {
                this.btnRemove.Hide();
            }
            BindData();
        }
예제 #8
0
        public PositionManager(IOrderMaker orderMaker, TradeSettings tradeSettings, ILogger logger)
        {
            _orderMaker    = orderMaker;
            _tradeSettings = tradeSettings;
            _logger        = logger;

            if (_orderMaker.Name == ProviderName.HUA_NAN)
            {
                _orderMaker.AccountPositionUpdated += OrderMaker_AccountPositionUpdated;
            }
        }
예제 #9
0
 public static TradeSettingsView ToView(this TradeSettings settings)
 {
     return(new TradeSettingsView()
     {
         Id = settings.Id,
         Name = settings.Name,
         Interval = settings.Interval,
         DayTrade = settings.DayTrade,
         FileName = settings.FileName,
         Offset = settings.Offset
     });
 }
예제 #10
0
        public Uc_Strategy(IOrderMaker orderMaker, TradeSettings settings, ITimeManager timeManager, ILogger logger)
        {
            this._orderMaker    = orderMaker;
            this._tradeSettings = settings;
            this._timeManager   = timeManager;
            this._logger        = logger;

            InitializeComponent();

            if (!File.Exists(_tradeSettings.FileName))
            {
                File.Create(_tradeSettings.FileName).Close();
            }
            _positionFile    = new PositionFile();
            _positionManager = ServiceFactory.CreatePositionManager(_orderMaker, _tradeSettings, logger);

            this.timer.Interval = _tradeSettings.Interval;
            this.timer.Enabled  = true;

            #region  UI
            var lbl = UIHelpers.CreateLabel(_tradeSettings.Name);
            lbl.Font = new System.Drawing.Font("新細明體", 11.25F);
            this.tpTop.Controls.Add(lbl, 0, 0);


            this.tpTop.Controls.Add(UIHelpers.CreateLabel("即時部位:"), 2, 0);
            lblPosition = UIHelpers.CreateLabel("");
            this.tpTop.Controls.Add(lblPosition, 3, 0);


            lblTime = UIHelpers.CreateLabel("");
            this.tpTop.Controls.Add(lblTime, 4, 0);


            for (int i = 0; i < _tradeSettings.Accounts.Count; i++)
            {
                var item = _tradeSettings.Accounts[i];

                var uc_Account = new Uc_Account();
                uc_Account.BindData(item);

                this.uc_AccountList.Add(uc_Account);


                fpanelAccounts.Height += uc_Account.Height;
                this.fpanelAccounts.Controls.Add(uc_Account);
                fpanelAccounts.Controls.SetChildIndex(uc_Account, 0);


                this.Height += uc_Account.Height;
            }
            #endregion
        }
예제 #11
0
 public Trade
 (
     ILogger <Trade> logger,
     IRequest request,
     IConfiguration configuration
 )
 {
     _logger        = logger;
     _request       = request;
     _tradeSettings = configuration
                      .GetSection(typeof(TradeSettings).Name).Get <TradeSettings>();
 }
예제 #12
0
 internal void AddNewOrderToDb(ExchangeOrder order, Ticker ticker, TradeSettings tradeSettings, TradingPairInfo pairInfo)
 {
     _orderRepository.Add(new Order
     {
         BuyId          = order.Id,
         CurrencyPairId = GetCurrencyPairId(order.PairCode),
         //CurrencyPair = _currencyPairRepository.First(p => p.PairCode == order.PairCode), //todo: check with concrete repository
         BuyAmount  = order.Amount,
         BuyPrice   = order.Price,
         SellAmount = tradeSettings.GetSellBaseAmount(ticker, pairInfo),
         SellPrice  = tradeSettings.GetSellBasePrice(ticker, pairInfo)
     });
     _orderRepository.Save();
 }
예제 #13
0
        public void AddUpdateTradeSettings(TradeSettings tradeSettings)
        {
            if (String.IsNullOrEmpty(tradeSettings.Id))
            {
                //新增
                tradeSettings.Id = Guid.NewGuid().ToString();
                _tradeSettings.Add(tradeSettings);
            }
            else
            {
                var idx = _tradeSettings.FindIndex(x => x.Id == tradeSettings.Id);
                _tradeSettings[idx] = tradeSettings;
            }

            SaveTradeSettings();
        }
 public LinearSpreadTradeRule(BitstampTrader bitstampTrader, TradeSettings tradeSettings, decimal spreadPct, params ITradeHolder[] tradeHolders) : base(bitstampTrader, tradeSettings, tradeHolders)
 {
     _spreadPct = spreadPct;
 }
예제 #15
0
 public EditStrategyEventArgs(TradeSettings tradeSettings)
 {
     this.TradeSettings = tradeSettings;
 }
예제 #16
0
 public static IPositionManager CreatePositionManager(IOrderMaker orderMaker, TradeSettings tradeSettings, ILogger logger)
 {
     return(new PositionManager(orderMaker, tradeSettings, logger));
 }
예제 #17
0
 public BuyPeriodicTradeRule(BitstampTrader bitstampTrader, TradeSettings tradeSettings, params ITradeHolder[] tradeHolders)
     : base(bitstampTrader, tradeSettings, tradeHolders)
 {
 }
예제 #18
0
 public BuyAfterDropTradeRule(BitstampTrader bitstampTrader, TradeSettings tradeSettings, decimal dropRate, TimeSpan dropPeriod, params ITradeHolder[] tradeHolders)
     : base(bitstampTrader, tradeSettings, tradeHolders)
 {
     _dropRate   = dropRate;
     _dropPeriod = dropPeriod;
 }