Олександр Янчак
Олександр Янчак личный блог
24 сентября 2014, 14:29

Опционные уровни (индикатор ThinkOrSwim)

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

Опционные уровни (индикатор ThinkOrSwim)

Ну, собственно, код:

declare lower;
input optionSeriesPrefix = ".SPY140930";
input strike = 199.0;
input strikeSpacing = 0.50;
input mode = {default volume, totalVolume, openInterest, volumePercentOI};
input totalStrikes = {default Five, Three, One};
def showThree = if mode == mode.volume and totalStrikes == totalStrikes.Three then 1 else 0;
def showFive = if mode == mode.volume and totalStrikes == totalStrikes.Five then 1 else 0;
addLabel(yes, optionSeriesPrefix, color.red);
addLabel(yes, concat(strike, «P»), color.red);
addLabel(showThree or showFive, concat(strike — strikeSpacing, «P»), color.magenta);
addLabel(showThree or showFive, concat(strike + strikeSpacing, «P»), color.orange);
addLabel(showFive, concat(strike — strikeSpacing — strikeSpacing, «P»), color.pink);
addLabel(showFive, concat(strike + strikeSpacing + strikeSpacing, «P»), color.gray);
addLabel(yes, concat(strike, «C»), color.green);
addLabel(showThree or showFive, concat(strike — strikeSpacing, «C»), color.cyan);
addLabel(showThree or showFive, concat(strike + strikeSpacing, «C»), color.blue);
addLabel(showFive, concat(strike — strikeSpacing — strikeSpacing, «C»), color.lime);
addLabel(showFive, concat(strike + strikeSpacing + strikeSpacing, «C»), color.white);

