background

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

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

Покупка одного инструмента на 30%, а другого - на 70%.

66902СТАТЬЯ РЕДАКТОР КОДА ПРИМЕРЫ ПРИМЕР 1 РАЗМЕР ПОЗИЦИИ POSITIONSIZE CALCULATEPOSITIONSIZE SYMBOL SYMBOLNAME

Чтобы контролировать из кода стратегии размер позиции, нужно перегрузить функцию CalculatePositionSize в классе TradeMatic.Script.
Эта функция возвращает размер позиции (объект PositionSize), а на вход принимает следующие параметры:

  • Position p - описание позиции, нам оно понадобится, чтобы выяснить название инструмента
  • double cash - размер свободных денежных средств на момент открытия позиции
  • double equity - размер активов на момент открытия позиции

А чтобы вызывалась эта функция, нужно в свойствах стратегии в параметре "Размер позиции" выбрать "Функция".

Для примера мы установим размера позиции для Газпрома 30%, для Сбербанка - 70%.

Вот получившаяся функция:

public override PositionSize CalculatePositionSize(Position p, double cash, double equity)
{
   if(p.Symbol.SymbolName == "ГАЗПРОМ ао")
   {
      return new PositionSize(PositionSizeMode.PercentOfEquity, 30);
   }
   else if(p.Symbol.SymbolName == "Сбербанк")
   {
      return new PositionSize(PositionSizeMode.PercentOfEquity, 70);
   }

   return null;
} 

Не забудьте в свойствах стратегии на вкладке "Список инструментов" указать выбранные инструменты.
В качестве основы мы взяли код стратегии "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.Symbol.SymbolName == "ГАЗПРОМ ао")
         {
            return new PositionSize(PositionSizeMode.PercentOfEquity, 30);
         }
         else if(p.Symbol.SymbolName == "Сбербанк")
         {
            return new PositionSize(PositionSizeMode.PercentOfEquity, 70);
         }

         return null;
      } 
      
      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, "");
               }
            }
         }
      }
   }
}