tsm9_2Momentum_Oscillators_TSI_MFI_HPI_adx_psar_Rounded Tops_TRIX_Double Triple Smooth_macd_diverge

文章探讨了双平滑动量概念,特别是TrueStrengthIndex(TSI)作为动力指标在捕捉市场价格动态方面的应用。TSI通过价格变化的双平滑处理减少噪音,有效追踪价格走势,适用于期货和期权市场的趋势和反转预测。同时,介绍了HerrickPayoffIndex,结合价格、成交量和未平仓兴趣分析市场心理和资金流动,以及动量背离和速率、加速度概念在技术分析中的运用。

Double-Smoothing Momentum

     Important contributions to the study of momentum have been made by William Blau. In addition to creating new momentum indicators, he has added substantial value to the old ones. Also refer to his work on double smoothing of momentum in Chapter 7.

(TSI:momentum ocillator)True Strength Index

     the True Strength Index (TSI) is a momentum ocillator based on a double smoothing of price changes. Even though several steps are needed for calculation, the indicator is actually pretty straightforward. By smoothing price changes, TSI captures the ebbs and flows兴衰,起伏,潮的涨落 of price action with a steadier line(EMA(EMA(...),...)) that filters out the noise. As with most momentum oscillators, chartists can derive signals from overbought/oversold readings, centerline crossovers, bullish/bearish divergences and signal line crossovers

     Much of Blau’s work combines double smoothing of momentum values (1-period price differences) which has surprisingly little calculation lag given the amount of smoothing. By using the first differences, he has based the calculations on values more sensitive than price and then slowed them down by smoothing. In effect, he speeds up the price movement before slowing it down. The net result is that the final index value has less lag than we would normally expect, and the index line is much smoother than a standard moving average. Blau refers to this as using momentum as a proxy for price. One of Blau’s most popular indicators is the True Strength Index (TSI) which combines these features: 

  • c0 = today's closing price
    m = c0 − c1 = momentum (difference between today's and yesterday's close)
    EMA(m,n) = exponential moving average of m over n periods, that is,
    EMA(m_0,n) = m_0
    EMA(m_t, n) = \frac{2}{n+1}[m_t - EMA(m_{t-1},n)] + EMA(m_{t-1},n)
    EMA(m_t, n) = (1- \frac{2}{n+1} ) EMA(m_{t-1},n) + \frac{2}{n+1}m_t
    adjust=False and ignore_na=False
  • Momentum(Price change represents momentum in its truest form) :


                                                 

                                                                  
                                                                   
    The 1-day differences(Price Change) are first smoothed over the period r=25, and then the result is smoothed over the period s=13.
  • Absolute Momentum :


                                                                    
                                                                    

                                                                    
                                                                    

  • The first part, which is the double smoothed price change, sets the positive or negative tone for TSI.
         The indicator is negative when the double smoothed price change is negative and positive when it is positive.
         The double smoothed absolute price change normalizes the indicator and limits the range of the ensuing oscillator.双重平滑的绝对价格变化使指标正常化并限制了随后的震荡指标的范围 
         In other words, this indicator measures the double smoothed price change relative to the double smoothed absolute price change.该指标衡量的是相对于双重平滑绝对价格变化的双重平滑价格变化
         A string of large positive price changes results in relatively high positive readings, signaling strong upside momentum.
         A string of large negative price changes pushes TSI deep into negative territory.
  • TSI signal line is a  n-period EMA of TSI
    \mathbf{TSI_{signal} = EMA(TSI, n=13)}

pandas-ta/tsi.py at 084dbe1c4b76082f383fa3029270ea9ac35e4dc7 · twopirllc/pandas-ta · GitHubpandas-ta/ema.py at 084dbe1c4b76082f383fa3029270ea9ac35e4dc7 · twopirllc/pandas-ta · GitHubpandas-ta/_core.py at main · twopirllc/pandas-ta · GitHub 

import pandas as pd

