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

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

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

Tradematic Support Center

Guides, articles, videos and links for Tradematic users and developers.

This website uses cookies. By continuing to use this website, you consent to our Privacy Policy. OK