background

Центр поддержки Tradematic

Материалы, видео и ссылки для пользователей и разработчиков Tradematic.

Разный размер позиции для длинных и коротких позиций

75409СТАТЬЯ РЕДАКТОР КОДА ПРИМЕР РАЗМЕР ПОЗЦИИ РАЗНЫЙ РАЗМЕР ПОЗИЦИИ

Например, мы хотим для длинных позиций входить на 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, "");
               }
            }
         }
      }
   }
}