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

В скрипте можно получить параметры обращаясь к полям скрипта (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;
            }
        }
    }
}

Last updated