Tradematic Support Center
Guides, articles, videos and links for Tradematic users and developers.
Разный размер позиции для длинных и коротких позиций
102433СТАТЬЯ РЕДАКТОР КОДА ПРИМЕР РАЗМЕР ПОЗЦИИ РАЗНЫЙ РАЗМЕР ПОЗИЦИИ
Например, мы хотим для длинных позиций входить на 4 контракта, для коротких - на 2.
Этот пример похож на первый пример, т.к. перегружает ту же функцию CalculatePositionSize().
Чтобы контролировать из кода стратегии размер позиции, нужно перегрузить функцию CalculatePositionSize в классе TradeMatic.Script.
Эта функция возвращает размер позиции (объект PositionSize), а на вход принимает следующие параметры:
- Position p - описание позиции, нам оно понадобится, чтобы выяснить название инструмента
- double cash - размер свободных денежных средств на момент открытия позиции
- double equity - размер активов на момент открытия позиции
А чтобы вызывалась эта функция, нужно в свойствах стратегии в параметре "Размер позиции" выбрать "Функция".
Вот получившаяся функция:
public override PositionSize CalculatePositionSize(Position p, double cash, double equity) { // длинная позиция? if(p.PositionType == PositionType.Long) { // заходим 4-мя контрактами return new PositionSize(PositionSizeMode.FixedShare, 4); } else { // короткая позиция - заходим 2-мя контрактами return new PositionSize(PositionSizeMode.FixedShare, 2); } }
Если нужно в качестве размера позиции вместо фиксированного количества акций указать, к примеру, процент от активов (25%, к примеру):
return new PositionSize(PositionSizeMode.PercentOfEquity, 25);
Варианты размеров позиции перечислены в документации по PositionSizeMode здесь.
В качестве основы мы взяли код стратегии "SMA-9".
Итоговый код стратегии должен получиться такой:
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using TradeMatic; using TradeMatic.Indicators; namespace ScriptNamespace { class MyScript : Script { private StrategyParameter parameter0; private StrategyParameter parameter1; public MyScript() { parameter0 = CreateParameter("Период SMA", 9, 0, 100, 1); parameter1 = CreateParameter("Период SMA", 9, 0, 100, 1); } public override PositionSize CalculatePositionSize(Position p, double cash, double equity) { // длинная позиция? if(p.PositionType == PositionType.Long) { // заходим 4-мя контрактами return new PositionSize(PositionSizeMode.FixedShare, 4); } else { // короткая позиция - заходим 2-мя контрактами return new PositionSize(PositionSizeMode.FixedShare, 2); } } public override void Execute() { // Отрисовка PlotSeries(PricePane, SMA.Series(Close, parameter0.ValueInt), Color.Red, LineStyle.Solid, 1); PlotSeries(PricePane, SMA.Series(Close, parameter1.ValueInt), Color.Red, LineStyle.Solid, 1); // Инициализация // Основной цикл for (int bar = 9; bar < Symbol.Count; bar++) { if (IsLastPositionActive) { if (CrossUnder(bar, Close, SMA.Series(Close, parameter1.ValueInt))) { SellAtClose(bar, LastPosition, ""); } } else { if (CrossOver(bar, Close, SMA.Series(Close, parameter0.ValueInt))) { BuyAtClose(bar, ""); } } } } } }