def get_tsi(df, columnName='Close', fast_period=13, slow_period=25, signal_period=13,
            diff_drift=1, scalar=100, tsi_offset=0, mamode=None, **kwargs
           ):
    
    """Indicator: True Strength Index (TSI)"""
    # Validate Arguments
    fast_period = int(fast_period) if fast_period and fast_period > 0 else 13
    slow_period = int(slow_period) if slow_period and slow_period > 0 else 25
    
    diff_drift =  int(diff_drift) if isinstance(diff_drift, int) and diff_drift != 0 else 1
    scalar = float(scalar) if scalar else 100.
    
    signal_period = int(signal_period) if signal_period and signal_period > 0 else 13
    tsi_offset = int(tsi_offset) if isinstance(tsi_offset, int) else 0
    # if slow_period < fast_period:
    #     fast, slow = slow_period, fast_period

    # Calculate Result
    df['Momentum'] = df[columnName].diff(diff_drift) # df['Close'] - df['Close'].shift(diff_drift)
    
    # https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.ewm.html
    adjust = kwargs.pop("adjust", False)#if 'adjust' not exist,return default False
    
    df[f'{slow_period}_ema'] = df['Momentum'].ewm( span=slow_period, # or alpha=2/(slow_period+1)
                                                   min_periods=slow_period,
                                                   ignore_na=False,
                                                   adjust=adjust
                                                 ).mean()
    df[f'{fast_period}_ema'] = df[f'{slow_period}_ema'].ewm( span=fast_period,
                                                             min_periods=fast_period,
                                                             ignore_na=False,
                                                             adjust=adjust
                                                           ).mean()

    df['Absolute Momentum'] = df['Momentum'].abs()
    df[f'abs_{slow_period}_ema'] = df['Absolute Momentum'].ewm( span=slow_period,
                                                                min_periods=slow_period,
                                                                ignore_na=False,
                                                                adjust=adjust
                                                              ).mean()
    df[f'abs_{fast_period}_ema'] = df[f'abs_{slow_period}_ema'].ewm( span=fast_period,
                                                                     min_periods=fast_period,
                                                                     ignore_na=False,
                                                                     adjust=adjust
                                                                   ).mean()

    df["tsi_{}_{}".format(fast_period,
                          slow_period,
                          signal_period,
                         )
      ] = scalar * df[f'{fast_period}_ema'].divide( df[f'abs_{fast_period}_ema'])
    
    df["tsi_{}_{}_signal_{}".format(fast_period,
                                    slow_period,
                                    signal_period
                                   )
      ] = df[f"tsi_{fast_period}_{slow_period}"].ewm( span=signal_period,
                                                      min_periods=signal_period,
                                                      ignore_na=False,
                                                      adjust=adjust
                                                    ).mean()
    # Offset
    if tsi_offset != 0:
        tsi = tsi.shift(tsi_offset)
        tsi_signal = tsi_signal.shift(tsi_offset)

    # Handle fills
    if "fillna" in kwargs:
        tsi.fillna(kwargs["fillna"], inplace=True)
        tsi_signal.fillna(kwargs["fillna"], inplace=True)
    if "fill_method" in kwargs:
        tsi.fillna(method=kwargs["fill_method"], inplace=True)
        tsi_signal.fillna(method=kwargs["fill_method"], inplace=True)
    
    df.drop(columns=['Momentum', f'{slow_period}_ema', f'{fast_period}_ema',
                     'Absolute Momentum', f'abs_{slow_period}_ema', f'abs_{fast_period}_ema'
                    ],
            inplace=True)

    return df

fast_period=13 
slow_period=25
signal_period=13
columnName='Close'

spx = yf.download( '^GSPC', start='2010-09-01', end='2012-09-01')
spx_tsi=get_tsi( spx.loc[:,[columnName]],columnName, fast_period,  slow_period)
spx_tsi.iloc[:fast_period+slow_period+signal_period]#['2012-07-19':'2012-08-29']

aapl = yf.download( 'aapl', start='2012-01-01', end='2018-12-31')
aapl_tsi=get_tsi( aapl.loc[:,[columnName]],columnName, fast_period,  slow_period)
aapl_tsi['2013-01-01':'2013-02-01']

