#84647 - Tue Feb 26 2019 08:00 PM
Не удалось найти имя типа или пространства имен
|
stranger
Registered: Fri Sep 29 2017
Записи: 24
|
Надеюсь, я еще не сильно надоел модераторам, но после решения одной проблемы, уже как закономерность, появляется следующая. Проблема следующего характера. Просмотрел я, значитца, гайд по сборке своих индикаторов в API. Посмотрел примеры, и попробовал собрать свой. Делал все как в примерах. Но в итоге на меня лаба ругается, что я не подключил библиотеку. Самое интересное, что через визуальный редактор все работает. Прилагаю скрины для знающих. Проблема такая, что не поддается логике, поэтому обращаюсь на форум. Помогите, пожалуйста
Attachments
Screenshot_1.png (127 downloads)Screenshot_2.png (106 downloads)Screenshot_3.png (113 downloads)
Отредактировано yakudzzzzza (Tue Feb 26 2019 08:09 PM)
|
Наверх
|
|
|
|
#84649 - Tue Feb 26 2019 11:33 PM
Re: Не удалось найти имя типа или пространства имен
[Re: ViL]
|
stranger
Registered: Fri Sep 29 2017
Записи: 24
|
В написании исполняемого скрипта я опирался на сгенерированный код с использование моего кубика:
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()
{
}
}
}
В нем создается объект класса моего индикатора. То же я прописал и в скрипте. По поводу ваших замечаний: Прежде чем обращаться к своему хелперу, его нужно создать. Что я делаю строкой Osc_MAx2_ Osc = new Osc_MAx2_(); если не создаю объект индикатора, как это сделано в сгенерированном коде. Я не думаю, что он Вам тут нужен. Поэтому эту строку можно просто удалить. "Эта строка" это строка объявления объекта? И если ее удалить, как я тогда должен вызвать метод Execute этого класса?
Отредактировано ViL (Wed Feb 27 2019 01:30 PM)
|
Наверх
|
|
|
|
#84656 - Wed Feb 27 2019 02:44 PM
Re: Не удалось найти имя типа или пространства имен
[Re: pasha]
|
stranger
Registered: Fri Sep 29 2017
Записи: 24
|
Спасибо, я понял. Конкретный затуп был
|
Наверх
|
|
|
|
#84657 - Wed Feb 27 2019 03:02 PM
Re: Не удалось найти имя типа или пространства имен
[Re: pasha]
|
stranger
Registered: Fri Sep 29 2017
Записи: 24
|
То есть так же красиво как стандартные индикаторы, свои дергать нельзя? Каждый раз нужно в кубик внешний скрипт докидывать библиотеку своего индикатора?
|
Наверх
|
|
|
|
#84660 - Wed Feb 27 2019 05:39 PM
Re: Не удалось найти имя типа или пространства имен
[Re: pasha]
|
stranger
Registered: Fri Sep 29 2017
Записи: 24
|
Первый и второй вопрос это одно и то же) Все дело в том, что я хочу (думаю так и правильно) описывать все условия скриптом. И чтобы эти условия опирались на мои индикаторы (и обработчики типа обработчика размера позиции, компрессии просадки, абсолютной просадки и т.д.). Правильный путь, если у вас накапливается коллекция своих индикаторов, тем более когда один ссылается на другой, делать свою библиотеку индикаторов в виде внешней dll. В скринах, которые я приложил, это и осуществляется. То есть, я собираю библиотеку с классом обработчика, который находится в пространстве имен, общем для всех моих индюков. Я, собственно, поэтому и затупил, потому что думал, что раз уж я компилю библиотеку, то обработчики из нее можно будет дергать так же, как и из библиотеки TSLab.Script.Handlers(.Helpers), то есть не добавляя свою библиотеку в блок ВнешнийСкрипт
Отредактировано yakudzzzzza (Wed Feb 27 2019 05:41 PM)
|
Наверх
|
|
|
|
#84985 - Sun Apr 14 2019 04:00 PM
Re: Не удалось найти имя типа или пространства имен
[Re: ViL]
|
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]
|
member
Registered: Fri Jun 02 2017
Записи: 182
Loc: Kamchatka
|
потому что думал, что раз уж я компилю библиотеку, то обработчики из нее можно будет дергать так же, как и из библиотеки TSLab.Script.Handlers(.Helpers), то есть не добавляя свою библиотеку в блок ВнешнийСкрипт Тоже интересен данный момент, получается, что при использовании своей либы в любом случае надо ставить ссылку на ней во внешнем скрипте, иначе ничего работать не будет. Нет ли какого-то способа подцеплять через внешний скрипт cs-файл, а своя либа, чтобы была подключена каким-либо иным образом, чтобы каждый раз не добавлять ее во "внешний скрипт"?
|
Наверх
|
|
|
|
|
|