
Tradematic Support Center
Guides, articles, videos and links for Tradematic users and developers.
Меняем размер позиции в зависимости от волатильности
55002РЕДАКТОР КОДА РАЗМЕР ПОЗИЦИИ ФУНКЦИЯ В СКРИПТЕ 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()
{
}
}
}