Interpretation

     The True Strength Index (TSI) is an oscillator that fluctuates between positive and negative territory. As with many momentum oscillators, the centerline defines the overall bias. The bulls have the momentum edge when TSI is positive and the bears have the edge when it's negative. As with MACD, a signal line can be applied to identify upturns and downturns. Signal line crossovers are, however, quite frequent and require further filtering with other techniques. Chartists can also look for bullish and bearish divergences to anticipate trend reversals; however, keep in mind that divergences can be misleading in a strong trend.

     TSI is somewhat unique because it tracks the underlying price quite well. In other words, the oscillator can capture a sustained move in one direction or the other. The peaks and troughs in the oscillator often match the peaks and troughs in price. In this regard, chartists can draw trend lines and mark support/resistance levels using TSI. Line breaks can then be used to generate signals. 图表师可以使用 TSI 绘制趋势线并标记支撑/阻力位。 然后可以使用换行符来生成信号。

  • The TSI fluctuates between positive and negative territory.
    • Positive territory means the bulls are more in control of the asset.
    • Negative territory means the bears are more in control.
  • When the indicator divergences with price, the TSI may be signaling the price trend is weakening and may reverse.
  • A signal line can be applied to the TSI indicator.
    • When the TSI crosses above the signal line it can be used as a buy signal, and
    • when it crosses below, a sell signal.
    • Such crossovers occur frequently, so use with caution.此类交叉经常发生,因此请谨慎使用。
      • when TSI is in positive territory, A bullish signal is triggered when TSI crosses above its signal line.
      • where TSI is in negative territory, A bearish signal is triggered when TSI crosses below its signal line.

  • Overbought and oversold levels will vary by the asset being traded.
    超买和超卖水平将因交易的资产而异。
    • 由于 TSI 基于价格变动,超卖和超买水平将因交易资产而异。 一些股票可能会在出现价格反转之前达到 +30 和 -30,而另一只股票可能会在 +20 和 -20 附近反转。
    • 在交易的资产上标记极端 TSI 水平,以查看超买和超卖的位置。 超卖并不一定意味着是时候买入,当资产超买时并不一定意味着是时候卖出。 交易者通常会观察其他信号以触发交易决策。 例如,他们可能会等待价格或 TSI 开始下跌,然后在超买区域卖出。 或者,他们可以等待信号线交叉。

Center Line Crossover

     The centerline crossover is the purest signal.

  • The double smoothed momentum of price changes is positive when TSI is above zero and negative when below zero.
    当指标高于零时价格动量为正,低于零时为负。
    一些交易者使用中心线作为方向偏差。 例如,如果指标高于其中心线,交易者可能决定只建立多头头寸。 相反,如果指标值低于零,交易者将看跌并且只考虑空头头寸
  • Prices are generally rising when TSI is positive and falling when TSI is negative.

The chat shows Nike (NKE) turning bullish in September 2011 as TSI moved into positive territory (green line). The stock remained bullish as the uptrend extended into the spring of 2012. Nike turned bearish when TSI turned negative and the stock broke support.

Trend Lines

     TSI often produces support and resistance levels that chartists can use to identify breakouts or breakdowns. The chart shows Citigroup (C) with TSI establishing support in March. The indicator broke support in early April and this breakdown foreshadowed a significant decline into May. TSI then rebounded in June and formed a flat consolidation into July. This consolidation resembled a falling flag and TSI broke above the trend line in late July. This breakout preceded further strength into August

Overbought/Oversold

     Overbought and oversold levels for the True Strength Index vary according to a security's volatility and the period settings for the indicator.

  • The TSI range will be smaller for stocks with low volatility, such as utilities公用事业.
  • The TSI range will be larger for stocks with high volatility, such as biotechs生物技术.
  • Using shorter time periods for the smoothing will result in a wider range and choppier更震荡 indicator line.
  • Longer time periods will result in a smaller range and smoother line.
  • It is the classic technical analysis tradeoff:
    • chartists get quicker signals and less lag with shorter periods, but this comes at the cost of more whipsaws and false signals.
    • Longer periods reduce the whipsaws, but these signals come with more lag and a poorer reward-to-risk ratio

