#87189 - Sun Jan 09 2022 07:35 PM
Ошибка в IExternalScript: Отсутствует аргумент..
|
stranger
Registered: Fri Dec 31 2021
Записи: 9
Loc: Ухта
|
Добрый вечер, уважаемые. Написал простейший скрипт, унаследованный от IExternalScript:
[InputsCount(1)]
[Input(0, TemplateTypes.SECURITY, Name = "Инструмент")]
public class ChannelTrendBase : IExternalScript, ISecurityInput0
{
public void Execute(IContext ctx, ISecurity sec)
{
var sma = Series.SMA(sec.ClosePrices, 50);
if (ctx.IsOptimization)
return;
var pane = ctx.CreateGraphPane("test", "base");
pane.AddList("sma", sma, ListStyles.LINE,
new Color(255, 0, 0),
LineStyles.SOLID, PaneSides.RIGHT);
}
}
При добавлении данного кубика в TsLab, выдает ошибку: CS7036: Отсутствует аргумент, соответствующий требуемому формальному параметру "sec" из "ChannelTrendBase.Execute(IContext, ISecurity)". Вход кубика с инструментом соединил. Где-то, что-то надо добавить, чтобы tslab понимал, что ему в параметры подсунуть? Спасибо.
|
Наверх
|
|
|
|
#87191 - Mon Jan 10 2022 05:07 PM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: vav]
|
stranger
Registered: Fri Dec 31 2021
Записи: 9
Loc: Ухта
|
Изначально все затевалось, чтобы добраться до кэша и контекста. Есть один сложный алгоритм, который вначале очень много считает, а потом строит несколько линий. Вот, чтобы в каждом индикаторе (по индикатору на каждую линию) первую фазу не обсчитывать, решил воспользоваться кэшем. В документации все примеры с кэшем показаны на ExternalScript. Если индикатор тоже может получиться доступ к контексту скрипта - я буду только рад.
Я правильно понял, что для этого мне достаточно в классе индикатора указать интерфейс IContextUses и определить свойство Context? Tslab сам будет туда подсовывать текущий контекст?
P.S. Проверил, все работает: из индикатора можно обратиться к контексту и далее все что нужно сохранить/прочитать. Круто!
Отредактировано aaleksander (Mon Jan 10 2022 05:18 PM)
|
Наверх
|
|
|
|
#87192 - Tue Jan 11 2022 04:54 PM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: aaleksander]
|
stranger
Registered: Fri Dec 31 2021
Записи: 9
Loc: Ухта
|
Все равно не работает.
Создал скрипт, скомпилировал его, подложил dll куда надо. Создал в лаборатории скрипт, положил туда свой кубик стратегии, соединил его с инстументом... и получил туже саму ошибку.
Что я делаю не так?!
При этом, если использовать кубик "Внешний скрипт" и подсунуть ему cs-файл, то все работает как надо.
Отредактировано aaleksander (Tue Jan 11 2022 05:04 PM)
|
Наверх
|
|
|
|
#87193 - Tue Jan 11 2022 05:13 PM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: aaleksander]
|
newbie
Registered: Thu Sep 12 2019
Записи: 44
|
Попробуйте сначала сделать кубик из примера. 1 в 1. Когда заработает, начинаете менять его как надо.
|
Наверх
|
|
|
|
#87194 - Tue Jan 11 2022 05:44 PM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: vav]
|
stranger
Registered: Fri Dec 31 2021
Записи: 9
Loc: Ухта
|
А если он сразу не работает? Сделал пример один в один вот отсюда: https://doc.tslab.pro/tslab/rabota-s-pro...-po-instrumentu
[Input(0, TemplateTypes.SECURITY, Name = "sec")]
public class GetFinInfo : IExternalScript, ISecurityInput0
{
public void Execute(IContext ctx, ISecurity sec)
{
var fi = security.FinInfo;
var txt = string.Format("{0}: {1} ({2}) - {3} ({4})", fi.LastUpdate, fi.Bid, fi.BuySqty, fi.Ask, fi.SellSqty);
ctx.Log(txt);
}
}
Получил ошибку CS7036: Отсутствует аргумент, соответствующий требуемому формальному параметру "sec" из "GetFinInfo.Execute(IContext, ISecurity)". Данная ошибка возникает, если при вызове метода пропустить какой-то параметр. Если посмотреть, что там Tslab нагенерировал в папке temp, то там встречаем такие строчки: private MyLib.Scripts.GetFinInfo GetFinInfo_h = new MyLib.Scripts.GetFinInfo(); //это вызов конструктора моего скрипта И далее, в методе Execute:
// Make 'GetFinInfo' item data
this.GetFinInfo_h.Execute(var0);
И вот тут и кроется ошибка: второй параметр отсутствует. Вопрос: почему? Возможно надо атрибуты у класса добавить? Я попробовал добавить классу аттрибут [Input(0, TemplateTypes.SECURITY, Name = "security")] - не помогло Попробовал унаследоваться от ISecurityInput0 - не помогло. Больше способов не знаю пока. Продолжаю копать: первая переменная var0 - это и есть мой ISecurity. Тогда вопрос: почему он не передает в Execute первым параметром IContext??? Приложил скрин скрипта.
Attachments
scr_003.JPG (46 downloads)
Отредактировано aaleksander (Tue Jan 11 2022 06:12 PM)
|
Наверх
|
|
|
|
#87196 - Tue Jan 11 2022 07:58 PM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: AleksandrGanov]
|
stranger
Registered: Fri Dec 31 2021
Записи: 9
Loc: Ухта
|
Я не то, чтобы упускаю мысль. Я не могу понять ход мысли разработчиков, общую идеологию, так сказать . Давайте пройдемся тезисно по тому, что я понял: - Я могу написать класс с IExternalScript интерфейсом. - Я могу его скомпилировать в dll. - Я могу увидеть его в списке кубиков в TsLab. - Я могу вытащить его на поле скрипта и завести ему что-нибудь на вход. - Но из dll-ки этот класс никогда не заработает, потому что IExternalScript никогда не планировалось использовать в качестве кубика. Т.е. удел классов с IExternalScript - это подключаться к кубику "Внешний скрипт" в виде cs-файла. Правильно? Иными словами - это не баг, а фича? P.S. Я не в качестве наезда, просто разбираюсь (меня C# больше 15 лет кормит, если что, я пойму).
|
Наверх
|
|
|
|
#87197 - Wed Jan 12 2022 04:39 AM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: aaleksander]
|
member
Registered: Fri Jun 02 2017
Записи: 182
Loc: Kamchatka
|
не обязательно в виде cs-файл. во внешний скрипт можно подключить класс, реализующий IExternalScript или IExternalScript2..4, IExternalScriptMultiSec, в том числе в уже скомпилированном виде. Кубики должны реализовывать интерфейсы Handler'ов, то есть IStreamHandler, IValuesHandler и т.д. Исходя их интерфейсов (а также фактически указанных входов в кубики), система определит что перед ней и при генерации кода сделает вызов соответствующего метода Execute в соответствующей части кода, для потоковых и не потоковых кубиков это будет тоже разная часть кода. Для потоковых кубиков вызов будет перед торговой логикой, для побарных внутри цикла торговой логики. Сигнатура метода определится типом кубика (интерфейсы, фактические входы), для внешнего скрипта сигнатура также будет определена реализуемым интерфейсом. В общем, довольно все просто, но некоторые моменты нигде особо не описаны и узнаются в процессе общения с системой
Примеры кубика и внешнего скрипта прилагаю, в них видно в чем разница
Attachments
LotSize.cs (62 downloads)TemplateNew.cs (61 downloads)
Отредактировано AleksandrGanov (Wed Jan 12 2022 04:42 AM)
|
Наверх
|
|
|
|
#87198 - Wed Jan 12 2022 09:06 AM
Re: Ошибка в IExternalScript: Отсутствует аргумент..
[Re: AleksandrGanov]
|
stranger
Registered: Fri Dec 31 2021
Записи: 9
Loc: Ухта
|
В общем, довольно все просто, но некоторые моменты нигде особо не описаны и узнаются в процессе общения с системой
Благодарю, стало понятней. Действительно, надо вдумчиво разбираться, а документация дает самый минимум. Еще один неочевидный момент: только сейчас заметил, что у внешнего скрипта в качестве параметра можно выбрать dll. Он возьмет оттуда первый подходящий класс с IExtrenalScript интерфейсом? Опять методом тыка
|
Наверх
|
|
|
|
|
|