TSLab
TSLab.proSupportTSLab LiveTSVerse
Eng
Eng
  • TSLab trading platform
  • For newbies
    • A beginner's guide
      • Purchasing a license key for a data provider
      • An example of connecting text quotes
      • Example of connecting a data provider to a broker / exchange
      • An example of creating a script in TSLab
      • An example of creating a trading algorithm in TSLab
  • Installing TSLab
    • TSLab Installation Guide
      • System requirements
      • TSLab Installation manual
    • Update TSLab
      • Preparing for update
      • Release build
      • Nightly build
    • Restarting the TSLab program
    • TSLab Changelog
      • TSLab 2.1 Changelog
      • TSLab 2.2 Changelog
        • 2.2.26.0 - 2024/01/31
        • 2.2.25.0 - 2024/01/17
        • 2.2.24.0 - 2024/12/04
        • 2.2.23.0 - 2024/09/19
        • 2.2.22.0 - 2024/08/30
        • 2.2.21.0 - 2024/05/17
        • 2.2.20.0 - 2024/05/15
        • 2.2.19.0 - 2024/02/21
        • 2.2.18.0 - 2024/02/09
        • 2.2.17.0 - 2023/11/16
        • 2.2.16.0 - 2023/10/20
        • 2.2.15.0 - 2023/10/13
        • 2.2.14.0 - 2023/08/11
        • 2.2.13.0 - 2023/05/12
        • 2.2.12.0 - 2023/02/28
        • 2.2.11.0 - 2022/12/15
        • 2.2.10.0 - 2022/10/27
        • 2.2.9.0 - 2022/09/16
        • 2.2.7.0 - 2022/06/23
        • 2.2.5.0 - 2022/04/29
        • 2.2.3.0 - 2022/04/01
        • 2.2.2.0 - 2021/12/29
  • Data providers
    • Cryptocurrency exchanges
      • Binance Cryptocurrency Exchange
        • Registration on Binance
          • Registration on Binance Exchange website
          • Configure Binance Wallet
          • Creating a Binance API Key for TSLab
          • Binance. Transferring USDT from wallet to wallet without commission
        • Registration on TSLab [Binance]
          • Account registration on the TSLab website [Binance]
          • Creating a free Binance Data Provider for TSLab
        • Setting up a Binance Data Provider in TSLab
        • TSLab Binance Edition
          • Starting the program
          • Configuring the Binance Data provider
      • Bitget Cryptocurrency Exchange
        • Registration on the Bitget official website
        • Creating a Free Bitget Data Provider
        • Configuring the Bitget Data Provider in TSLab
      • ByBit Cryptocurrency Exchange
        • Registration on the ByBit website
        • Creating a free ByBit data provider
        • Configuring the ByBit Data Provider in TSLab
      • Deribit Cryptocurrency Exchange
        • Deribit data provider settings
        • Deribit. Frequently asked questions and useful information
        • Deribit. Possible problems and solutions
        • Deribit Margin Requirements Calculation
        • An example of a ready-made script for Deribit
      • Kucoin Cryptocurrency Exchange
        • Registration on the KuCoin official website
        • Creating an API key on the KuCoin website
        • Issuing a free license for KuCoin Data Provider
        • Setting up the KuCoin data provider in TSLab
      • OKX Cryptocurrency Exchange
        • Setting up an OKX account
          • Registration on the OKX website
          • OKX API Key creation
          • Issuing a free license for OKX Data Provider
          • Setting up the OKX data provider in TSLab
          • OKX demo account
        • TSLab OKX Edition
          • First launch of TSLab OKEx Edition
          • Configuring the OKEx data provider
          • Trading in TSLab [OKEx]
          • OKEx Demo
    • Historical Data
      • YahooFinance
      • Offline data provider in CSV format
      • An example of connecting text quotes
      • Text files with historical data
    • Interactive Brokers
      • Getting Started with Interactive Brokers Data Provider
        • Installing and configuring the Trader Workstation (TWS) terminal
        • Installing and configuring the IB Gateway terminal
      • Features of working with Interactive Brokers data provider
      • Known issues for Interactive Brokers Data Provider
      • Loading instruments in a package
  • Working with the program
    • Main menu
      • File
        • Program Settings
      • View
        • Chart
          • Features of working with the Chart in TSLab
          • Chart Controls
        • Depth of Market
        • Quotes
        • All Trades
      • Data
        • Data Providers window
        • Add online data provider
        • Add offline data provider
      • Lab
        • Scripts window
          • Script Container
      • Trading
        • Accounts window
        • Positions window
        • My trades window
        • My orders window
          • Move orders and deals to an agent
        • Autotrading Control Center window
          • Agent window
          • Agent trading settings
            • Event recalculations
            • Slippage
          • "Forget errors" of the agent
        • Orders manager
          • Linking a manually completed order to an agent
        • Agent Control Center window
      • Tools
        • Data backup and recovery
        • Notifications manager
          • Notifications Manager Filters
          • Reference List of Service Message Numbers
          • Example of setting up notifications for Gmail
        • Export to Excel
    • Common interface
      • Status bar
      • Tab
      • Workspace
      • Spreadsheets
    • Visual editor
      • Toolbar
        • Compress and Decompress Blocks
      • List of visual blocks
        • Service Elements
        • Cycles
        • TSChannel
      • The syntax of the Formula, Boolean expression and String expression blocks.
    • Autotrading Control Center
      • Agent trade settings
        • Agent trade settings - Placing orders
        • Agent trading settings - Script execution
        • Agent trading settings - Events
    • TSLab API
      • API Introduction
        • Visual Studio Installation
        • First script (API)
        • First Indicator (API)
        • Script Debugging
        • Logging
      • Writing scripts on the API
        • Trading Instrument Data
        • Working with positions
        • List of deals
        • The order queue
        • Standard Indicators and Handlers
        • Script parameters
        • Caching
        • Local and global cache
        • Multiple Tools
      • Writing indicators on the API
        • Stream indicator
        • Bar indicator
        • Pre-processed indicator
        • Indicator with multiple calculations
      • Additional features
        • The ability to create your own optimizers *
        • C ++ / CLI script
        • API Control Panel
        • Result from script
        • * Оптимизация. Пул массивов.
      • Examples
        • Get script results
        • Get script parameters
        • Get script and agent settings
        • Get position balance (net worth)
        • An example of a strategy Breakout of the Donchian channel
        • Example of a Moving Average Crossover strategy
        • Indicator example
        • How to speed up the processing of a script on the API
        • Links to examples
      • Question - Answer
        • HandlerParameter Attribute
    • Optimization
      • Insufficient load on a multicore processor
  • Examples of scripts and indicators
    • Examples of algorithms and indicators
    • Examples of implementing strategies in TSLab
      • A trading system based on indicator CCI
      • A trading system based on Standard Deviation
      • A trading system based on Aroon
      • A trading system based on ADX and DI technical indicators
      • A trading system based on the RSI indicator
      • Example of a trading strategy without parameters
  • TSLab website
    • TSLab Support Service
      • Memory dump of TSLab application
      • TSLab program log files
