Skip to content

Настройка торгового алгоритма

Dmitriy Lagutin edited this page Apr 15, 2018 · 4 revisions

На следующем шаге перейдем непосредственно к настройке торгового алгоритма. Вся торговая логика робота описана в методе TradeFunc класса Trading. В примере снизу будет реализован базовый торговый алгоритм, который будет выполнять простейшую логики на инструменте Si-6.18.

Суть простейшей торговой логики (для примера):

Для long - позиций

  • робот отрывает одну длинную позицию по рынку (по цене OpenLE = bq_Si[0]);
  • если цена через какое то время время становится на 5 пунктов больше цены открытия позиции, закрывает позицию с профитом (ProfitFutureLE = 5);
  • если цена идет в сторону убытка и убыток достигает -20 пунктов от цены открытия позиции, закрывает позицию с убытком (if (posLE.Stop <= -20) posLE.CurrentPrice = sq_Si[0].Price);
  • после этого робот опять отрывает одну длинную позицию по рынку (по цене OpenLE = bq_Si[0]);

Для short - позиций

  • робот отрывает одну короткую позицию по рынку (по цене OpenSH = sq_Si[0]);
  • если цена через какое то время время становится на 5 пунктов меньше цены открытия позиции, закрывает позицию с профитом (ProfitFutureSH = 5);
  • если цена идет в сторону убытка и убыток достигает -20 пунктов от цены открытия позиции, закрывает позицию с убытком (if (posSH.Stop <= -20) posSH.CurrentPrice = bq_Si[0].Price);
  • после этого робот опять отрывает одну короткую позицию по рынку (по цене OpenSH = sq_Si[0]).

Таким образом робот, постоянно открывает длинные и короткие позиции, независимые друг от друга.

Пример кода:

    public static class Trading
    {
        public static void TradeFunc()
        {
            if (bq_Si.Count() > 1)
            {
                //Забираем длинную позицию и ордера из базы данных
                Position posLE = GetPosition("LE");
                string orderLE = GetOrder("LE").OpenOrderNo;
                string orderLX = GetOrder("LE").CloseOrderNo;

                //Забираем короткую позицию и ордера из базы данных
                Position posSH = GetPosition("SH");
                string orderSH = GetOrder("SH").OpenOrderNo;
                string orderSX = GetOrder("SH").CloseOrderNo;

                //ЦЕНЫ ОТКРЫТИЯ И ПРОФИТА
                double OpenLE = RobotWork == true ? bq_Si[0].Price : 0;
                double ProfitFutureLE = 5;
                double OpenSH = RobotWork == true ? sq_Si[0].Price : 0;
                double ProfitFutureSH = 5;

                // Логика ЗАКРЫТИЯ
                if (posLE != null)
                {
                    if (posLE.Stop <= -20)
                        posLE.CurrentPrice = sq_Si[0].Price;
                    else if (RobotWork == false)
                        posLE.CurrentPrice = sq_Si[0].Price;
                }

                if (posSH != null)
                {
                    if (posSH.Stop <= -20)
                        posSH.CurrentPrice = bq_Si[0].Price;
                    else if (RobotWork == false)
                        posSH.CurrentPrice = bq_Si[0].Price;
                }


                //BUY
                if (posLE == null)
                    trans_slot.OpenLE(Orders.Select(), ACCOUNT, BROKERREF, SecBoard_Si, SecCode_Si, OpenLE, 1, "x", orderLE, "LE", ProfitFutureLE);
                else
                    posLE.CloseLE(trans_slot, Orders.Select(), ACCOUNT, BROKERREF, SecBoard_Si, SecCode_Si, posLE.CurrentPrice, 1, "x", orderLX, "LE", sq_Si[0].Price);

                //SELL
                if (posSH == null)
                    trans_slot.OpenSH(Orders.Select(), ACCOUNT, BROKERREF, SecBoard_Si, SecCode_Si, OpenSH, 1, "x", orderSH, "SH", ProfitFutureSH);
                else
                    posSH.CloseSH(trans_slot, Orders.Select(), ACCOUNT, BROKERREF, SecBoard_Si, SecCode_Si, posSH.CurrentPrice, 1, "x", orderSX, "SH", bq_Si[0].Price);

            }

        }
    }