Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
 /// <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;
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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;
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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;
                }
            }
        }
Beispiel #7
0
        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);
                }
            }
        }