Powered by GitBook
LogoLogo

Мы в соцсетях

  • Группа в Telegram
  • Новости TSLab
  • Vkontakte
  • YouTube канал TSLab Live

Наши веб-сайты

  • TSLab
  • Служба поддержки
On this page

Was this helpful?

Export as PDF
  1. Working with the program
  2. TSLab API
  3. Additional features

* Оптимизация. Пул массивов.

При разработке скриптов приходится работать с большими массивами данных. Создание и удаление больших массивов трудозатратный процесс. Если в скрипте часто создаются большие массивы, то загрузка процессора может просесть, что сказывается на времени оптимизации.

Чтобы этого избежать, можно использовать внутренний пул массивов в TSLab. Это работает только для оптимизации.

Пул массивов - это коллекция массивов, которые находятся в памяти. Например, запускаем оптимизацию скрипта. В скрипте запрашиваем новый массив из пула. Пул ищет у себя подходящий свободный массив, по типу и длине данных. Если такого массива в пуле нет, то он создается. Далее скрипт помещает в этот массив свои данные, производит вычисления, выводит их на график если надо. После выполнения скрипта контекст данных освобождается, и все массивы из пула, которые были использованы в этом контексте, очищаются и помещаются обратно в пул. Далее, при проходе следующего итерации оптимизации, скрипт запрашивает массив из пула и действия повторяются. Таким образом, сокращается количество создаваемых массивов.

