Работа с позициями

Доступ ко всем позициям скрипта осуществляется через свойство ISecurity.Positions. ISecurity.Positions - это список позиций.

Для каждой позиции назначается название сигнала. В один момент может быть активна только одна позиция с одним названием.

Например, если создали позицию "LE" и ее не закрыли, то нельзя создать вторую позицию с таким же названием.

Открытие позиции

Для открытия позиций используются методы sec.Positions.BuyXXX(...) для покупки и sec.Positions.SellXXX(...) для продажи.

Примеры покупок:

sec.Positions.BuyAtMarket(i + 1, 2, "LE"); // Купить два контракта по рынку на следующем баре.
sec.Positions.BuyAtPrice(i + 1, 2, 65000, "LE"); // Выставить лимитную заявку на покупку двух контрактов на следующем баре по цене 65000.
sec.Positions.BuyIfGreater(i + 1, 2, 65000, "LE"); // Выставить условный ордер на покупку двух контрактов на следующем баре если цена будет выше 65000.
sec.Positions.BuyIfLess(i + 1, 2, 65000, "LE"); // Выставить условный ордер на покупку двух контрактов на следующем баре если цена будет ниже 65000.

Примеры продаж:

sec.Positions.SellAtMarket(i + 1, 2, "LE"); // Продать два контракта по рынку на следующем баре.
sec.Positions.SellAtPrice(i + 1, 2, 65000, "LE"); // Выставить лимитную заявку на продажу двух контрактов на следующем баре по цене 65000.
sec.Positions.SellIfGreater(i + 1, 2, 65000, "LE"); // Выставить условный ордер на продажу двух контрактов на следующем баре если цена будет 65000.
sec.Positions.SellIfLess(i + 1, 2, 65000, "LE"); // Выставить условный ордер на продажу двух контрактов на следующем баре если цена будет ниже 65000

Получение позиции

Часто используемый метод для получения позиции GetLastActiveForSignal(...), пример:

var pos = sec.Positions.GetLastActiveForSignal("LE", i); // Получить последнюю активную позицию с названием "LE" для бара с номером i.

Метод ищет активную позицию с названием "LE" и ее возвращает, если нету позиций, то метод вернет null.

Также существуют другие методы для получения позиций, все они пишутся так: sec.Positions.GetXXX(...).

GetLastPosition(int bar) - Последняя позиция в списке или null
GetLastPositionActive(int bar) - Последняя активная позиция в списке или null
GetLastLongPositionActive(int bar) - Последняя активная длинная позиция в списке или null
GetLastShortPositionActive(int bar) - Последняя закрытая позиция в списке или null

GetLastPositionClosed(int bar) - Последняя закрытая позиция в списке или null
GetLastLongPositionClosed(int bar) - Последняя закрытая длинная позиция в списке или null
GetLastShortPositionClosed(int bar) - Последняя закрытая короткая позиция или null

GetLastForSignal(string signal, int bar) - Получить последнюю позицию по названию сигнала
GetLastForCloseSignal(string signal, int bar) - Получить последнюю позицию по названию сигнала закрытия
GetLastActiveForSignal(string signal, int bar) - Последняя активная позиция по названию сигнала
GetLastClosedForSignal(string signal, int bar) - Последняя закрытая позиция по названию сигнала

GetActiveForBar(int bar) - Текущий список активных позиций для свечи
GetClosedForBar(int bar) - Список позиций, которые были закрыты до этой свечи
GetClosedOrActiveForBar(int bar) - Список позиций для свечи

Изменение позиции

Для изменении размера позиции используются методы pos.ChangeAtXXX(...), при этом передается размер новой позиции.

Например, чтобы увеличить длинную позицию на 2 контракта по рынку, надо написать pos.ChangeAtMarket(i + 1, pos.Shares + 2, "LX"); Тут pos.Shares показывает текущее количество контрактов позиции, а когда мы передаем pos.Shares + 2, это означает, что надо увеличить позицию на 2 контракта.

Если же передать отрицательное значение, например -3, то позиция перевернется в короткую с тремя контрактами.

Примеры:

