Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
У некоторых брокеров не транслируется информация о шаге цены при обновлении котировок (Событие UpdateQuote)
Соответственно и в АПИ, например так: tickPrice = (double)rtSymbol.FinInfo.StepPrice / rtSymbol.Tick;
вытащить шаг цены у ITInvest нельзя. У других брокеров именно такая строчка работать будет.
У FinInfo.StepPrice свойства такие же как у FinInfo.BuyDeposit,
BuyDeposit работать будет, StepPrice нет, его просто не присылает брокер. Проверить, что именно присылает брокер в котировках легко по окну Котировок. Вид - Котировки. По правой кнопке выберите интересующие инструменты. Если в таблице нет каких-то данных, то и в АПИ данных не будет.
В свойстве ctx.Runtime.LastRecalcReasons содержатся список причин пересчета скрипта. Их может быть несколько.
Пример как получить причину пересчета скрипта (выводится в лог):
Пример как получить событие открытия позиции (выводится в лог):
В настройках агента должна быть включена галочка События -> Открытие позиции, тогда скрипт будет пересчитываться при открытии позиции. Все возможные события перечислены в enum EventKind.
Здравствуйте, уважаемые разработчики!
Прошу Вас объяснить мне назначение некоторых параметров в Атрибуте "HandlerParameter":
1) В "Третьей перегрузке" Атрибута "HandlerParameter" идут друг за другом параметры: bool isShown, string def, [string Default] и так далее.
В пояснении для "string def" указано: "Значение по умолчанию".
В пояснении для "[string Default]" указано: "Значение параметра по умолчанию - строка".
У меня вопрос: Если эти оба параметра "по умолчанию", то в чём между ними различия и для чего каждый из них нужен?
2) "[string Editor]" - это "Редактор параметра".
Вопрос: Что значит "Редактор параметра", для чего редактирование, где происходит редактирование, может это как-то связано с оптимизацией, то есть это на подобие "OptimProperty"?
3) Для чего нужны [string EditorMax] и [string EditorMin], а также [string Max] и [string Min]?
Предполагаю, что одна из этих пар устанавливает рамки, в которых должна происходить оптимизация параметра, но зачем тогда нужна вторая пара?
4) [string Step] - "Шаг параметра для значения - строка".
Правильно ли я понимаю, что это "Шаг изменения параметра при использовании Оптимизации"?
5) Параметр [bool isCalculable] - предполагаю, что правильный перевод "Вычисляется".
Что значит "Вычисляется? Для чего этот параметр?
=========
1. Согласно документации такой перегрузки нет http://files.tslab.ru/docs/2.0/ru/api/class_t_s_lab_1_1_script_1_1_handlers_1_1_handler_parameter.html .Внутри конкструктора HandlerParameter (bool isShown, string def) def присваивается Default
Атрибуты в C#.
В частности, различие между позиционными и именованными параметрами.
Синтаксис в декларации атрибутов позволяет одновременно указывать позиционные и именованные параметры, несмотря на то, что они относятся к одному члену класса.
То что показывает Visual Studio в квадратных скобках, это именованные параметры.
2. "[string Editor]" служит для задания визуального редактора свойства отличного от умолчания. Для этого также требуется поддержка внутри программы, поэтому на данный момент пользователи не могут воспользоваться этим атррибутом. 3. [string EditorMax] и [string EditorMin] служит для валидации вводимых значений. 4. [string Max] и [string Min]и [string Step] Мин, Макс и Шаг на закладке Оптимизация 5. [bool isCalculable]это значит что параметр может учавствовать в оптимизации, т.е. появляться на вкладке Оптимизация.
В API ISecurity есть методы:
IReadOnlyList<IQueueData> GetBuyQueue(int barNum);
IReadOnlyList<IQueueData> GetSellQueue(int barNum); Как работает UpdateQueueData()
Эта функция обнуляет кеш и заставляет заново запросить данные по стакану. Так сделано - чтобы снизить нагрузку. Получается, чтобы получить самую свежую информацию, нужно перед каждым вызовом GetBuyQueue/GetSellQueue делать вызов UpdateQueueData
стакан "фиксируется" на момент пересчета, чтобы гарантировать, что "слепок" стакана (обе его части) взят в момент, когда начался пересчет.
для того,чтобы обновить стакан во время пересчета и получить новый слепок сделали этот метод. С производительностью не связано.
Close,Open,High,Low через Contex.GetData ?
или методы symbol.GetClosePrices(context) уже кешированы ?
===
Без разницы. Внутри методов GetClosePrices,GetOpenPrices,... идет обращение к context.GetData
Выдается при использовании Фиктивного исполнения и всех типов заявок, кроме заявок "По рынку".
Например:
System.NotImplementedException: It doesn't possible.
at TSLab.ScriptEngine.PositionsList.OpenIfGreater
Используется фиктивное исполнение и условная заявка, Открыть, если больше. Фиктивное исполнение работает только с заявками "По рынку".
Используйте их, пожалуйста.
Взаимодействия через COM нет. Можно писать скрипты на api c#, агенты имеют доступ к своим сделками. Описание api:
ТСЛаб распознает интерполяцию строк в коде начиная с версии 2.1. В ранних версиях не работает, скрипт будет выдавать ошибку, поэтому используйте форматирование строк.
Пример интерполяции строк:
Аналогичная запись через форматирование:
В блок Внешний скрипт надо добавить TSLab.DataModel.dll и TSLab.ScriptEngine.dll.
Полный список настроек агента:
Метод runtime.GetAllAgentRuntimeInfo() возвращает данные по всем агентам. Те же данные что в таблице Агенты.
В скрипте можно получить параметры обращаясь к полям скрипта (OptimProperty). Либо через метод ctx.Runtime.GetParameters(), он отдает весь список параметров. Но он корректно работает при обычном прогоне скрипта. При оптимизации же будут параметры с неактуальными данными. Value всегда равно начальному значению параметра.
Если нужно получить параметры скрипта из кода другого индикатора, то можно поступить следующим образом: У контекста есть объект скрипта (ctx.ScriptObject через класс ContextExecutor), соответственно можно через рефлексию достать параметры.
Пример кода:
Можно получить весь список инструментов, у каждого инструмента получить его характеристики, такие как шаг цены, размер лота и другие. Список баров по инструменту нельзя получить таким способом.
"сохраняю переменную в кэш:
int qty = 1; ctx.StoreObject(__key, qty);
при следующем пересчете скрипта загружаю:
object fv = ctx.LoadObject(__key); if (fv != null) volume = (int)fv; else ctx.Log("Volume not in cache!", MessageType.Warning);
И всегда мне печатается сообщение о том, что по данному ключу в кэше ничего нет. " ===
Нужно использовать класс NotClearableContainer и сохранять в кеше объекты, а не типы-значения, потому что получаются операции упаковки-преобразование и распаковки-преобразование.
Метод для принудительный пересчет скрипта:
IContext.Runtime.Recalc(string recalcReason, IDataSourceSecurity dataSourceSecurity, bool inAnyCase = fals)
recalcReason - причина пересчета, любая строка. dataSourceSecurity - источник из-за которого запускается пересчет. Можно передать null. inAnyCase - выполнить пересчет в любом случае. Если указано false, то пересчет будет выполнен только если завершился текущий пересчет (используется в кубиках метронома). Если указано true, то пересчет будет выполнен сразу после текущего пересчета.
Пример вызова: ctx.Runtime.Recalc($"MyRecalc", null, true);
Пример, читается текущая причина пересчета скрипта, если скрипт запущен не через метод Recalc, то запускается Recalc, ждет 5 секунд и завершается. После завершения запускается новый пересчет, в нем будет указано что текущая причина пересчета "MyRecalc" и повторно не будет вызываться Recalc.
Для расчета данных скрипта можно задействовать стандартный алгоритм, используя класс Perfomance. Ниже приведен пример скрипта который, считает основные метрики и выводит их в лог. Для сокращения кода сам торговый алгоритм не приводится, вместо него поставьте любой свой или из примеров. В блок Внешний скрипт надо добавить TSLab.ScriptEngine.dll.
В коде можно указать проскальзывание при работе с позицией:
Выставить стоп с проскальзыванием 100: pos.CloseAtStop(i + 1, price, 100, "LX");
Выставить тейк с проскальзыванием 100: pos.CloseAtProfit(i + 1, price, 100, "LX");
Важно: В скрипте должно использоваться одно значение проскальзывания. Например, ставим стоп (CloseAtStop) и тейк (CloseAtProfit). В обоих случаях надо передать в эти методы одно значение проскальзывания. Если будут разные, то будет применено последнее для обоих заявок.
Если проскальзывание не указывать в коде, то будет применяться из настроек агента.
Нельзя сравнивать две double переменные. Об этом можно посмотреть в интернете.
================================== Здравствуйте. Столкнулся с проблемой в АПИ. Алгоритм должен проверять актуальность цены заявки и отменять её, если цена не актуальна. Вот реальный пример. Цена активной заявки в реальном времени равна 1332.8 Если выполняется такой код, всё работает правильно - заявка не отменяется, новая не выставляется //////////////////////////////////////////////////////////////////////////////////////////// double BuyPrice = 1332.8; foreach (IOrder MyOrder in SymbolRt.Orders) { if (MyOrder.IsActive) { if (MyOrder.Price == BuyPrice) return; // Выход else SymbolRt.CancelOrder(MyOrder); // Отмена заявки } } //Затем проверяются условия выставления новых заявок. if (,,,,,,,,,,,,,,,,) { SymbolRt.NewOrder(OrderType.Growth, true, BuyPrice, 1, "пример"); } //////////////////////////////////////////////////////////////////////////////////////////// Если выполняется такой код, заявка ВСЕГДА отменяется, а затем выставляется ТОЧНО такая же с той же ценой //////////////////////////////////////////////////////////////////////////////////////////// double BuyPrice = 1332.9 - 0.1; foreach (IOrder MyOrder in SymbolRt.Orders) { if (MyOrder.IsActive) { if (MyOrder.Price == BuyPrice) return; // Выход else SymbolRt.CancelOrder(MyOrder); // Отмена заявки } } //Затем проверяются условия выставления новых заявок. if (,,,,,,,,,,,,,,,,) { SymbolRt.NewOrder(OrderType.Growth, true, BuyPrice, 1, "пример"); } //////////////////////////////////////////////////////////////////////////////////////////// При этом, если переменную сделать таким образом, то всё работает правильно ///////////////////////////////////////////////// double BuyPrice = (1332.9 * 10 - 1) / 10 //////////////////////////////////////////////// ТО ЕСТЬ, почему-то возникает проблема, когда происходит вычитание и сложение десятичных дробей - после этого две переменные неправильно сравниваются
Для того, чтобы посмотреть файл cs из кодогенератора программы, необходимо:
Откройте в программе: Файл -> Настройки программы -> Оптимизация скриптов -> Отладка скриптов
Создайте скрипт и скомпилируйте его, например, как в примере Видео ниже
Файл cs будет доступен в папке temp. В нее несложно попасть из программы.
Инструменты -> Папка с логами -> Подняться на один уровень выше, на одном уровне с папкой logs, папка temp.
Пример создания скрипта в визуальном редакторе программы и просмотр C # (CS file) этого скрипта из кодогенератора.
Зашифрованный контейнер может содержать внутри себя библиотеку dll и скрипт будет с ней работать.
Но одно условие, скрипт не должен вызывать статик поля или методы из библиотеки.