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