В написании исполняемого скрипта я опирался на сгенерированный код с использование моего кубика:
Click to reveal..
Code:
namespace TSLab.User
{
    using System;
    using TSLab.Script;
    using TSLab.Utils;
    
    
    public sealed class Script : System.IDisposable
    {
        
        [u]private MyCustomHandlers.Indicators.Osc_MAx2_ OscMAx2_h = new MyCustomHandlers.Indicators.Osc_MAx2_();[/u]
        
        public TSLab.Script.Optimization.BoolOptimProperty ОткрПозиПоРынк_Long = new TSLab.Script.Optimization.BoolOptimProperty(true, false);
        
        public Script()
        {
        }
        
        public void Execute(TSLab.Script.Handlers.IContext context, TSLab.Script.ISecurity Источник1)
        {
            // =================================================
            // Graph & Canvas Panes
            // =================================================
            // Make 'Главная' pane
            TSLab.Script.IGraphPane Главная_pane = context.CreateGraphPane("Главная", null);
            Главная_pane.Visible = true;
            Главная_pane.HideLegend = false;
            // Make 'ПанельГрафика' pane
            TSLab.Script.IGraphPane ПанельГрафика_pane = context.CreateGraphPane("ПанельГрафика", null);
            ПанельГрафика_pane.Visible = true;
            ПанельГрафика_pane.HideLegend = false;
            // Initialize 'OscMAx2' item
            this.OscMAx2_h.Context = context;
            this.OscMAx2_h.FastPeriod = 15;
            this.OscMAx2_h.SlowPeriod = 220;
            // Make 'OscMAx2' item data
            System.Collections.Generic.IList<double> OscMAx2 = context.GetData("OscMAx2", new string[] {
                this.OscMAx2_h.FastPeriod.ToString(), 
                this.OscMAx2_h.SlowPeriod.ToString(), 
                "Источник1"
            }, delegate {
                return this.OscMAx2_h.Execute(Источник1);

            });
            // Make 'ЛогичесФормула' item data
            System.Collections.Generic.IList<bool> ЛогичесФормула;
            try
            {
                int count = OscMAx2.Count;
                bool[] list = new bool[count];
                if ((context.IsLastBarUsed == false))
                {
                    count--;
                }
                for (int i = 0; (i < count); i++)
                {
                    list[i] = OscMAx2[i]>0.0;
                }
                if ((count>0 
                            && (context.IsLastBarUsed == false)))
                {
                    list[count] = list[count-1];
                }
                ЛогичесФормула = list;
            }
            catch (System.ArgumentOutOfRangeException )
            {
                throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'ЛогичесФормула\'. Индекс за пределами диапазона.");
            }
            // Make 'ЛогичесФормула1' item data
            System.Collections.Generic.IList<bool> ЛогичесФормула1;
            try
            {
                int count = OscMAx2.Count;
                bool[] list = new bool[count];
                if ((context.IsLastBarUsed == false))
                {
                    count--;
                }
                for (int i = 0; (i < count); i++)
                {
                    list[i] = OscMAx2[i]<0.0;
                }
                if ((count>0 
                            && (context.IsLastBarUsed == false)))
                {
                    list[count] = list[count-1];
                }
                ЛогичесФормула1 = list;
            }
            catch (System.ArgumentOutOfRangeException )
            {
                throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'ЛогичесФормула1\'. Индекс за пределами диапазона.");
            }
            // =================================================
            // Handlers
            // =================================================
            TSLab.Script.IPosition ОткрПозиПоРынк;
            TSLab.Script.IPosition ОткрПозиПоРынк1;
            // =================================================
            // Trading
            // =================================================
            int barsCount = Источник1.Bars.Count;
            if ((context.IsLastBarUsed == false))
            {
                barsCount--;
            }
            for (int i = 0; (i < barsCount); i++)
            {
                ОткрПозиПоРынк = Источник1.Positions.GetLastActiveForSignal("ОткрПозиПоРынк", i);
                ОткрПозиПоРынк1 = Источник1.Positions.GetLastActiveForSignal("ОткрПозиПоРынк1", i);
                if ((ОткрПозиПоРынк == null))
                {
                    if (ЛогичесФормула[i])
                    {
                        if ((context.TradeFromBar <= i))
                        {
                            Источник1.Positions.OpenAtMarket(((bool)(this.ОткрПозиПоРынк_Long.Value)), i+1, 1D, "ОткрПозиПоРынк");
                        }
                    }
                }
                else
                {
                    if ((ОткрПозиПоРынк.EntryBarNum <= i))
                    {
                        if (ЛогичесФормула1[i])
                        {
                            ОткрПозиПоРынк.CloseAtMarket(i+1, "ЗакрПозиПоРынк");
                        }
                    }
                }
                if ((ОткрПозиПоРынк1 == null))
                {
                    if (ЛогичесФормула1[i])
                    {
                        if ((context.TradeFromBar <= i))
                        {
                            Источник1.Positions.OpenAtMarket(false, i+1, 1D, "ОткрПозиПоРынк1");
                        }
                    }
                }
                else
                {
                    if ((ОткрПозиПоРынк1.EntryBarNum <= i))
                    {
                        if (ЛогичесФормула[i])
                        {
                            ОткрПозиПоРынк1.CloseAtMarket(i+1, "ЗакрПозиПоРынк1");
                        }
                    }
                }
            }
            if (context.IsOptimization)
            {
                return;
            }
            // =================================================
            // Charts
            // =================================================
            // Make 'Источник1' chart
            TSLab.Script.IGraphList Главная_pane_Источник1_chart = Главная_pane.AddList("Главная_pane_Источник1_chart", ("Источник1" 
                            + (" [" 
                            + (Источник1.Symbol + "]"))), Источник1, TSLab.Script.CandleStyles.BAR_CANDLE, TSLab.Script.CandleFillStyle.Decreasing, true, -14685179, TSLab.Script.PaneSides.RIGHT);
            Источник1.ConnectSecurityList(Главная_pane_Источник1_chart);
            Главная_pane_Источник1_chart.AlternativeColor = -262137;
            Главная_pane_Источник1_chart.Autoscaling = true;
            Главная_pane.UpdatePrecision(TSLab.Script.PaneSides.RIGHT, Источник1.Decimals);
            // Make 'OscMAx2' chart
            TSLab.Script.IGraphList ПанельГрафика_pane_OscMAx2_chart = ПанельГрафика_pane.AddList("ПанельГрафика_pane_OscMAx2_chart", (((("OscMAx2" 
                            + (" (" + this.OscMAx2_h.FastPeriod)) 
                            + (", " + this.OscMAx2_h.SlowPeriod)) 
                            + ")") 
                            + (" [" 
                            + (Источник1.Symbol + "]"))), OscMAx2, TSLab.Script.ListStyles.LINE, -8639016, TSLab.Script.LineStyles.SOLID, TSLab.Script.PaneSides.RIGHT);
            ПанельГрафика_pane_OscMAx2_chart.AlternativeColor = -9409223;
            ПанельГрафика_pane_OscMAx2_chart.Autoscaling = true;
            ПанельГрафика_pane.UpdatePrecision(TSLab.Script.PaneSides.RIGHT, Источник1.Decimals);
        }
        
        public void Dispose()
        {
        }
    }
}



В нем создается объект класса моего индикатора.
То же я прописал и в скрипте.
По поводу ваших замечаний:
Quote:
Прежде чем обращаться к своему хелперу, его нужно создать.

Что я делаю строкой
Code:
Osc_MAx2_ Osc = new Osc_MAx2_();

если не создаю объект индикатора, как это сделано в сгенерированном коде.
Quote:
Я не думаю, что он Вам тут нужен.
Поэтому эту строку можно просто удалить.

"Эта строка" это строка объявления объекта? И если ее удалить, как я тогда должен вызвать метод Execute этого класса?


Отредактировано ViL (Wed Feb 27 2019 01:30 PM)