background

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

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

Меняем размер позиции в зависимости от волатильности

36414РЕДАКТОР КОДА РАЗМЕР ПОЗИЦИИ ФУНКЦИЯ В СКРИПТЕ CALCULATEPOSITIONSIZE ATR ВОЛАТИЛЬНОСТЬ FIXEDSHARE

Следущий код можно использовать для динамического размера позиции в зависимости от волатильности

// Изменение размера позиции в зависимости от волатильности (для фьючерса на индекс РТС)
// В свойствах стратегии размер позиции установить - Функция в скрипте
using System;
using TradeMatic;
using TradeMatic.Indicators;

namespace ScriptNamespace
{
class MyScript : Script
{
private StrategyParameter P1;
private StrategyParameter P2;
private StrategyParameter P3;

public MyScript()
{
P1 = CreateParameter("Период ATR", 20, 10, 100, 10);
P2 = CreateParameter("Коэффициент", 10, 1, 10, 1);
P3 = CreateParameter("Максимальная позиция", 200, 1, 100, 1);
}

// Изменение размера позиции в зависимости от волатильности и суммы кэша
// работает, когда размер позиции - функция в скрипте
public override PositionSize CalculatePositionSize(Position p, double cash, double equity)
{
double close = p.Symbol.Close[p.EntryBar]; // цена закрытия на момент входа в позицию
double atr = ATR.Value(p.EntryBar, p.Symbol.High, p.Symbol.Low, p.Symbol.Close, P1.ValueInt); 
double sma = SMA.Value(p.EntryBar, Close, P1.ValueInt); 
double K = P2.ValueInt; if (K < 0) K = 0; 
double max_cash = 5000000; // максимальный активный кэш
double use_cash = (cash < max_cash) ? cash : max_cash; // ограничение суммы кэша
double risk = (atr == 0 || sma == 0) ? 1 : 1/(2*atr/sma*100); // величина риска
double size = (K == 0) ? use_cash/close : Math.Min(use_cash/close*K, use_cash/close*risk); 
if (size > P3.ValueInt) size = P3.ValueInt; // ограничение размера позиции
return new PositionSize(PositionSizeMode.FixedShare, size); // размер позиции в контрактах
}

public override void Execute()
{
}
}
}