У вас не стоит Flash Player
Настройки
#84647 - Tue Feb 26 2019 08:00 PM Не удалось найти имя типа или пространства имен
yakudzzzzza Offline
stranger

Registered: Fri Sep 29 2017
Записи: 24
Надеюсь, я еще не сильно надоел модераторам, но после решения одной проблемы, уже как закономерность, появляется следующая.
Проблема следующего характера.
Просмотрел я, значитца, гайд по сборке своих индикаторов в API. Посмотрел примеры, и попробовал собрать свой. Делал все как в примерах. Но в итоге на меня лаба ругается, что я не подключил библиотеку. Самое интересное, что через визуальный редактор все работает. Прилагаю скрины для знающих. Проблема такая, что не поддается логике, поэтому обращаюсь на форум. Помогите, пожалуйста


Attachments
Screenshot_1.png (101 downloads)
Screenshot_2.png (88 downloads)
Screenshot_3.png (87 downloads)



Отредактировано yakudzzzzza (Tue Feb 26 2019 08:09 PM)

Наверх
#84648 - Tue Feb 26 2019 09:55 PM Re: Не удалось найти имя типа или пространства имен [Re: yakudzzzzza]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8135
Видимо не всё, как в примерах.
Как я понимаю, Вы обращаетесь к тому, чего еще не существует.
Вполне логично, что студия поругалась.
Прежде чем обращаться к своему хелперу, его нужно создать.
Я не думаю, что он Вам тут нужен.
Поэтому эту строку можно просто удалить.
При чем здесь TSLab, я вообще не понял, в любом проекте студия на такое поругается.

Наверх
#84649 - Tue Feb 26 2019 11:33 PM Re: Не удалось найти имя типа или пространства имен [Re: ViL]
yakudzzzzza Offline
stranger

Registered: Fri Sep 29 2017
Записи: 24
В написании исполняемого скрипта я опирался на сгенерированный код с использование моего кубика:
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)

Наверх
#84655 - Wed Feb 27 2019 02:29 PM Re: Не удалось найти имя типа или пространства имен [Re: yakudzzzzza]
pasha Offline

old hand

Registered: Tue Dec 23 2008
Записи: 1085
Это точно не как в примерах. Вы из одно своего обработчика обращаетесь к другому своему.
Если вы подключаете свой код через кубик Внешний скрипт, то нужно указать оба исходных файла.
Если делаете через dll, то в папке Handlers должны лежать обе dll.

Наверх
#84656 - Wed Feb 27 2019 02:44 PM Re: Не удалось найти имя типа или пространства имен [Re: pasha]
yakudzzzzza Offline
stranger

Registered: Fri Sep 29 2017
Записи: 24
Спасибо, я понял. Конкретный затуп был

Наверх
#84657 - Wed Feb 27 2019 03:02 PM Re: Не удалось найти имя типа или пространства имен [Re: pasha]
yakudzzzzza Offline
stranger

Registered: Fri Sep 29 2017
Записи: 24
То есть так же красиво как стандартные индикаторы, свои дергать нельзя? Каждый раз нужно в кубик внешний скрипт докидывать библиотеку своего индикатора?

Наверх
#84659 - Wed Feb 27 2019 05:09 PM Re: Не удалось найти имя типа или пространства имен [Re: yakudzzzzza]
pasha Offline

old hand

Registered: Tue Dec 23 2008
Записи: 1085
Второй вопрос не понял.
По первому. Правильный путь, если у вас накапливается коллекция своих индикаторов, тем более когда один ссылается на другой, делать свою библиотеку индикаторов в виде внешней dll. Тогда кубил Внешний скрипт вообще не нужен, а сразу работаете со своим "кубиком".

Наверх
#84660 - Wed Feb 27 2019 05:39 PM Re: Не удалось найти имя типа или пространства имен [Re: pasha]
yakudzzzzza Offline
stranger

Registered: Fri Sep 29 2017
Записи: 24
Первый и второй вопрос это одно и то же) Все дело в том, что я хочу (думаю так и правильно) описывать все условия скриптом. И чтобы эти условия опирались на мои индикаторы (и обработчики типа обработчика размера позиции, компрессии просадки, абсолютной просадки и т.д.).
Quote:
Правильный путь, если у вас накапливается коллекция своих индикаторов, тем более когда один ссылается на другой, делать свою библиотеку индикаторов в виде внешней dll.

В скринах, которые я приложил, это и осуществляется. То есть, я собираю библиотеку с классом обработчика, который находится в пространстве имен, общем для всех моих индюков. Я, собственно, поэтому и затупил, потому что думал, что раз уж я компилю библиотеку, то обработчики из нее можно будет дергать так же, как и из библиотеки TSLab.Script.Handlers(.Helpers), то есть не добавляя свою библиотеку в блок ВнешнийСкрипт


Отредактировано yakudzzzzza (Wed Feb 27 2019 05:41 PM)

Наверх
#84947 - Thu Apr 11 2019 12:35 PM Re: Не удалось найти имя типа или пространства имен [Re: yakudzzzzza]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8135
Настройте проект с обаботчиками таким образом, чтобы они попадали в папку Handlers/

Наверх
#84985 - Sun Apr 14 2019 04:00 PM Re: Не удалось найти имя типа или пространства имен [Re: ViL]
yakudzzzzza Offline
stranger

Registered: Fri Sep 29 2017
Записи: 24
А есть ли принципиальная разница между настройкой проектов, и перетаскиванием либ вручную. Просто при сборке либы, кроме самой либы создается еще много левых файлов. А я пока все свои индюки в один namespace не объединял. Мне просто так удобней.
И еще, за какую именно папку Handlers Вы пишите? За ту, что лежит в корне или в AppData? Просто недавно наткнулся на топик, где увидел путь с папкой Handlers в AppData. Но так как там проблема была немного иного характера, решил не рисковать (http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=84861#Post84861).
А папка Handlers в корне, проблему не решает


Отредактировано yakudzzzzza (Sun Apr 14 2019 04:01 PM)

Наверх
#85698 - Sat Sep 14 2019 12:50 PM Re: Не удалось найти имя типа или пространства имен [Re: yakudzzzzza]
AleksandrGanov Offline
member

Registered: Fri Jun 02 2017
Записи: 180
Loc: Kamchatka
Originally Posted By: yakudzzzzza
потому что думал, что раз уж я компилю библиотеку, то обработчики из нее можно будет дергать так же, как и из библиотеки TSLab.Script.Handlers(.Helpers), то есть не добавляя свою библиотеку в блок ВнешнийСкрипт


Тоже интересен данный момент, получается, что при использовании своей либы в любом случае надо ставить ссылку на ней во внешнем скрипте, иначе ничего работать не будет. Нет ли какого-то способа подцеплять через внешний скрипт cs-файл, а своя либа, чтобы была подключена каким-либо иным образом, чтобы каждый раз не добавлять ее во "внешний скрипт"?

Наверх
#85700 - Sat Sep 14 2019 06:01 PM Re: Не удалось найти имя типа или пространства имен [Re: yakudzzzzza]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8135
Конечно AppData
Какой там риск? не очень понял. Речь шла лишь о том, что если и лежат в хендлерсах dll программы, просто нужно копи/пастить их туда от новой версии, когда делаете индиктаоры.

Наверх


Moderator:  ViL, sar