При освобождении контекста массив будет помещаться обратно в пул, только если он не закеширован.

Методы:

T[] IContext.GetArray<T>(int count) – получить массив с типом T и количеством элементов count из пула. Если в пуле нет такого массива, то он создается.

void ReleaseArray(Array array) – передать обратно массив в пул. При этом массив очищается. Метод ReleaseArray вызывается автоматически при освобождении контекста (IContext), после прохода оптимизации (если массив не был помещен в кеш).

Рассмотрим пример. Создадим массив с double числами, поместим в него среднюю цену бара и в конце выведем в лог хеш-код этого объекта.

public class TestArrayPool : IExternalScript
{
	public IntOptimProperty Param = new IntOptimProperty(1, 1, 5, 1);
	public void Execute(IContext ctx, ISecurity sec)
	{
		var bars = sec.Bars;
		var arr = new double[bars.Count];
		for (int i = 0; i < bars.Count; i++)
			arr[i] = (bars[i].High + bars[i].Low) / 2;
		ctx.Log($"hash: {arr.GetHashCode()}", MessageType.Info, true);
	}
}

Теперь проведем оптимизацию, только в настройках TSLab поставим 'Количество потоков оптимизации' равное 1. Это нужно чтобы проверить как часто у нас создается новый массив. Так как указали количество потоков 1, то сначала пройдет один проход итерации, потом второй и так далее, друг за другом. В логе мы видим разные значения хеш-кодов. Это означает, что при каждом проходе оптимизации создавался новый массив.

Теперь мы немного изменим наш пример, вместо создания массива будем получать его из пула: var arr = ctx.GetArray<double>(bars.Count);

public class TestArrayPool : IExternalScript
{
	public IntOptimProperty Param = new IntOptimProperty(1, 1, 5, 1);
	public void Execute(IContext ctx, ISecurity sec)
	{
		var bars = sec.Bars;
		var arr = ctx.GetArray<double>(bars.Count);
		for (int i = 0; i < bars.Count; i++)
			arr[i] = (bars[i].High + bars[i].Low) / 2;
		ctx.Log($"hash: {arr.GetHashCode()}", MessageType.Info, true);
	}
}

Запускаем оптимизацию, снова с одним потоком. В логе мы видим одинаковый хеш-код. Это означает что во всех итерациях оптимизации использовался только один массив. Мы брали его из пула, использовали, при завершении итерации он помещался обратно в пул. При следующей итерации мы снова берем этот же массив из пула.

Что будет если в настройках поставить максимальное количество потоков и запустить оптимизацию на 10000 проходов? Оптимизация запустится на всех имеющихся потоках процессора. При каждой итерации будет браться массив из пула, обрабатываться и помещаться обратно в пул. Но так как потоков теперь у нас много, то теперь одного массива в пуле на всех не хватит. В этом случае будут созданы дополнительные массивы в пуле. И в конце оптимизации окажется что количество массивов в пуле равно количеству потоков. Хотя проходов у нас было 10000.

Во многих стандартных блоках TSLab используется пул массивов. Например блок расчета ATR:

public static IList<double> AverageTrueRangeNew(IReadOnlyList<IDataBar> candles, int period, IMemoryContext context)
{
	var listTr = Series.TrueRange(candles, context);
	var res = Series.SMA(listTr, period);
	context?.ReleaseArray((Array)listTr);
	return res;
}

Was this helpful?

Заметка: Пул потоков в TSLab это аналог из .NET Core.

ArrayPool