The chart above shows the Nasdaq 100 ETF (QQQ) with TSI using two different timeframes.

  • The upper indicator window shows TSI (40,20,7) fluctuating between -20 and +44 with 20/-20 marking overbought/oversold.
  • The lower window shows TSI (13,7,7) fluctuating between +78 and -69 with 50/-50 marking overbought/oversold.
  • Notice how TSI in the lower window is much more volatile than TSI in the upper window. Also, notice that the more sensitive TSI produced two oversold readings and four overbought readings (blue arrows).
  • Overbought and oversold are not signals of an impending reversal.超买和超卖并不是即将发生逆转的信号 They simply suggest that prices have come too far too fast. Chartists must wait for a confirming signal to suggest an actual reversal.
  • The blue lines mark support and resistance using trend lines, peaks or troughs. Once an overbought or oversold reading occurs, chartists can use these lines to define a price reversal. This will not illuminate whipsaws, but it will reduce bad signals.
    交易者可以使用 TSI 创建的支撑位阻力位识别突破和价格动能变化。 例如,如果指标跌破趋势线,价格可能会继续抛售。
  • 背离是 TSI 提供的另一种工具。 如果资产价格走高而 TSI 下降,则称为看跌背离,可能导致价格下行。 相反,如果 TSI 在价格下跌时上涨,则可能预示着价格会上涨。 这称为看涨背离。

    背离是一个糟糕的时机信号,因此它只能与 TSI 或其他技术指标生成的其他信号结合使用

Signal Line Crossovers

     The last parameter in the TSI setting is the signal line\mathbf{TSI_{signal} = EMA(TSI, n=13)}, which is simply an exponential moving average of TSI. Signal line crossovers are by far the most common signals, meaning there will be good, bad and ugly signals.In an effort to reduce signals and noise, chartists should consider increasing the settings for TSI or the price chart settings.

  • The TSI has a signal line, which is usually a 7- to 12-period EMA of the TSI line
  • when TSI is in positive territory, A bullish signal is triggered when TSI crosses above its signal line.
  • where TSI is in negative territory, A bearish signal is triggered when TSI crosses below its signal line.

The example above shows TSI(40,20,10) using a weekly chart. This means the signal line is a 10-period EMA of TSI. There was no shortage of signals on this chart as TSI crossed the signal line at least 12 times from April 2007 to July 2012. 

Limitations of the True Strength Index (TSI)

     Many of the signals provided by the TSI will be false signals. That means the price action will be different than expected following a trade signal. For example, during an uptrend, the TSI may cross below the centerline several times, but then the price proceeds higher even though the TSI indicates momentum has shifted down.在上升趋势中,TSI 可能多次下穿中线,但随后价格继续走高,即使 TSI 表明动能已经向下移动

Signal line crossovers also occur so frequently that they may not provide a lot of trading benefit. Such signals need to be heavily filtered based on other elements of the indicator or through other forms of analysis. The TSI will also sometimes change direction without the price changing direction, resulting in trade signals that look good on the TSI but continue to lose money based on price.TSI 有时也会在价格没有改变方向的情况下改变方向,导致交易信号在 TSI 上看起来不错,但根据价格继续亏损。

Divergence, too, tends to be unreliable on the indicator. Divergence can last so long that it provides little insight into when a reversal will actually occur. Also, divergence isn't always present when price reversals actually do occur.背离在指标上也往往是不可靠的。 背离可以持续很长时间,以至于几乎无法洞察何时会真正发生逆转。 此外,当价格反转确实发生时,分歧并不总是存在。

Additional Smoothing without Adding Lag不增加滞后的额外平滑

     In creating the TSI, Blau missed an opportunity to improve the smoothing with only a minor increase in the lag. Instead of taking the 1-day differences, substitute the n-day differences in the first step. This smoothes the trendline even more at the cost of a slight additional lag这以轻微的额外滞后为代价使趋势线更加平滑。. Figure 9.20 shows the TSI with a 10-day difference followed by two 20-day exponential smoothings in the bottom panel.FIGURE 9.20 Comparing the TSI with 10-20-20 smoothing (bottom这以轻微的额外滞后为代价使趋势线更加平滑,)

  • to a standard 20-period momentum (second panel : has the typical erratic pattern of prices典型的不稳定价格模式, and a slight lead identifying the peaks识别峰值的轻微领先 )
  • TSI with 1-20-20 smoothing (third panel,TSI 更加平滑,波峰和波谷略微滞后于价格)

using INTC from January 2001 through March 2002. 

Anticipating the Turn期待转机

     When working with trendlines that are very smooth, such as the 10-20-20 TSI, you can anticipate the change in the trend direction most of the time. Instead of waiting for the smoothed trendline to change from up to down, you can sell when it gets to a “near-zero slope” and is continuing to flatten. This anticipation can greatly reduce the lag and improve performance even at the cost of a few false signals. 当使用非常平滑的趋势线时,例如 10-20-20 TSI,您可以在大多数时间预测趋势方向的变化。与其等待平滑的趋势线从上升到下降,不如在它达到“接近零的斜率”并继续趋于平缓时卖出。 即使以一些错误信号为代价,这种预期也可以大大减少延迟并提高性能       

