-
Notifications
You must be signed in to change notification settings - Fork 7
Настройка торгового алгоритма
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);
}
}
}