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