def putOptionVolume = if isNAN(volume(concat(optionSeriesPrefix,concat(«P»,strike)))) then 0 else volume(concat(optionSeriesPrefix,concat(«P»,strike)));
rec cumPutVolume = cumPutVolume[1] + putOptionVolume;
def totalputOptionVolume = volume(concat(optionSeriesPrefix,concat(«P»,strike)),«DAY»);
def putOptionOI = open_interest(concat(optionSeriesPrefix,concat(«P»,strike)),«DAY»);
def callOptionVolume = if isNAN(volume(concat(optionSeriesPrefix,concat(«C»,strike)))) then 0 else volume(concat(optionSeriesPrefix,concat(«C»,strike)));
rec cumCallVolume = cumCallVolume[1] + callOptionVolume;
def totalcallOptionVolume = volume(concat(optionSeriesPrefix,concat(«C»,strike)),«DAY»);
def callOptionOI = open_interest(concat(optionSeriesPrefix,concat(«C»,strike)),«DAY»);
def putOptionVolume1 = if isNAN(volume(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing)));
rec cumPutVolume1 = cumPutVolume1[1] + putOptionVolume1;
def totalputOptionVolume1 = volume(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing)),«DAY»);
def putOptionOI1 = open_interest(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing)),«DAY»);
def callOptionVolume1 = if isNAN(volume(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing)));
rec cumCallVolume1 = cumCallVolume1[1] + callOptionVolume1;
def totalcallOptionVolume1 = volume(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing)),«DAY»);
def callOptionOI1 = open_interest(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing)),«DAY»);
def putOptionVolume2 = if isNAN(volume(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing)));
rec cumPutVolume2 = cumPutVolume2[1] + putOptionVolume2;
def totalputOptionVolume2 = volume(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing)),«DAY»);
def putOptionOI2 = open_interest(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing)),«DAY»);
def callOptionVolume2 = if isNAN(volume(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing)));
rec cumCallVolume2 = cumCallVolume2[1] + callOptionVolume2;
def totalcallOptionVolume2 = volume(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing)),«DAY»);
def callOptionOI2 = open_interest(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing)),«DAY»);
def putOptionVolume3 = if isNAN(volume(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing-strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing-strikeSpacing)));
rec cumPutVolume3 = cumPutVolume3[1] + putOptionVolume3;
def totalputOptionVolume3 = volume(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing-strikeSpacing)),«DAY»);
def putOptionOI3 = open_interest(concat(optionSeriesPrefix,concat(«P»,strike-strikeSpacing-strikeSpacing)),«DAY»);
def callOptionVolume3 = if isNAN(volume(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing-strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing-strikeSpacing)));
rec cumCallVolume3 = cumCallVolume3[1] + callOptionVolume3;
def totalcallOptionVolume3 = volume(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing-strikeSpacing)),«DAY»);
def callOptionOI3 = open_interest(concat(optionSeriesPrefix,concat(«C»,strike-strikeSpacing-strikeSpacing)),«DAY»);
def putOptionVolume4 = if isNAN(volume(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing+strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing+strikeSpacing)));
rec cumPutVolume4 = cumPutVolume4[1] + putOptionVolume4;
def totalputOptionVolume4 = volume(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing+strikeSpacing)),«DAY»);
def putOptionOI4 = open_interest(concat(optionSeriesPrefix,concat(«P»,strike+strikeSpacing+strikeSpacing)),«DAY»);
def callOptionVolume4 = if isNAN(volume(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing+strikeSpacing)))) then 0 else volume(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing+strikeSpacing)));
rec cumCallVolume4 = cumCallVolume4[1] + callOptionVolume4;
def totalcallOptionVolume4 = volume(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing+strikeSpacing)),«DAY»);
def callOptionOI4 = open_interest(concat(optionSeriesPrefix,concat(«C»,strike+strikeSpacing+strikeSpacing)),«DAY»);
plot zero = 0;
zero.SetDefaultColor(color.white);
zero.HideTitle();
plot datap4;
plot datac4;
switch (mode){
case volume:
datap4 = -putoptionVolume4 * showFive;
datac4 = calloptionVolume4 * showFive;
case totalVolume:
datap4 = double.nan;
datac4 = double.nan;
case openInterest:
datap4 = double.nan;
datac4 = double.nan;
case volumePercentOI:
datap4 = double.nan;
datac4 = double.nan;
}
datap4.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datac4.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datap4.SetDefaultColor(color.gray);
datac4.SetDefaultColor(color.white);
datap4.SetLineWeight(3);
datac4.SetLineWeight(3);
datap4.HideTitle();
datac4.HideTitle();
datap4.HideBubble();
datac4.HideBubble();
plot datap3;
plot datac3;
switch (mode){
case volume:
datap3 = -putoptionVolume3 * showFive — putOptionVolume4 * showFive;
datac3 = calloptionVolume3 * showFive + callOptionVolume4 * showFive;
case totalVolume:
datap3 = double.nan;
datac3 = double.nan;
case openInterest:
datap3 = double.nan;
datac3 = double.nan;
case volumePercentOI:
datap3 = double.nan;
datac3 = double.nan;
}
datap3.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datac3.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datap3.SetDefaultColor(color.pink);
datac3.SetDefaultColor(color.lime);
datap3.SetLineWeight(3);
datac3.SetLineWeight(3);
datap3.HideTitle();
datac3.HideTitle();
datap3.HideBubble();
datac3.HideBubble();
plot datap2;
plot datac2;
switch (mode){
case volume:
datap2 = -putOptionVolume2 * (showThree or showFive) — putoptionVolume3 * showFive — putOptionVolume4 * showFive;
datac2 = +callOptionVolume2 * (showThree or showFive) + calloptionVolume3 * showFive + callOptionVolume4 * showFive;
case totalVolume:
datap2 = double.nan;
datac2 = double.nan;
case openInterest:
datap2 = double.nan;
datac2 = double.nan;
case volumePercentOI:
datap2 = double.nan;
datac2 = double.nan;
}
datap2.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datac2.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datap2.SetDefaultColor(color.orange);
datac2.SetDefaultColor(color.blue);
datap2.SetLineWeight(3);
datac2.SetLineWeight(3);
datap2.HideTitle();
datac2.HideTitle();
datap2.HideBubble();
datac2.HideBubble();
plot datap1;
plot datac1;
switch (mode){
case volume:
datap1 = -putOptionVolume1 * (showThree or showFive) — putOptionVolume2 * (showThree or showFive) — putoptionVolume3 * showFive — putOptionVolume4 * showFive;
datac1 = callOptionVolume1 * (showThree or showFive) + callOptionVolume2 * (showThree or showFive) + calloptionVolume3 * showFive + callOptionVolume4 * showFive;
case totalVolume:
datap1 = double.nan;
datac1 = double.nan;
case openInterest:
datap1 = double.nan;
datac1 = double.nan;
case volumePercentOI:
datap1 = double.nan;
datac1 = double.nan;
}
datap1.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datac1.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datap1.SetDefaultColor(color.magenta);
datac1.SetDefaultColor(color.cyan);
datap1.SetLineWeight(3);
datac1.SetLineWeight(3);
datap1.HideTitle();
datac1.HideTitle();
datap1.HideBubble();
datac1.HideBubble();
plot datap;
plot datac;
switch (mode){
case volume:
datap = -putoptionVolume — putOptionVolume1 * (showThree or showFive) — putOptionVolume2 * (showThree or showFive) — putoptionVolume3 * showFive — putOptionVolume4 * showFive;
datac = calloptionVolume + callOptionVolume1 * (showThree or showFive) + callOptionVolume2 * (showThree or showFive) + calloptionVolume3 * showFive + callOptionVolume4 * showFive;
case totalVolume:
datap = -totalputoptionVolume;
datac = totalcalloptionVolume;
case openInterest:
datap = -putoptionOI;
datac = callOptionOI;
case volumePercentOI:
datap = -putoptionVolume * 100 / putoptionOI;
datac = callOptionVolume * 100 / callOptionOI;
}
datap.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datac.SetPaintingStrategy(paintingStrategy.HISTOGRAM);
datap.SetDefaultColor(color.red);
datac.SetDefaultColor(color.green);
datap.SetLineWeight(3);
datac.SetLineWeight(3);
datap.HideTitle();
datac.HideTitle();
datap.HideBubble();
datac.HideBubble();

(настройки индикатора) 
 
2 Комментария
  • Русанов Андрей
    24 сентября 2014, 14:52
    А может лучше ссылку прямую на индюка?
  • Трейдер Второго легиона
    25 сентября 2017, 12:31
    Спасибо Вам, Александр! Интересный и полезный индикатор, для тех кто опционы использует, единственное жаль мало страйков затрагивает, затрагивал бы он все страйки и если бы выводил в «подвал» значения P/C ratio было бы просто замечательно! Жаль не программист и переделать будет проблематично, хотя можно попробовать! Жаль плюс поставить не могу! Только так +++++

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн