예제 #1
0
        public void ClosePosition(Authorization authorization)//Закрытие позиции
        {
            //Makejson makejson = new Makejson();
            //Обнуляем переменные
            orderflagHigh         = false;
            LAST_MAC_HIGH_AVERAGE = 0;
            LAST_MAC_HIGH         = 100;
            MAC_HIGH_COUNT_ORDER  = 0;
            MAC_LOW_COUNT_ORDER   = 0;
            //отменяем все ордера
            CancelAllActiveOrder cancelorder = new CancelAllActiveOrder();

            url = cancelorder.CreateRequest(authorization, TimeValue);//задаем путь запроса

            string response = HTTP.Post(Makejson.Convert(cancelorder), url);
            //Получаем значение позиции
            GetMyPosition getPosition = new GetMyPosition {
                symbol = symbol
            };
            string            getPositionRequest  = getPosition.CreateRequest(authorization, TimeValue);
            string            getPositionResponse = HTTP.Get(getPositionRequest);
            GetMyPositionRoot ResultGetPosition   = Makeclass <GetMyPositionRoot> .Get(getPositionResponse);

            if (ResultGetPosition.ret_code != 0)
            {
                throw new Exception("Ошибка в закрытии позиции. RetCode = " + ResultGetPosition.ret_code + "Отправленный запрос - " + getPositionRequest + "; полученный запрос - " + getPositionResponse);
            }
            int    _qty  = ResultGetPosition.result.size; //Количество контрактов
            string _side = ResultGetPosition.result.side; //Long or Short

            //Выставляем рыночный ордер, чтобы закрыть позицию
            placeorder = new PlaceOrder
            {
                api_key       = api,
                qty           = _qty.ToString(),
                side          = _side == "Sell" ? "Buy" : "Sell",
                symbol        = symbol,
                order_type    = "Market",
                time_in_force = "GoodTillCancel",
                sign          = sign
            };

            url = placeorder.CreateRequest(authorization, TimeValue);//задаем путь запроса

            var            responseOrder = HTTP.Post(Makejson.Convert(placeorder), url);
            PlaceOrderRoot OrderTemp1    = Makeclass <PlaceOrderRoot> .Get(responseOrder);

            if (OrderTemp1.ret_code == 0)
            {
                Console.WriteLine("закрыли позицию без ошибок");
            }
            else
            {
                Console.WriteLine("что-то пошло не так при закрытии ошибки");
            };
        }
예제 #2
0
        public double PlaceActiveOrders(Authorization authorization, string position)//Выставить активный ордер
        {
            Console.WriteLine();
            SetPositionConstants(position);

            bool   againplaceorder = true;
            int    Count           = 0;
            var    OrderStatus     = "";
            string LastLimitPrice  = "";

            //Выставляем контракт по рынку
            placeorder = new PlaceOrder
            {
                api_key       = api,
                qty           = ContractQty.ToString(),
                side          = TempSide,
                symbol        = symbol,
                order_type    = "Market",
                time_in_force = "GoodTillCancel",
                sign          = sign
            };

            url = placeorder.CreateRequest(authorization, TimeValue);//задаем путь запроса
            //получаем ответ от выставленных контрактов
            var response = HTTP.Post(Makejson.Convert(placeorder), url);

            PlaceOrderRoot OrderRoot = Makeclass <PlaceOrderRoot> .Get(response);

            //Получаем цену ,по которой вошли в позицию
            double Price = OrderRoot.result.price;

            //Если выставляем лимитный ордер не в первый раз - отменяем сначала все активные ордера
            if (MAC_TEMP_COUNT_ORDER > 0)
            {
                CancelAllActiveOrder cancelorder = new CancelAllActiveOrder();
                url      = cancelorder.CreateRequest(authorization, TimeValue);//задаем путь запроса
                response = HTTP.Post(Makejson.Convert(cancelorder), url);
                Console.WriteLine("Отменили все ордера");
            }

            MAC_TEMP_COUNT_ORDER++;//Увеличили количество выставленных ордеров на 1, потому что сейчас выставим ордера


            Price = SetPrice(Price, FirstContract, position, 1);//Выставляем ордер от той цены позиции


            for (int i = 0; i < MAC_TEMP_COUNT_ORDER; i++) //Пытаемся выставить лимитные ордера
            {
                while (againplaceorder && Count < 20)      //Если цена пошла быстрее чем мы выставили ордер, то начинаем спамить с определенным шагом
                {
                    againplaceorder = false;
                    placeorder      = new PlaceOrder
                    {
                        api_key       = api,
                        qty           = (ContractQty).ToString(),
                        side          = TempSide == "Sell" ? "Buy" : "Sell",
                        symbol        = symbol,
                        price         = Price.ToString(),
                        order_type    = "Limit",
                        time_in_force = "PostOnly",
                        sign          = sign
                    };

                    url      = placeorder.CreateRequest(authorization, TimeValue);//задаем путь запроса
                    response = HTTP.Post(Makejson.Convert(placeorder), url);

                    PlaceOrderRoot placeOrderRoot = Makeclass <PlaceOrderRoot> .Get(response);


                    var temp_order_id = placeOrderRoot.result.order_id;

                    GetActiveOrderRealTime getOrder = new GetActiveOrderRealTime
                    {
                        api_key  = api,
                        order_id = temp_order_id,
                        symbol   = symbol,
                        sign     = sign
                    };
                    string getOrderjson     = getOrder.CreateRequest(authorization, TimeValue);
                    var    getOrderResponse = HTTP.Get(getOrderjson);
                    GetActiveOrderRealTimeRoot ResultGetOrder = Makeclass <GetActiveOrderRealTimeRoot> .Get(getOrderResponse);

                    if (Count != 0)
                    {
                        Console.WriteLine("Не успеели выставить ,идем еще ниже - " + Count);
                    }
                    if (ResultGetOrder.ret_code != 0)
                    {
                        againplaceorder = true;
                        throw new Exception("Что-то пошло не так при получении значения ActiveOrderRealTime. отправленный запрос - " + getOrderjson + " ; полученный запрос - " + getOrderResponse);
                    }

                    OrderStatus = ResultGetOrder.result.order_status;


                    Console.WriteLine("Цена ордера, который мы выставили - " + ResultGetOrder.result.price);
                    Console.WriteLine("Статус выставленного оордера - " + OrderStatus);
                    if (OrderStatus == "Cancelled")
                    {
                        Console.WriteLine("не успели выставить ордер, идем с шагом 0.5");
                        againplaceorder = true;
                        Price           = SetPrice(Price, 0.5, position, 2);
                        Count++;
                    }
                    LastLimitPrice = ResultGetOrder.result.price;
                }
                if (Count >= 20)
                {
                    ClosePosition(authorization);

                    Console.WriteLine("Больше 20 итераций");
                    //return Price - ContractStep;
                    return(SetPrice(Price, ContractStep, position, 2));
                }
                else
                {
                    Console.WriteLine("Могла бы быть такая цена - " + SetPrice(Price, ContractStep, position, 1));
                    Price = double.Parse(LastLimitPrice, CultureInfo.InvariantCulture);
                    Console.WriteLine("Но сейчас такая цена последняя выставленного ордера по запросу GET - " + Price);
                }

                // Price = SetPrice(Price, ContractStep, position, 1);
                Console.WriteLine("--итерация выставленного ордера:" + i + ";Всего нужно выставить:" + MAC_TEMP_COUNT_ORDER);
            }


            SetPositionConstants(position);
            Console.WriteLine();
            return(SetPrice(Price, ContractStep, position, 2));
        }