public static List <Transfer> DetectAndExecuteRollupTransfers_Live(int rollupNumber, int arbitrationRunId, List <BaseExchange> exchanges, ILog log = null) { DataTable transfersToExecute = CalculateRollupTransfers(rollupNumber, arbitrationRunId); List <Transfer> transfers = null; //If there were transfers found that need to be executed. if (transfersToExecute != null) { foreach (DataRow transferRow in transfersToExecute.Rows) { BaseExchange originExchange = GetExchangeFromListByName((string)transferRow["BUY_EXCHANGE"], exchanges); BaseExchange destinationExchange = GetExchangeFromListByName((string)transferRow["SELL_EXCHANGE"], exchanges); decimal amount = (decimal)transferRow["AMOUNT"]; //Validate inputs Create the transfer object try { //This might throw a NotEnoughBtcException Transfer transfer = ValidateInputsAndBuildTransferObject(originExchange, destinationExchange, amount); //Setting transfer list here, because at least one transfer was found and properly built if (transfers == null) { transfers = new List <Transfer>(); } //Execute the actual transfer originExchange.Transfer(amount, destinationExchange.BitcoinDepositAddress); //Save the transfer object to the DB before returning transfer.PersistToDb(); //If a log was given, create a log message if (log != null) { log.Info(String.Format(LOG_MESSAGE, transfer.Id.Value, transfer.Amount, transfer.OriginExchange.Name, transfer.DestinationExchange.Name)); } //Update all the necessary arbitration trades with the transfer id UpdateArbitrationTradesWithTransferId(arbitrationRunId, transfer.OriginExchange.Name, transfer.DestinationExchange.Name, transfer.Id.Value); transfers.Add(transfer); } catch (NotEnoughBtcException) { //This may or may not be a valid error. If there is not enough btc for the transfer, but there is btc in transfer, then it's ok, the transfers //just need to get caught up. In this case, do nothing; just need to wait until the transfer complete and try again. But, if there is still not //enough btc while accounting for the amount in transfer, this is a legitmate error, so rethrow. if (!(Decimal.Add(originExchange.AvailableBtc, originExchange.BTCInTransfer) >= amount)) { throw; } } } } return(transfers); }
/// <summary> /// Transfers coins between the given exchanges. Coin amounts are not updated. /// This method throws an ArgumentException is Amount is greater than the AvailableBtc of the given origin exchange, /// the given exchanges are null, or Amount is less than or equal to 0. /// </summary> /// <param name="originExchange">The exchange coins will be moved out of.</param> /// <param name="destinationExchange">The exchange coins will be sent to.</param> /// <param name="amount">The number of bitcoins to be exchanged between the two giving exchanges.</param> /// <returns>A transfer object representing the transfer that took place. This method saves the transfer /// object to the DB before it is returned.</returns> public static Transfer OnTimeTransfer_Live(BaseExchange originExchange, BaseExchange destinationExchange, decimal amount, ILog log = null) { Transfer returnTransfer = ValidateInputsAndBuildTransferObject(originExchange, destinationExchange, amount); originExchange.Transfer(amount, destinationExchange.BitcoinDepositAddress); //Save the transfer object to the DB before returning returnTransfer.PersistToDb(); //If a log was given, create a log message if (log != null) { log.Info(String.Format(LOG_MESSAGE, returnTransfer.Id.Value, returnTransfer.Amount, returnTransfer.OriginExchange.Name, returnTransfer.DestinationExchange.Name)); } return(returnTransfer); }