Conclusion

     The True Strength Index (TSI) is a unique indicator based on double smoothed price changes. Price change represents momentum in its truest form. The double smoothing with two exponential moving averages reduces the noise and produces an oscillator that tracks price quite well. In addition to the usual oscillator signals, chartists can often draw trend lines, support lines and resistance lines directly on TSI. These can then be used to generate signals based on breakouts and breakdowns. As with all indicators, TSI signals should be confirmed with other indicators and analysis techniques. 

Double-Smoothed Stochastics双平滑随机指标

     Because of Blau’s great interest in double smoothing, he defi nes the general form of a double-smoothed stochastic as: 

Where

TRIX:momentum oscillator) Triple Exponentially Smoothed Moving Average

     Similar to Blau’s double smoothing is TRIX, a triple-smoothed exponential that is most often used as an oscillator. Introduced by Jack Hutson,(Referenced in Robert W. Colby, The Encyclopedia of Technical Market Indicators (New York: McGraw-Hill, 2003) as “Good Trix” by Jack K. Hutson, Technical Analysis of Stocks & Commodities 1, no. 5.) it is created using steps similar to Blau except that there are three exponential smoothings and the differencing is done at the end. Typically, the same smoothing constants (calculation periods) are used for each smoothing. This method has been applied to daily, hourly, or even 1-minute price data. TRIX 具有三重平滑功能旨在过滤掉微不足道的价格变动。 图表师可以使用 TRIX 生成类似于 MACD 的信号。 可以应用信号线来寻找信号线交叉方向偏差可以用绝对水平来确定看涨和看跌背离可用于预测逆转

     TRIX is the 1-period percentage rate-of-change for a triple smoothed exponential moving average (EMA), which is an EMA of an EMA of an EMA. Here is a breakdown of the steps involved for a 15 period TRIX

  1. Calculate the natural log (ln) of the closing prices (daily or intraday bars). This implicitly corrects for price volatility; however, it is commonly omitted from the calculation because back-adjusted data in futures will cause errors.计算收盘价(每日或盘中柱)的自然对数 (ln)。 这隐含地纠正了价格波动; 然而,它通常在计算中被忽略,因为期货中的反向调整数据会导致错误。

  2. Calculate the N-period exponential smoothing of the closing prices, or the log (ln) of the closing prices, to get trend 1.
    Single-Smoothed 

  3. Calculate the p-period exponential smoothing of trend 1 to get trend 2.
    Double-Smoothed

  4. Calculate the q-period exponential smoothing of trend 2 to get trend 3.

  5. Get the 1-period differences of trend 3 by subtracting each value from the previous value. As with the added smoothing of the TSI
    , the 1-period differences can be replaced with the s-period differences.
    TRIX = 1-period percent change in Triple-Smoothed EMA

  6. Scale the results by multiplying by 10,000(or 100). This is an attempt to get TRIX scaled to a positive integer value for charting and may also be omitted.
    通过乘以 10,000 来缩放结果。 这是为了将 TRIX 缩放为正整数值以用于制图的尝试,也可以省略。

  7. Most traders prefer to plot a 9-period Moving Average of the TRIX to create a "signal" line or 9-period EMA of the TRIX
    \mathbf{TRIX_{signal} = EMA(TRIX, signal_{period=9})}OR\mathbf{TRIX_{signal} = SMA(TRIX, signal_{period=9})}

