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. Writing scripts on the API

Caching

Caching indicator results

There are IContext.GetData (...) methods for caching indicator results, which can work with three types of lists: double, int, bool.

In the last article, we calculated the SMA indicator in this way:

var smaFast = Series.SMA(sec.ClosePrices, PeriodFast)

During optimization, the calculation of SMAs with the same period will be repeated many times. To remove unnecessary calculations and reduce optimization time, caching exists. The previous example can be rewritten as follows:

var smaFast = ctx.GetData("SMA", new[] { PeriodFast.ToString() }, () => Series.SMA(sec.ClosePrices, PeriodFast));

The GetData method works with the data cache, the cache is a table KEY - VALUE. Where KEY is a row, it is always unique in the table, several identical keys cannot exist. VALUE is a list of values (double, int, bool).

The GetData method takes three parameters:

The first parameter is the key prefix. In this example, it is “SMA”.

The second parameter is an array of strings from which the end of the key is built. In this example, the value of the period is transmitted in the form of a string (PeriodFast.ToString ()), for example, it is 100. Then the full name of the key will be "SMA: 100". If several values were transmitted, for example 100, 20, 40, then the key would be "SMA: 100: 20: 40".

The third parameter is a delegate that is called if there is no data in the cache for the given key. That is, this is the calculation of the indicator values. The delegate should return a list of double, int, or bool values.

How it works. Initially, the data cache is empty. When we request the calculation of SMA with a period of 100, the key "SMA: 100" is generated. This key is looked up in the cache table, but it is not there, since the table is empty. Then a delegate is called that calculates the SMA value. The result is written to the cache table with the key "SMA: 100" and the GetData method returns this result. If we again request SMA calculation with a period of 100, then the key "SMA: 100" will be searched in the cache table. Since it is, the GetData method will immediately return the value for this key, and the delegate will not be called.

The value cache is flushed on each recount of the script. In optimization mode, the cache is not flushed.

An example of a script with caching of two moving averages:

using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
using TSLab.Script.Optimization;

namespace MyLib
{
    public class SimpleCache : IExternalScript
    {
        // Customizable options
        public OptimProperty PeriodFast = new OptimProperty(100, 10, 200, 10);
        public OptimProperty PeriodSlow = new OptimProperty(500, 200, 2000, 100);

        public void Execute(IContext ctx, ISecurity sec)
        {
            // Fast SMA Calculation
            var smaFast = ctx.GetData("SMA", new[] { PeriodFast.ToString() },
                () => Series.SMA(sec.ClosePrices, PeriodFast));

            // Slow SMA Calculation
            var smaSlow = ctx.GetData("SMA", new[] { PeriodSlow.ToString() },
                () => Series.SMA(sec.ClosePrices, PeriodSlow));

            // Trading cycle
            for (int i = 0; i < ctx.BarsCount; i++)
            {
                var posLong = sec.Positions.GetLastActiveForSignal("LE", i);

                if (posLong == null)
                {
                    if (smaFast[i] > smaSlow[i] && smaFast[i - 1] <= smaSlow[i - 1])
                        sec.Positions.BuyAtMarket(i + 1, 1, "LE");
                }
                else
                {
                    if (smaFast[i] < smaSlow[i] && smaFast[i - 1] >= smaSlow[i - 1])
                        posLong.CloseAtMarket(i + 1, "LX");
                }
            }

            // If the script is in optimization mode, then you do not need to build graphs
            if (ctx.IsOptimization)
            {
                return;
            }

            // Plotting
            ctx.First.AddList(string.Format("SMA fast ({0})", PeriodFast), smaFast, ListStyles.LINE, ScriptColors.Green,
                LineStyles.SOLID, PaneSides.RIGHT);
            ctx.First.AddList(string.Format("SMA slow ({0})", PeriodSlow), smaSlow, ListStyles.LINE, ScriptColors.Red,
                LineStyles.SOLID, PaneSides.RIGHT);
        }
    }
}

Consider an example with complex caching. For example, we need to build the border of the upper channel at maximum prices, and then smooth this border by SMA. It turns out that the channel calculation depends on the channel period, and the SMA calculation depends on the SMA period and on the channel period. Therefore, when calculating the SMA, two parameters must be passed, the SMA period and the channel period. Full example:

var highest = ctx.GetData("Highest", new[] { PeriodHighest.ToString() }, 
    () => Series.Highest(sec.HighPrices, PeriodHighest));

var highestSMA = ctx.GetData("HighestSMA", new[] { PeriodHighest.ToString(), PeriodHighestSMA.ToString() }, 
    () => Series.SMA(highest, PeriodHighestSMA));

Remember that if the caching parameters are set incorrectly, the optimization results will be incorrect.

Last updated 3 years ago

Was this helpful?