• The price of VIP membership is increasing to $199 beginning June 1. Click here to lock in the current rate of $149.

Gamma Scalping Indicator for ThinkorSwim


New member
After listening to a comment by Don Kaufman of TheoTrade regarding the zero commission on stock/ETF trades with TDAmeritrade, I started learning about gamma scalping and found it very, very interesting.

The critical factor to keep in mind is the negative theta position of the straddles. This negative theta needs to be matched by gamma scalping, or even better more money needs to be made gamma scalping than the time decay to make a profit at the end of the trade.

From my limited research it seems that we need: (1) stocks price between $30-$50; (2) low IV% when starting; (3) good liquidity; (4) optionable stock/ETF.

It is not very difficult to build a scan in ToS for those 4 criteria. However, I would like to enhance the scan by searching for stocks that are now in a narrow trading range and are about to break-out of it. I have been thinking about (1) TTM Squeeze or (2) Fractal energy a.k.a. choppiness index, or ECI, expansion/contraction index. I am specially interested in the FE.

I am wondering whether y'all have any ideas or suggestions on gamma scalping. It seems a relatively save way to start learning how to daytrade. It is probably not very profitable, but that would not be a problem because I am a cautious trader.

Thanks to you all and I am eager to find out what you here think about gamma scalping.

input Length=20;
#hint Length: On intraday, this is the number of days used to calculate the atr. On interday, it is the number of chart aggregation periods used to calculate atr. \n\nrev:1.2.0 05/18/2017 comment-out labels except for the ATR label \nrev: 1.1.0 05/17/2017 plot standard deviation of true range offset from hod and lod. Post a chart label with the current SDTRange.

declare upper;

#add by cwen
declare once_per_bar;
### ATR + Visual

def ATRange = if getaggregationPeriod()<aggregationPeriod.DAY then
    MovingAverage(AverageType.WILDERS, TrueRange(high(period = AggregationPeriod.DAY), close(period = AggregationPeriod.DAY), low(period = AggregationPeriod.DAY)), Length)
    else ATR(length = Length);
def SDTRange=StDev(data = TrueRange(high(period = AggregationPeriod.DAY), close(period = AggregationPeriod.DAY), low(period = AggregationPeriod.DAY)),length=length);

plot high_std=
    if getaggregationPeriod()<aggregationPeriod.DAY then
        high(period = AggregationPeriod.DAY) - SDTRange

plot low_std=
    if getaggregationPeriod()<aggregationPeriod.DAY then
        low(period = AggregationPeriod.DAY) + SDTRange

plot High_ATR =
    if getaggregationPeriod()<aggregationPeriod.DAY then
        high(period = AggregationPeriod.DAY) - ATRange

plot Low_ATR =
    if getaggregationPeriod()<aggregationPeriod.DAY then
        low(period = AggregationPeriod.DAY) + ATRange


### Dates & Count

def Days = if BarNumber() >= 1
                    if (high[1] - low[1]) > 0
                    then Days[1] + 1
                    else Days[1]
                else Days[1] ;

def ATR_Count = if BarNumber() >= 1
                    if (high[1] - low[1]) > ATRange
                    then ATR_Count[1] + 1
                    else ATR_Count[1]
                else ATR_Count[1] ;

def ATR_Counter = if BarNumber() >= 1
                    if (high[1] - low[1]) < ATRange
                    then ATR_Counter[1] + 1
                    else ATR_Counter[1]
                else ATR_Counter[1];

### Labels

AddLabel(yes, "ATR: $" + Round(ATRange), Color.CYAN);
AddLabel(yes, "SDTR: $"+ round(SDTRange), color.CYAN);
#AddLabel(yes, "# of Bars Trading > ATR:: " + ATR_Count, Color.WHITE);
#AddLabel(yes, "# of Bars:: " + Days, Color.WHITE);
#AddLabel(yes, Round(ATR_Count / Days) / TickSize() + "% of Bars > ATR", Color.CYAN);


New member
id say as long as you understand delta and the different meanings. personally not a big fan of using straddles do gamma scalping, but i do like strangles. keep in mind you should keep capital in spare in case you have to buy stock to balance gamma. rather starting with a straddle or strangle, why not start with a diag and adjust the short legs. ie start double diag. when price goes towards a short leg, clip the untested side and go naked. gamma scalping is a different style of trading that isnt really ideal for directional movement unless you shape spreads directional. from past experience gamma scalping works best in range bound trades. unless legging into a debit/expecting a directional move. thats a great pre-post earnings play


New member
Orios, thanks for your kind reply. I would like to better understand your suggestion of using instead a double diagonal. When price goes towards a short leg I accumulate positive deltas on the put side or negative deltas on the call side. I do not understand what your mean with "clip the untested side and go naked." Do you mean to sell the long option on the untested side? What would I gain from that? Are you assuming that I would have profit from selling the untested side and then hope of a reversal on the tested side, so that the tested side becomes profitable?

How about buying 10 straddles of a range-bound stock/ETF that is about to break-out up or down and then sell the calls/put to go back to about zero delta? Again, my task would be to build a good scan for range-bound stocks/ETFs that are about to break out.

Alternatively, I could use e.g. Bollinger bands and set up a straddle when the price is at the middle of the band and then sell options when the price reaches the lower or upper band. I would need to scan for stocks that oscillate between the upper and lower bands, as well as having bands with a decent price difference. In addition the swings should not be to far apart.


Similar threads