В скрипте можно получить параметры обращаясь к полям скрипта (OptimProperty).
Либо через метод ctx.Runtime.GetParameters(), он отдает весь список параметров.
Но он корректно работает при обычном прогоне скрипта.
При оптимизации же будут параметры с неактуальными данными. Value всегда равно начальному значению параметра.
Если нужно получить параметры скрипта из кода другого индикатора, то можно поступить следующим образом:
У контекста есть объект скрипта (ctx.ScriptObject через класс ContextExecutor), соответственно можно через рефлексию достать параметры.
Пример кода:
usingSystem.ComponentModel;usingTSLab.Script;usingTSLab.Script.Handlers;usingTSLab.Script.Handlers.Options;usingTSLab.Script.Optimization;namespaceMyLib.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("Выводит список параметров")]publicclassTraceScriptParameters:IStreamHandler,ISecurityInputs,IContextUses {publicIContext Context { get; set; }publicvoidExecute(ISecurity source) {var ctx = Context asTSLab.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); } }privateobjectGetValue(object obj) {switch (obj) {caseOptimProperty pDouble:returnpDouble.Value;caseIntOptimProperty pInt:returnpInt.Value;caseBoolOptimProperty pBool:returnpBool.Value;default:returnnull; } } }}