def get_trix( df, columnName='Close', smoothing_period=15, 
              signal_period=9, smoothing_signal='ma',
              scalar=100, diff_drift=1, hist_multiplier=0,
              trix_offset=0, **kwargs
           ):
    """ Triple Exponential Average
    https://www.investopedia.com/articles/technical/02/092402.asp
    :param column: the column to calculate
    :param windows: range
    :return: result series
    """
    # Validate Arguments
    smoothing_period = int(smoothing_period) if smoothing_period and smoothing_period > 0 else 15
    signal_period = int(signal_period) if signal_period and signal_period > 0 else 0
    
    scalar = float(scalar) if scalar else 100
    
    diff_drift =  int(diff_drift) if isinstance(diff_drift, int) and diff_drift != 0 else 1
    trix_offset = int(trix_offset) if isinstance(trix_offset, int) else 0
    hist_multiplier = int(hist_multiplier) if hist_multiplier and  hist_multiplier > 0 else 0

    # https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.ewm.html
    adjust = kwargs.pop("adjust", False)#if 'adjust' not exist,return default False
    
    df['single_ema'] = df[columnName].ewm( span=smoothing_period, # or alpha=2/(slow_period+1)
                                           min_periods=smoothing_period,
                                           ignore_na=False,
                                           adjust=True
                                         ).mean()
    df['double_ema'] = df['single_ema'].ewm( span=smoothing_period,
                                             min_periods=smoothing_period,
                                             ignore_na=False,
                                             adjust=True
                                           ).mean()
    df['triple_ema'] = df['double_ema'].ewm( span=smoothing_period,
                                             min_periods=smoothing_period,
                                             ignore_na=False,
                                             adjust=adjust
                                           ).mean()
    df[f'trix_{smoothing_period}']=scalar * df['triple_ema'].pct_change(periods=diff_drift) # Periods to shift for forming percent change.
    #df[f'trix_{smoothing_period}']=scalar *df['triple_ema'].diff(diff_drift)/df['triple_ema'].shift(diff_drift)
    
    if signal_period>0:
        if signal_period and smoothing_signal=='ma' or smoothing_signal=='sma':
            df['trix_{}_signal_{}'.format(smoothing_period,
                                          signal_period
                                         )
              ] = df[f'trix_{smoothing_period}'].rolling(signal_period).mean()
        
        elif smoothing_signal=='ema' or smoothing_signal=='exponential':
            df['trix_{}_signal_{}'.format(smoothing_period,
                                          signal_period
                                         )
              ] = df[f'trix_{smoothing_period}'].ewm( span=signal_period,
                                                      min_periods=signal_period,
                                                      ignore_na=False,
                                                      adjust=adjust
                                                    ).mean()  
        # Offset
        if trix_offset != 0:
            df[f'trix_{smoothing_period}'] = df[f'trix_{smoothing_period}'].shift(trix_offset)
            df['trix_{}_signal_{}'.format(smoothing_period,
                                          signal_period
                                         )
              ] = df['trix_{}_signal_{}'.format(smoothing_period,
                                                signal_period
                                               )
                    ].shift(trix_offset)
    
        if hist_multiplier>0 :
            df['trix_{}_signal_{}_hist_{}'.format( smoothing_period,
                                                   signal_period,
                                                   hist_multiplier,
                                                 )
              ] = hist_multiplier * (df[f'trix_{smoothing_period}']-df[f'trix_{smoothing_period}_signal_{signal_period}'] )
    return df

smoothing_period=15 
signal_period=9
columnName='Close'
diff_drift=1
hist_multiplier=2
scalar=10000
smoothing_signal='ema'

flnc = yf.download( 'flnc', start='2010-10-30',end='2023-05-30' )
flnc_trix=get_trix( flnc.loc[:,[columnName]],columnName, 
                    smoothing_period, 
                    signal_period, smoothing_signal,
                    scalar, diff_drift, hist_multiplier
                  )
flnc_trix

 

smoothing_period=15
columnName='Close'
diff_drift=1
signal_period=0
scalar=100
smoothing_signal='ma'

spy = yf.download( 'spy', start='2009-06-30',end='2010-08-30' )
spy_trix=get_trix( spy.loc[:,[columnName]], columnName, 
                   smoothing_period,
                   signal_period, smoothing_signal,
                   scalar, diff_drift,
                 )
spy_trix['2010-06-30':'2010-08-11']

 round==>yahoo finance

smoothing_period=15
columnName='Close'
diff_drift=1
signal_period=9
scalar=100
smoothing_signal='sma'
trix_offset=1

spy = yf.download( 'spy')
spy_trix=get_trix( spy.loc[:,[columnName]],columnName, 
                   smoothing_period, 
                   signal_period-1, smoothing_signal,
                   scalar, diff_drift, trix_offset=trix_offset
                 )
spy_trix

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIQING LIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值