private void ThreadRun() { System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; while (CanRun) { if (!APIWrapper.ValidAuthorization) { System.Threading.Thread.Sleep(500); continue; } lock (this) { bool NewOrder = false; // Verify, if we have order. if (OrderID == 0) { // Need to create order. OrderID = APIWrapper.OrderCreate(ServiceLocation, Algorithm, StartingAmount, StartingPrice, StartLimit, PoolData); if (OrderID > 0) { NewOrder = true; LibConsole.WriteLine(LibConsole.TEXT_TYPE.INFO, "Created new order #" + OrderID.ToString()); } } if (OrderID > 0) { // Get all orders. List<Order> AllOrders = APIWrapper.GetAllOrders(ServiceLocation, Algorithm, NewOrder); if (AllOrders != null) { // Find our order. Order MyOrder = null; foreach (Order O in AllOrders) { if (O.ID == OrderID) { MyOrder = O; break; } } // Get total hashing speed double TS = APIWrapper.GetTotalSpeed(ServiceLocation, Algorithm); if (MyOrder != null) { ProcessMyOrder(MyOrder, AllOrders.ToArray(), TS); LastOrderStats = new Order(MyOrder); } else { // Our order does not exist anymore, create new... OrderID = 0; LastOrderStats = null; } } } } // Wait 30 seconds. for (int i = 0; i < 30; i++) { if (!CanRun) break; System.Threading.Thread.Sleep(1000); } } }
/// <summary> /// Make a memory copy of existing order. /// </summary> /// <param name="O">Existing order.</param> public Order(Order O) { ID = O.ID; Algorithm = O.Algorithm; Alive = O.Alive; BTCAvailable = O.BTCAvailable; SpeedLimit = O.SpeedLimit; Price = O.Price; Speed = O.Speed; Workers = O.Workers; EndTime = O.EndTime; ServiceLocation = O.ServiceLocation; }
private void ProcessMyOrder(Order MyOrder, Order[] AllOrders, double TotalSpeed) { // Change limit if requested by user. if (MyOrder.SpeedLimit != StartLimit) { LibConsole.WriteLine(LibConsole.TEXT_TYPE.INFO, "Changing limit order #" + MyOrder.ID + " to " + StartLimit.ToString("F2")); MyOrder.SetLimit(StartLimit); } // Check if refill is needed. if (MyOrder.BTCAvailable <= 0.003) { LibConsole.WriteLine(LibConsole.TEXT_TYPE.INFO, "Refilling order #" + MyOrder.ID); if (MyOrder.Refill(0.01)) MyOrder.BTCAvailable += 0.01; } // Do not adjust price, if order is dead. if (!MyOrder.Alive) return; // Adjust price. double MinimalPrice = GetMinimalNeededPrice(AllOrders, TotalSpeed); if (!IncreasePrice(MyOrder, AllOrders, MinimalPrice)) DecreasePrice(MyOrder, AllOrders, MinimalPrice); }
private bool IncreasePrice(Order MyOrder, Order[] AllOrders, double MinimalPrice) { // Do not make price higher if we are already on top of the list (first alive). // Consider fixed orders. foreach (Order O in AllOrders) { if (!O.Alive) continue; if (O.OrderType == 1) continue; if (O == MyOrder) return false; else break; } // Do not increase price, if we already have price higher or equal compared to minimal price. if (MyOrder.Price >= MinimalPrice) return false; if (MaxPrice >= MinimalPrice) { // We can set higher price. LibConsole.WriteLine(LibConsole.TEXT_TYPE.INFO, "Setting price order #" + MyOrder.ID + " to " + MinimalPrice.ToString("F4")); double NewP = MyOrder.SetPrice(MinimalPrice); if (NewP > 0) MyOrder.Price = NewP; return true; } else if (MyOrder.Price < MaxPrice) { // We can at least set price to be MaxPrice LibConsole.WriteLine(LibConsole.TEXT_TYPE.INFO, "Setting price order #" + MyOrder.ID + " to " + MaxPrice.ToString("F4")); double NewP = MyOrder.SetPrice(MaxPrice); if (NewP > 0) MyOrder.Price = NewP; return true; } return false; }
private double GetMinimalNeededPrice(Order[] AllOrders, double TotalSpeed) { double TotalWantedSpeed = 0; int i; double Multi = 1; if (Algorithm == 1) Multi = 1000; for (i = 0; i < AllOrders.Length; i++) { if (AllOrders[i].SpeedLimit == 0) TotalWantedSpeed += 1000000000; else TotalWantedSpeed += AllOrders[i].SpeedLimit * Multi; if (TotalWantedSpeed > TotalSpeed) break; } if (i == AllOrders.Length) i = AllOrders.Length - 1; return (AllOrders[i].Price + 0.0001); }
private void DecreasePrice(Order MyOrder, Order[] AllOrders, double MinimalPrice) { // Check time if decrase is possible. if (DecreaseTime + APIWrapper.PRICE_DECREASE_INTERVAL > DateTime.Now) return; // Decrease only in case if we are still above or equal to minimal price. Or if we are above maximal price. if (MyOrder.Price + APIWrapper.PRICE_DECREASE_STEP[MyOrder.Algorithm] >= MinimalPrice || MyOrder.Price > MaxPrice) { double NewP = MyOrder.SetPriceDecrease(); if (NewP > 0) { MyOrder.Price = NewP; LibConsole.WriteLine(LibConsole.TEXT_TYPE.INFO, "Decreasing price order #" + MyOrder.ID + " to " + NewP.ToString("F4")); DecreaseTime = DateTime.Now; } } }
public void RefreshStats() { if (LinkedInstance == null) OrderStats = null; OrderStats = LinkedInstance.GetDetails(); if (OrderStats != null && OrderStats.ID != ID) { ID = OrderStats.ID; Commit(); } if (HandlerMethod != null) { object[] Parameters = new object[3]; Parameters[0] = OrderStats; Parameters[1] = MaxPrice; Parameters[2] = Limit; HandlerMethod.Invoke(null, Parameters); if ((double)Parameters[1] != MaxPrice) { MaxPrice = (double)Parameters[1]; if (MaxPrice < 0) MaxPrice = 0.001; LinkedInstance.SetMaximalPrice(MaxPrice); } if ((double)Parameters[2] != Limit) { Limit = (double)Parameters[2]; if (Limit < 0) Limit = 0; LinkedInstance.SetLimit(Limit); } } }