Получить параметры скрипта

В скрипте можно получить параметры обращаясь к полям скрипта (OptimProperty).
Либо через метод ctx.Runtime.GetParameters(), он отдает весь список параметров.
Но он корректно работает при обычном прогоне скрипта.
При оптимизации же будут параметры с неактуальными данными. Value всегда равно начальному значению параметра.

Если нужно получить параметры скрипта из кода другого индикатора, то можно поступить следующим образом:
У контекста есть объект скрипта (ctx.ScriptObject через класс ContextExecutor), соответственно можно через рефлексию достать параметры.

Пример кода:

using System.ComponentModel; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; using TSLab.Script.Optimization; namespace MyLib.Handlers { [HandlerCategory("MyLib")] [HelperName("TraceScriptParameters", Language = Constants.En)] [HelperName("TraceScriptParameters", Language = Constants.Ru)] [InputsCount(1)] [Input(0, TemplateTypes.SECURITY, Name = "SECURITYSource")] [OutputsCount(0)] [OutputType(TemplateTypes.DOUBLE)] [Description("Выводит список параметров")] public class TraceScriptParameters : IStreamHandler, ISecurityInputs, IContextUses { public IContext Context { get; set; } public void Execute(ISecurity source) { var ctx = Context as TSLab.ScriptEngine.ContextExecutor; if (ctx == null) return; Context.Log("=== Parameters ===", MessageType.Info, true); var fields = ctx.ScriptObject.GetType().GetFields(); foreach (var field in fields) { var obj = field.GetValue(ctx.ScriptObject); var value = GetValue(obj); Context.Log($"{field.Name}={value}", MessageType.Info, true); } } private object GetValue(object obj) { switch (obj) { case OptimProperty pDouble: return pDouble.Value; case IntOptimProperty pInt: return pInt.Value; case BoolOptimProperty pBool: return pBool.Value; default: return null; } } } }