pos.ChangeAtMarket(i + 1, pos.Shares + 1, "LX"); // Увеличить размер позиции на 1 лот на следующем баре.
pos.ChangeAtPrice(i + 1, pos.AverageEntryPrice - 100, pos.Shares + 1, "LX"); // Увеличить размер позиции на 1 лот лимитной заявкой по цене (средняя цена позиции - 100).
pos.ChangeAtProfit(i + 1, pos.AverageEntryPrice + 100, pos.Shares + 1, "LX"); // Увеличить размер позиции на 1 лот по тейк-профиту по цене (средняя цена позиции + 100).
pos.ChangeAtStop(i + 1, pos.AverageEntryPrice - 100, pos.Shares + 1, "LX"); // Увеличить размер позиции на 1 лот по стоп-лоссу, по цене (средняя цена позиции - 100).

Закрытие позиции

Для закрытия позиции используются методы pos.CloseAtXXX(...).

Примеры:

pos.CloseAtMarket(i + 1, "LX"); // Закрыть позицию по рынку на следующем баре.
pos.CloseAtPrice(i + 1, longPos.EntryPrice + 100, "LX"); // Выставить лимитную заявку на закрытие позиции по цене (цена входа + 100).
pos.CloseAtProfit(i + 1, longPos.EntryPrice + 100, "LX"); // Выставить тейк-профит на закрытие позиции по цене (цена входа + 100).
pos.CloseAtStop(i + 1, longPos.EntryPrice - 100, "LX"); // Выставить стоп-лосс на закрытие позиции по цена (цена входа - 100).

Важно заметить, что методы которые закрывают позицию по условию (CloseAtPrice, CloseAtProfit, CloseAtStop) должны выставляться на каждом баре пока не закроется позиция, иначе TSLab снимет ордер закрытия на бирже.

Некоторые методы позиции:

GetShares(int bar) - Количество лотов в момент времении.
SharesOrigin - Количество оригинальных лотов в позиции (до изменения их в режиме симуляции портфеля).

Profit() - Прибыль позиции с учетом количества лотов (только для закрытых позиций).
ProfitPct() - Прибыль позиции в процентах (только для закрытых позиций).
CurrentProfit(int bar) - Прибыль позиции с учетом количества лотов, реализованная и нереализованная части.
CurrentProfitPct(int bar) - Прибыль позиции в процентах с учетом количества лотов, реализованная и нереализованная части.
GetAccumulatedProfit(int bar) - Взять текущий накопленный профит позиции.

OpenMFE(int bar) - Максимальный возможный доход позиции (для одного акции/контракта).
OpenMAE(int bar) - Минимальный возможный убыток позиции (для одного акции/контракта).
MFE() - Максимальный возможный доход позиции (для одного акции/контракта).
MAE() - Минимальный возможный убыток позиции (для одного акции/контракта).

Для примера напишем скрипт, который будет покупать после растущей свечи по рынку и выставлять стоп 200 пунктов и тейк 400 пунктов:

using TSLab.Script;
using TSLab.Script.Handlers;

namespace MyLib
{
    public class ExampleBuy : IExternalScript
    {
        public void Execute(IContext ctx, ISecurity sec)
        {
            for (int i = 0; i < ctx.BarsCount; i++)
            {
                var signalBuy = sec.Bars[i].Close > sec.Bars[i].Open; // определяем растущую свечу
                var longPos = sec.Positions.GetLastActiveForSignal("LE", i); // получаем активную позицию

                if (longPos == null)
                {
                    // если нет позиции, то проверяем сигнал
                    if (signalBuy)
                    {
                        // если есть сигнал на покупку, то покупаем по рынку
                        sec.Positions.BuyAtMarket(i + 1, 1, "LE");
                    }
                }
                else
                {
                    // если есть позиция, то ставим стоп-лосс и тейк-профит
                    longPos.CloseAtStop(i + 1, longPos.EntryPrice - 200, "LXS");
                    longPos.CloseAtProfit(i + 1, longPos.EntryPrice + 400, "LXP");
                }
            }
        }
    }
}

Last updated