AJEET-SINGH

Option Chain

Jul 12th, 2022
647
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 28.13 KB | None | 0 0
  1.  
  2. Version( 6.3 );
  3.  
  4. /**** Options Pricing Module **********************************/
  5.  
  6. function OptionPrice( isCallFlag, S, X , T, r, iv, d )
  7. {
  8.  
  9.     local d1, d2, result;
  10.  
  11.     d1 = ( log( S / X ) + ( r - d  + ( iv * iv * 0.5 ) ) * T ) / ( iv * sqrt( T ) );
  12.     d2 = d1 - iv * sqrt( T );
  13.  
  14.     if( isCallFlag )
  15.         result = ( ( S * exp( -d * T ) *  NormDist( d1 ) ) - ( X * exp( -r * T ) * NormDist( d2 ) ) );
  16.     else
  17.         result = ( ( X * exp( -r * T ) * NormDist( -d2 ) )   - ( S * NormDist( -d1 ) * exp( -d * T ) ) );
  18.  
  19.     return result;
  20. }
  21.  
  22. function OptionDelta( isCallFlag, S, X, T, r, iv, d )
  23. {
  24.  
  25.     local d1, d2, result;
  26.  
  27.     d1 = ( log( S / X ) + ( r - d  + ( iv * iv * 0.5 ) ) * T ) / ( iv * sqrt( T ) );
  28.     d2 = d1 - iv * sqrt( T );
  29.  
  30.  
  31.     if( isCallFlag )
  32.         result = NormDist( d1 );
  33.     else
  34.         result = NormDist( d1 ) - 1;
  35.  
  36.     return result;
  37. }
  38.  
  39. function OptionGamma( S, X, T, r, iv, d )
  40. {
  41.  
  42.     local d1, d2, nd1, Pi, result;
  43.     Pi = 3.14159265358979;
  44.     d1 = ( log( S / X ) + ( r - d  + ( iv * iv * 0.5 ) ) * T ) / ( iv * sqrt( T ) );
  45.     d2 = d1 - iv * sqrt( T );
  46.     nd1 = exp( -( d1 * d1 ) / 2 ) / sqrt( 2 * Pi );
  47.  
  48.     result = nd1 / ( S * ( iv * sqrt( T ) ) );
  49.     return result;
  50. }
  51.  
  52.  
  53. function OptionTheta( isCallFlag, S, X, T, r, iv, d )
  54. {
  55.  
  56.     local d1, d2, nd1, nd2, Pi, theta, result;
  57.     Pi = 3.14159265358979;
  58.  
  59.     d1 = ( log( S / X ) + ( r - d  + ( iv * iv * 0.5 ) ) * T ) / ( iv * sqrt( T ) );
  60.     d2 = d1 - iv * sqrt( T );
  61.     nd1 = exp( -( d1 * d1 ) / 2 ) / sqrt( 2 * Pi );
  62.     nd2 = d1 - iv * sqrt( T );
  63.  
  64.  
  65.  
  66.     if( isCallFlag )
  67.     {
  68.         theta = - ( ( ( S * iv * nd1 ) / ( 2 * sqrt( T ) ) )  - ( r * X * exp( -r * T ) * nd2 ) ) ;
  69.     }
  70.     else
  71.     {
  72.         theta = - ( ( ( S * iv * nd1 ) / ( 2 * sqrt( T ) ) )  + ( r * X * exp( -r * T ) * ( 1 - nd2 ) ) ) ;
  73.     }
  74.  
  75.     /*if (T < 1 / 365)
  76.         result = theta * T  ;
  77.     else
  78.         result = theta /  365;
  79.     */
  80.     result = IIf( T < 1 / 365, theta * T, theta / 365 );
  81.     return result;
  82.  
  83.  
  84. }
  85.  
  86. function OptionVega( S, X, T, r, iv, d )
  87. {
  88.  
  89.     local d1, d2, nd1, Pi, result;
  90.     Pi = 3.14159265358979;
  91.     d1 = ( log( S / X ) + ( r - d  + ( iv * iv * 0.5 ) ) * T ) / ( iv * sqrt( T ) );
  92.     d2 = d1 - iv * sqrt( T );
  93.     nd1 = exp( -( d1 * d1 ) / 2 ) / sqrt( 2 * Pi );
  94.  
  95.     result = 0.01 * S * sqrt( T ) * nd1;
  96.     return result;
  97. }
  98.  
  99. function OptionRho( isCallFlag, S, X, T, r, iv, d )
  100. {
  101.  
  102.     local d1, d2, nd1, Pi, result;
  103.     Pi = 3.14159265358979;
  104.     d1 = ( log( S / X ) + ( r - d  + ( iv * iv * 0.5 ) ) * T ) / ( iv * sqrt( T ) );
  105.     d2 = d1 - iv * sqrt( T );
  106.     nd1 = exp( -( d1 * d1 ) / 2 ) / sqrt( 2 * Pi );
  107.  
  108.     if( iscallFlag )
  109.         result = 0.01 * X * T * exp( -r * T ) * NormDist( d2 );
  110.     else
  111.         result = - 0.01 * X * T * exp( -r * T ) * ( 1 - NormDist( d2 ) );
  112.  
  113.  
  114. }
  115.  
  116. function OptionIV( isCallFlag, S, X, T, r, mp, d )
  117. {
  118.  
  119.     local hval, lval, result;
  120.  
  121.     hval = 3;
  122.     lval = 0;
  123.  
  124.     if( isCallFlag )
  125.     {
  126.         do
  127.         {
  128.             if( OptionPrice( isCallFlag, S, X, T, r, ( hval + lval ) / 2 , d ) > mp )
  129.                 hval = ( hval + lval ) / 2;
  130.             else
  131.                 lval = ( hval + lval ) / 2;
  132.  
  133.         }
  134.         while( ( hval - lval ) > 0.0001 );
  135.  
  136.  
  137.     }
  138.     else
  139.     {
  140.         do
  141.         {
  142.             if( OptionPrice( isCallFlag, S, X, T, r, ( hval + lval ) / 2 , d ) > mp )
  143.                 hval = ( hval + lval ) / 2;
  144.             else
  145.                 lval = ( hval + lval ) / 2;
  146.  
  147.         }
  148.         while( ( hval - lval ) > 0.0001 ) ;
  149.  
  150.     }
  151.  
  152.     result = ( hval + lval ) / 2;
  153.     return result;
  154.  
  155. }
  156.  
  157. function OptionProb( isCallFlag, x, s , t, iv )
  158. {
  159.  
  160.     if( isCallFlag )
  161.         result = Prec( 1 - NormDist( ( ln( x / s ) / ( iv * sqrt( t / 365 ) ) ) ), 3 );
  162.     else
  163.         result = Prec( NormDist( ( ln( x / s ) / ( iv * sqrt( t / 365 ) ) ) ), 3 );
  164.  
  165.     return result;
  166. }
  167. /**************** End of Options Pricing *****************************************/
  168.  
  169. /***************Options Symbols *******************************/
  170. global vDataProviderList;
  171. vDataProviderList = "FlashTrader|TrueData|AccelPix|AmiFeed|AmiLiveData|AmiFeeder|BestRTNex|NSEEOD|GDFL";
  172.  
  173. function getDateString( vdp, vdt, vWflag )
  174. {
  175.     vy  = DateTimeFormat( "%y", vdt );
  176.     vd  = DateTimeFormat( "%d", vdt );
  177.     vm1 = DateTimeFormat( "%m", vdt );
  178.     vm2 = StrToUpper( DateTimeFormat( "%b", vdt ) );
  179.     vm = "";
  180.     vdate = vd + "-" + DateTimeFormat( "%b", vdt ) + "-" + DateTimeFormat( "%Y", vdt );
  181.     vdateVbiz = vd + DateTimeFormat( "%b", vdt ) + DateTimeFormat( "%Y", vdt );
  182.     result = "Null";
  183.  
  184.     if( StrMatch( "FlashTrader", vdp ) )
  185.     {
  186.         if( StrToNum( vm1 ) <= 9 ) vm = StrRight( vm1, 1 );
  187.         else vm = StrLeft( vm2, 1 );
  188.  
  189.         if( vWflag ) result = vy + vm + vd;
  190.         else result = vy + vm2;
  191.     }
  192.  
  193.     if( StrMatch( "TrueData", vdp ) )
  194.     {
  195.         if( StrToNum( vm1 ) <= 9 ) vm = StrRight( vm1, 1 );
  196.         else vm = StrLeft( vm2, 1 );
  197.  
  198.         if( vWflag ) result = vy + vm + vd;
  199.         else result = vy + vm2;
  200.     }
  201.     else
  202.         if( StrMatch( "AccelPix", vdp ) )
  203.         {
  204.             if( vWFlag ) result = vd + vm2 + vy;
  205.             else result = vm2 + vy;
  206.  
  207.         }
  208.         else
  209.             if( StrMatch( "AmiFeed", vdp ) )
  210.             {
  211.                 if( vWFlag ) result = "WK";
  212.                 else result = "";
  213.             }
  214.             else
  215.                 if( StrMatch( "NSEEOD", vdp ) )
  216.                 {
  217.                     result = vdate;
  218.                 }
  219.                 else
  220.                     if( StrMatch( "VBIZ", vdp ) )
  221.                     {
  222.                         if( vWFlag ) result = vdatevbiz;
  223.                         else result = "-I";
  224.                     }
  225.                     else
  226.                         if( StrMatch( "GDFL", vdp ) )
  227.                         {
  228.                             result = vd + vm2 + vy;
  229.  
  230.                         }
  231.                         else
  232.                             if( StrMatch( "BestRTNex", vdp ) )
  233.                             {
  234.                                 result = vd + vm2 + DateTimeFormat( "%Y", vdt );
  235.                             }
  236.  
  237.     return result;
  238. }
  239.  
  240. function getoptionsymbol( vdp, vdt, vWFlag, vInst, vstrike, vCP )
  241. {
  242.     if( StrMatch( "TrueData", vdp ) )
  243.         result = vInst + getDateString( vdp, vdt, vWFlag ) + vstrike + vCP;
  244.     else
  245.         if( StrMatch( "FlashTrader", vdp ) )
  246.             result = vInst + getDateString( vdp, vdt, vWFlag ) + vstrike + vCP;
  247.         else
  248.             if( StrMatch( "AccelPix", vdp ) )
  249.                 result = vInst + vstrike + getDateString( vdp, vdt, vWFlag ) + vCP ;
  250.             else
  251.                 if( StrMatch( "AmiFeed", vdp ) )
  252.                     result = vInst + getDateString( vdp, vdt, vWFlag ) + vstrike + vCP;
  253.                 else
  254.                     if( StrMatch( "NSEEOD", vdp ) )
  255.                         result = vInst + "_" + getDateString( vdp, vdt, vWFlag ) + "_" + vstrike + "-" + vCP;
  256.                     else
  257.                         if( StrMatch( "BestRTNex", vdp ) )
  258.                             result = vInst + "_" + vstrike + vCP + "-" + getDateString( vdp, vdt, vWFlag );
  259.                         else
  260.                             if( StrMatch( "AmiLiveData", vdp ) )
  261.                                 result = vInst + vCP + vstrike ;
  262.                             else
  263.                                 if( StrMatch( "AmiFeeder", vdp ) OR StrMatch( "ValueRT", vdp ) )
  264.                                     result = vInst + WriteIf( vWFlag, "WK", "" ) + vstrike + StrLeft( vCP, 1 ) + "-I" ;
  265.                                 else
  266.                                     if( StrMatch( "GDFL", vdp ) )
  267.                                         result = vInst + getDateString( vdp, vdt, vWFlag ) + vstrike + vCP + ".NFO" ;
  268.  
  269.     return result;
  270. }
  271.  
  272. function getUnderlyingSymbol( vFSymbol )
  273. {
  274.     vUSymbol = StrReplace( vFSymbol, "-III.NFO", "" );
  275.     vUSymbol = StrReplace( vUSymbol, "JAN", "" );
  276.     vUSymbol = StrReplace( vUSymbol, "FEB", "" );
  277.     vUSymbol = StrReplace( vUSymbol, "MAR", "" );
  278.     vUSymbol = StrReplace( vUSymbol, "APR", "" );
  279.     vUSymbol = StrReplace( vUSymbol, "MAY", "" );
  280.     vUSymbol = StrReplace( vUSymbol, "JUN", "" );
  281.     vUSymbol = StrReplace( vUSymbol, "JUL", "" );
  282.     vUSymbol = StrReplace( vUSymbol, "AUG", "" );
  283.     vUSymbol = StrReplace( vUSymbol, "SEP", "" );
  284.     vUSymbol = StrReplace( vUSymbol, "OCT", "" );
  285.     vUSymbol = StrReplace( vUSymbol, "NOV", "" );
  286.     vUSymbol = StrReplace( vUSymbol, "DEC", "" );
  287.     vUSymbol = StrReplace( vUSymbol, "FUT", "" );
  288.     vUSymbol = StrReplace( vUSymbol, "23", "" );
  289.     vUSymbol = StrReplace( vUSymbol, "22", "" );
  290.     vUSymbol = StrReplace( vUSymbol, "-II.NFO", "" );
  291.     vUSymbol = StrReplace( vUSymbol, "-I.NFO", "" );
  292.     vUSymbol = StrReplace( vUSymbol, "-FUT", "" );
  293.     vUSymbol = StrReplace( vUSymbol, "-III", "" );
  294.     vUSymbol = StrReplace( vUSymbol, "-II", "" );
  295.     vUSymbol = StrReplace( vUSymbol, "-I", "" );
  296.     vUSymbol = StrReplace( vUSymbol, "_III", "" );
  297.     vUSymbol = StrReplace( vUSymbol, "_II", "" );
  298.     vUSymbol = StrReplace( vUSymbol, "_I", "" );
  299.     vUSymbol = StrReplace( vUSymbol, "-F1", "" );
  300.     vUSymbol = StrReplace( vUSymbol, "-1", "" );
  301.     vUSymbol = StrReplace( vUSymbol, "-2", "" );
  302.     vUSymbol = StrReplace( vUSymbol, "-3", "" );
  303.     vUSymbol = StrReplace( vUSymbol, "-4", "" );
  304.     vUSymbol = StrReplace( vUSymbol, "-5", "" );
  305.     vUSymbol = StrReplace( vUSymbol, "-6", "" );
  306.     vUSymbol = StrReplace( vUSymbol, "-7", "" );
  307.     vUSymbol = StrReplace( vUSymbol, "-8", "" );
  308.     vUSymbol = StrReplace( vUSymbol, "-9", "" );
  309.     return vUSymbol;
  310. }
  311.  
  312.  
  313. /***********************End of OptionsSymbols****************************/
  314.  
  315. //Options Chain
  316.  
  317. SetChartOptions( 1, chartDisableTooltips | chartHideQuoteMarker );
  318.  
  319. GfxSetOverlayMode( 2 ); //No Axis
  320. SetChartBkColor( colorWhite );
  321. GfxSetBkMode( 1 );
  322.  
  323. pxheight = Status( "pxheight" );
  324. pxwidth = Status( "pxwidth" );
  325. pxcenter = pxwidth / 2;
  326.  
  327.  
  328. vCFW = pxwidth / 1829 ;
  329. vCFH = pxheight / 807 ;
  330.  
  331. vCFW = Param("Adjust Width",.71,.5,1.5,.01)  ;
  332. vCFH = Param("Adjust Height",.9,.5,1.5,.01) ;
  333.  
  334.  
  335.  
  336. CellHeight = 21 * vCFH;
  337. CellWidth = 65  * vCFW;
  338. vRowOffset = 4;
  339. vNumberofCols = 24;
  340.  
  341. vCellWidth = 0;
  342. vCCellWidth = 0;
  343.  
  344.  
  345. vCellWidth[0]  = 100 * vCFW;   //Blank column
  346. vCellWidth[1]  = 70 * vCFW;   //Straddle Price
  347. vCellWidth[2]  = 50 * vCFW;   //IV
  348. vCellWidth[3]  = 60 * vCFW;   //Vega
  349. vCellWidth[4]  = 60 * vCFW;   //Theta
  350. vCellWidth[5]  = 50 * vCFW;   //Delta
  351. vCellWidth[6]  = 65 * vCFW;   //TVWAP
  352. vCellWidth[7]  = 65 * vCFW;   //VWAP
  353. vCellWidth[8]  = 70 * vCFW;   //OI Chng%
  354. vCellWidth[9]  = 90 * vCFW;   //OI Chng
  355. vCellWidth[10]  = 95 * vCFW;   //OI
  356. vCellWidth[11] = 65 * vCFW;   //LTP
  357. vCellWidth[12] = 65 * vCFW;   //Strike
  358. vCellWidth[13] = 65 * vCFW;   //LTP
  359. vCellWidth[14] = 90 * vCFW;   //OI
  360. vCellWidth[15] = 95 * vCFW;   //OI Chg
  361. vCellWidth[16] = 70 * vCFW;   //OI Chg%
  362. vCellWidth[17] = 65 * vCFW;   //VWAP
  363. vCellWidth[18] = 65 * vCFW;   //TVWAP
  364. vCellWidth[19] = 50 * vCFW;   //Delta
  365. vCellWidth[20] = 60 * vCFW;   //Theta
  366. vCellWidth[21] = 60 * vCFW;   //Theta
  367. vCellWidth[22] = 60 * vCFW;   //Vega
  368. vCellWidth[23] = 70 * vCFW;   //Implied Futures
  369. vCellWidth[24] = 55 * vCFW;   //PCR
  370.  
  371. for( i = 1; i <= vNumberOfCols ; i++ )
  372. {
  373.     vCCellWidth[i] = vCCellWidth[i - 1] + vCellWidth[i - 1];
  374. }
  375.  
  376. function PrintInCell( string, row, Col, vformat )
  377. {
  378.     GfxDrawText( string, vCCellWidth[Col] , ( row + vRowOffset ) * CellHeight  , vCCellWidth[Col] + vCellWidth[Col], ( row + 1 + vRowOffset ) * CellHeight, vformat );
  379. }
  380.  
  381. function FillCell( row, Col, vColor )
  382. {
  383.     GfxFillSolidRect( vCCellWidth[Col] , ( row + vRowOffset ) * CellHeight  , vCCellWidth[Col] + vCellWidth[Col], ( row + 1 + vRowOffset ) * CellHeight, vColor );
  384. }
  385.  
  386. vRCellWidth  = 255 * vCFW;
  387. vRcellheight = 50 * vCFH;
  388. function PrintInRibbon( string, row, Col , vf )
  389. {
  390.     GfxDrawText( string, Col * vRCellWidth, row * vRCellHeight, ( Col + 1 ) * vRCellWidth, ( row + 1 ) * vRCellHeight, vf );
  391. }
  392.  
  393. vABVersion = 0;
  394. vImpliedFutures = 1;
  395. //Parameters
  396.  
  397.  
  398. vDataProvider  = ParamList( "DataProvider", vDataproviderList, 0 );
  399. vNumberofStrikes    = Param( "# of Strikes +/- ATM", 10, 5, 15, 1 );
  400. vStrikeRange = Param( "Strike Multiple", 50, 1, 10000, 1 );
  401. vExpiryDate = ParamDate( "Expiry Date", "2020-01-01", 2 );
  402. vWeekly = ParamToggle( "Weekly/Monthly", "Monthly|Weekly", 0 );
  403. //vFNOSuffix  = ParamStr("FNO Symbol Suffix" ,"-I");
  404. vATMStrikeColor = ParamColor( "ATM Strike Color", colorRose );
  405. vFontWeight = Param( "Font Weight", 44, 10, 100, 1 );
  406.  
  407. //Variables
  408. //vSymbol     = StrReplace(Name(),vFNOSuffix,"");
  409. vSymbol = getUnderlyingSymbol( Name() );
  410. _TRACE( vSymbol );
  411. vCallStrike  = vPutStrike = "";
  412. vATMStrike   = 0;
  413. vTotalCallOI = 0;
  414. vTotalPutOI = 0;
  415. vDTE = 0;
  416. vUnderlyingPrice = 0;
  417.  
  418.  
  419. Bars_so_far_today = 1 + BarsSince( Day() != Ref( Day(), -1 ) );
  420. StartBar = ValueWhen( TimeNum() == 091500, BarIndex() );
  421. vNewDay = Day() != Ref( Day(), -1 );
  422.  
  423. vSpot = vPSpot = 0;
  424. vUnderlyingPrice = LastValue( C ) ; // Pick the last close price in the data
  425.  
  426. vPUnderlyingPrice = LastValue( Ref( Close, -( BarsSince( vNewDay ) + 1 ) ) );
  427.  
  428.  
  429. if( SetForeign( vSymbol ) )
  430. {
  431.     vSpot  = LastValue( C );
  432.     vPSpot = LastValue( Ref( Close, -( BarsSince( vNewDay ) + 1 ) ) );
  433.     RestorePriceArrays();
  434. }
  435. else
  436. {
  437.     if( StrMatch( "FlashTrader", vDataProvider ) )
  438.     {
  439.         if( StrMatch( vSymbol, "NIFTY" ) )
  440.             vSymbol1 = "NIFTY 50";
  441.         else
  442.             if( StrMatch( vSymbol, "BANKNIFTY" ) )
  443.                 vSymbol1 = "NIFTY BANK";
  444.  
  445.         if( SetForeign( vSymbol1 ) )
  446.         {
  447.             vSpot  = LastValue( C );
  448.             vPSpot = LastValue( TimeFrameGetPrice( "C", inDaily, -1 ) );
  449.             RestorePriceArrays();
  450.         }
  451.     }
  452.  
  453.     if( StrMatch( "NSEEOD", vDataProvider ) )
  454.     {
  455.         vSymbol1 = "";
  456.  
  457.         if( StrMatch( vSymbol, "NIFTY" ) )
  458.             vSymbol1 = "NIFTY 50";
  459.         else
  460.             if( StrMatch( vSymbol, "BANKNIFTY" ) )
  461.                 vSymbol1 = "NIFTY BANK";
  462.  
  463.         if( SetForeign( vSymbol1 ) )
  464.         {
  465.             vSpot  = LastValue( C );
  466.             vPSpot = LastValue( Ref( Close, -( BarsSince( vNewDay ) + 1 ) ) );
  467.             RestorePriceArrays();
  468.         }
  469.  
  470.  
  471.     }
  472.  
  473.     if( StrMatch( "GDFL", vDataProvider ) )
  474.     {
  475.         if( StrMatch( vSymbol, "NIFTY" ) )
  476.             vSymbol1 = "NIFTY 50.NSE_IDX";
  477.         else
  478.             if( StrMatch( vSymbol, "BANKNIFTY" ) )
  479.                 vSymbol1 = "NIFTY BANK.NSE_IDX";
  480.  
  481.         if( SetForeign( vSymbol1 ) )
  482.         {
  483.             vSpot  = LastValue( C );
  484.             vPSpot = LastValue( Ref( Close, -( BarsSince( vNewDay ) + 1 ) ) );
  485.             RestorePriceArrays();
  486.         }
  487.  
  488.  
  489.     }
  490.  
  491.  
  492. }
  493.  
  494. vPVix = vVix = 0;
  495.  
  496. if( SetForeign( "IndiaVix" ) )
  497. {
  498.     vVix  = LastValue( C );
  499.     vPVix = LastValue( TimeFrameGetPrice( "C", inDaily, -1 ) );
  500.     RestorePriceArrays();
  501. }
  502. else
  503.     if( SetForeign( "India Vix" ) )
  504.     {
  505.         vVix  = LastValue( C );
  506.         vPVix = LastValue( TimeFrameGetPrice( "C", inDaily, -1 ) );
  507.         RestorePriceArrays();
  508.     }
  509.     else
  510.         if( SetForeign( "India Vix.NSE_IDX" ) )
  511.         {
  512.             vVix  = LastValue( C );
  513.             vPVix = LastValue( TimeFrameGetPrice( "C", inDaily, -1 ) );
  514.             RestorePriceArrays();
  515.         }
  516.  
  517.  
  518. vUPriceChange       = vUnderlyingPrice - vPUnderlyingPrice;
  519. vUPriceChangePct = ( vUnderlyingPrice - vPUnderlyingPrice ) * 100 / vPUnderlyingPrice;
  520.  
  521. vSPriceChange       = vSpot - vPSpot;
  522. vSPriceChangePct = ( vSpot - vPSpot ) * 100 / vPSpot;
  523.  
  524. vVPriceChange       = vVix - vPVix;
  525. vVPriceChangePct  = vVix - vPVix * 100 /  vPVix;
  526.  
  527.  
  528. TodayVolume = Sum( V, Bars_so_far_today );
  529. vUVWAP =  LastValue( IIf( BarIndex() >= StartBar, Sum( C * V, Bars_so_far_today ) / TodayVolume, 0 ) );
  530.  
  531.  
  532. vATMStrike = Round( vUnderlyingPrice / vStrikeRange ) * vStrikeRange;
  533. vAtmCall = getOptionSymbol( vDataProvider, vExpiryDate, vWeekly, vSymbol, NumToStr( vATMStrike, 1.0, False ), "CE" ) ;
  534. vAtmPut = getOptionSymbol( vDataProvider, vExpiryDate, vWeekly, vSymbol, NumToStr( vATMStrike, 1.0, False ), "PE" );
  535. vATMCPrice = LastValue( Foreign( vATMCall, "C" ) );
  536. vATMPPrice = LastValue( Foreign( vATMPut, "C" ) );
  537. vImpliedFutPrice = vATMStrike + vATMCPrice - vATMPPrice;
  538.  
  539. vATMStrike = Round( vImpliedFutPrice / vStrikeRange ) * vStrikeRange;
  540.  
  541. _TRACEF( NumToStr( pxheight ) );
  542. _TRACEF( NumToStr( pxwidth ) );
  543.  
  544. GfxSetTextColor( colorBlack );
  545. GfxSetBkColor( colorBlack );
  546. GfxSelectPen( colorBlack );
  547.  
  548.  
  549. //GfxSelectFont( "Arial",cellheight * (vFontWeight + 10 ) / 100 ,500);
  550. GfxSelectFont( "Segoe UI SemiBold", cellheight * ( vFontWeight + 10 ) / 100 , 500 );
  551.  
  552. PrintInCell( "Calls", 0, 7, 1 );
  553. PrintInCell( "Puts", 0, 17, 1 );
  554. vFillColor = colorGold;
  555.  
  556. for( x = 1 ; x <= vNumberOfCols ; x++ )
  557. {
  558.     FillCell( 1, x, vFillColor );
  559. }
  560.  
  561. GfxSetTextColor( colorBlack );
  562. GfxSelectFont( "Segoe UI", Cellheight * ( vFontWeight / 100 ) , 600 );
  563.  
  564.  
  565. PrintInCell( "Straddle", 1, 1, 2 );
  566. PrintInCell( "IV", 1, 2, 2 );
  567. PrintInCell( "Vega", 1, 3, 2 );
  568. PrintInCell( "Theta", 1, 4, 2 );
  569. PrintInCell( "Delta", 1, 5, 2 );
  570. PrintInCell( "Gamma", 1, 6, 2 );
  571. PrintInCell( "VWAP", 1, 7, 2 );
  572. PrintInCell( "Chg%", 1, 8, 2 );
  573. PrintInCell( "OI-Chg", 1, 9, 2 );
  574. PrintInCell( "OI", 1, 10, 2 );
  575. PrintInCell( "LTP", 1, 11, 2 );
  576. PrintInCell( "Strike", 1, 12, 2 );
  577. PrintInCell( "LTP", 1, 13, 2 );
  578. PrintInCell( "OI", 1, 14, 2 );
  579. PrintInCell( "OI-Chg", 1, 15, 2 );
  580. PrintInCell( "Chg%", 1, 16, 2 );
  581. PrintInCell( "VWAP", 1, 17, 2 );
  582. PrintInCell( "Gamma", 1, 18, 2 );
  583. PrintInCell( "Delta", 1, 19, 2 );
  584. PrintInCell( "Theta", 1, 20, 2 );
  585. PrintInCell( "Vega", 1, 21, 2 );
  586. PrintInCell( "IV", 1, 22, 2 );
  587. PrintInCell( "Imp.Fut", 1, 23, 2 );
  588. PrintInCell( "PCR", 1, 24, 2 );
  589.  
  590. vDTE = Max( 0, ( DateTimeDiff( vExpiryDate , LastValue( DateTime() ) ) - ( 7.5 * 60 * 60 ) ) / ( 365 * 24 * 60 * 60 ) );     //Since Expiry is at 3:30Pm subtract 7.5 hours
  591.  
  592. vRcellheight = 50;
  593. GfxSelectFont( "Impact", vRcellHeight * ( vFontWeight / 110 ), 0, 0 );
  594.  
  595.  
  596. if( vWeekly ) vExpiryString = DateTimeToStr( vExpiryDate, 1 ) + "W";
  597. else vExpiryString = DateTimeToStr( vExpiryDate, 1 ) + "M";
  598.  
  599. //Ribbon First Row
  600. PrintInRibbon( NumToStr( vUnderlyingPrice, 1.2 ), 0, 0, 2 );
  601. PrintInRibbon( NumToStr( vUVWAP, 1.2 ), 0, 1, 2 );
  602. PrintInRibbon( NumToStr( vSpot, 1.2 ), 0, 2, 2 );
  603. PrintInRibbon( NumToStr( vVix, 1.2 ), 0, 4, 1 );
  604. PrintInRibbon( vExpiryString, 0, 5, 2 );
  605. PrintInRibbon( NumToStr( vDTE * 365, 1.2 ), 0, 6, 2 );
  606.  
  607. //Ribbon Second Row
  608. //GfxSelectFont( "Segoe UI",vRcellHeight * (vFontWeight / 200) );
  609. GfxSelectFont( "Segoe UI Semibold", vRcellHeight * ( vFontWeight / 200 ) );
  610. PrintInRibbon( NumToStr( vUPriceChange, 1.2 ) + "(" + NumToStr( vUPriceChangePCT, 1.2 ) + "%)" + "  ", 1, 0, 2 | 0 );
  611. PrintInRibbon( "VWAP" + "  ", 1, 1, 2 | 0 );
  612. PrintInRibbon( NumToStr( vSPriceChange, 1.2 ) + "(" + NumToStr( vSPriceChangePCT, 1.2 ) + "%)" + " Spot", 1, 2, 2 | 0 );
  613. PrintInRibbon( "Max Pain" + "  ", 1, 3, 2 | 0 );
  614. PrintInRibbon( NumToStr( vVPriceChange, 1.2 ) + "(" + NumToStr( vVPriceChangePCT, 1.2 ) + "%)" + " Vix", 1, 4, 2 | 1 );
  615. PrintInRibbon( "Expiry Date" + "  ", 1, 5, 2 | 0 );
  616. PrintInRibbon( "DTE" + "  ", 1, 6, 2 | 0 );
  617.  
  618.  
  619. vR = 0;
  620. vD = 0;
  621.  
  622. vCLtp = vPLtp = 0;
  623. vCallOI = vPutOI = vCPOI = vPPOI = vCOIC = vPOIC = vPCR = vCallGLS = vCallGLD = vPutGLS = vPutGLD = 0;
  624.  
  625. for( i = ( vNumberofStrikes * -1 ) ; i <= vNumberofStrikes; i++ )
  626. {
  627.     vOptionStrike = NumToStr( vATMStrike + ( i * vStrikeRange ), 1.0, False );
  628.  
  629.     vCallStrike = getOptionSymbol( vDataProvider, vExpiryDate, vWeekly, vSymbol, vOptionStrike, "CE" );
  630.     vPutStrike = getOptionSymbol( vDataProvider, vExpiryDate, vWeekly, vSymbol, vOptionStrike, "PE" );
  631.     vPrice = vOpen = vHigh = vLow = vVWAP = vPVWAP = vPDH = vPHL = vPDC = vStraddle = vImpFutOfStrike = 0;
  632.  
  633.  
  634.     vRow = ( i * -1 ) + vNumberOfStrikes + 2;
  635.     vARow = i + vNumberOfStrikes;
  636.  
  637.     if( SetForeign( vCallStrike ) )
  638.     {
  639.         vCPOI[vARow] = LastValue( Ref( OI, -( BarsSince( vNewDay ) + 1 ) ) );
  640.         vLTP  = vCLtp[vARow]  = LastValue( C );
  641.         vCallOI[vARow] = LastValue( OI );
  642.         vCOIC[vARow] = vCallOI[vARow] - vCPOI[vARow];
  643.         vExtrinsic = vLTP - Max( vSpot - StrToNum( vOptionStrike ), 0 );
  644.         vFirstBarHigh = LastValue( Ref( H, -1 * ( Bars_so_far_today - 1 ) ) );
  645.         vFirstBarLow  = LastValue( Ref( L, -1 * ( Bars_so_far_today - 1 ) ) );
  646.         vPVWAP = vVWAP = vVWAPa = vPVWAPa = 0;
  647.         TodayVolume = Sum( V, Bars_so_far_today );
  648.         vVWAPa =  IIf( BarIndex() >= StartBar, Sum( ( ( C + H + L ) / 3 ) * V, Bars_so_far_today ) / TodayVolume, 0 );
  649.         vPVWAPa = ValueWhen( vNewDay == True, Ref( vVWAPa, -1 ), 1 );
  650.         vTotalVolume = Cum( V );
  651.         vTVWAPa = Cum( ( ( C + H + L ) / 3 ) * V ) / vTotalVolume;
  652.  
  653.         vVWAP   = LastValue( vVWAPa );
  654.         vPVWAP  = LastValue( vPVWAPa );
  655.         vTVWAP  = LastValue( vTVWAPa );
  656.         vCallGLS[vARow] = ( vTVWAP - vLTP ) * vCallOI[vARow];
  657.         vCallGLD[vARow] = ( vVWAP  - vLTP ) * vCallOI[vARow];
  658.  
  659.  
  660.         if( i == 0 ) GfxSetTextColor( vATMStrikeColor );
  661.         else GfxSetTextColor( colorBlack );
  662.  
  663.  
  664.         vCallIV = OptionIV( 1, vImpliedFutPrice, StrToNum( vOptionStrike ), LastValue( vDTE ), vR, vLTP, vD );
  665.         vCallVega  = OptionVega( vImpliedFutPrice, StrToNum( vOptionStrike ), LastValue( vDTE ), vR, vCallIV, vD );
  666.         vCallDelta  = OptionDelta( 1, vImpliedFutPrice, StrToNum( vOptionStrike ), LastValue( vDTE ), vR, vCallIV, vD );
  667.         vCallTheta  = OptionTheta( 1, vImpliedFutPrice, StrToNum( vOptionStrike ), LastValue( vDTE ), vR, vCallIV, vD );
  668.         vCallGamma = OptionGamma( vImpliedFutPrice, StrToNum( vOptionStrike ), vDTE, vR, vCallIV, vD );
  669.  
  670.         vCallLTP   = OptionPrice( 1, vImpliedFutPrice, vATMStrike, LastValue( vDTE ), vR, vCallIV, vD );
  671.  
  672.         vFillColor = IIf( vLTP > vVWAP, colorBrightGreen, colorRed );
  673.         FillCell( vRow, 7, vFillColor ); //VWAP Color
  674.  
  675.  
  676.         GfxSelectFont( "Segoe UI", Cellheight * ( vFontWeight / 100 ) );
  677.         PrintInCell( NumToStr( LastValue( vCallIV ) * 100, 1.2 ), vRow , 2, 2 );
  678.         PrintInCell( NumToStr( vCallVega, 1.2 ), vRow, 3 , 2 );
  679.         PrintInCell( NumToStr( vCallTheta, 1.2 ), vRow, 4 , 2 );
  680.         PrintInCell( NumToStr( vCallDelta, 1.2 ), vRow, 5, 2 );
  681.         PrintInCell( NumToStr( vCallGamma, 1.5 ), vRow , 6, 2 );
  682.         PrintInCell( NumToStr( vVWAP , 1.2 ), vRow , 7, 2 );
  683.         PrintInCell( NumToStr( vCOIC[vARow]  * 100 / vCPOI[vARow] , 1.2 ), vRow, 8, 2 );
  684.         PrintInCell( NumToStr( vCOIC[vARow], 1.0 ), vRow, 9, 2 );
  685.         PrintInCell( NumToStr( vCallOI[vArow], 1.0 ), vRow, 10, 2 );
  686.         PrintInCell( NumToStr( vLTP, 1.2 ), vRow , 11, 2 );
  687.  
  688.         RestorePriceArrays();
  689.     }
  690.  
  691.  
  692.  
  693.     if( SetForeign( vPutStrike ) )
  694.     {
  695.  
  696.         vPPOI[vARow] = LastValue( Ref( OI, -( BarsSince( vNewDay ) + 1 ) ) );
  697.         vLTP  = vPLtp[vARow] = LastValue( C );
  698.         vPutOI[vARow] = LastValue( OI );
  699.         vPOIC[vARow] = vPutOI[vARow] - vPPOI[vARow];
  700.         vFirstBarHigh = LastValue( Ref( H, -1 * ( Bars_so_far_today - 1 ) ) );
  701.         vFirstBarLow  = LastValue( Ref( L, -1 * ( Bars_so_far_today - 1 ) ) );
  702.         TodayVolume = Sum( V, Bars_so_far_today );
  703.         vPVWAP = vVWAP = vVWAPa = vPVWAPa = 0;
  704.         vVWAPa =  IIf( BarIndex() >= StartBar, Sum( ( ( C + H + L ) / 3 ) * V, Bars_so_far_today ) / TodayVolume, 0 );
  705.         vPVWAPa = ValueWhen( vNewDay == True, Ref( vVWAPa, -1 ), 1 );
  706.         vExtrinsic = vLTP - Max( StrToNum( vOptionStrike ) - vSpot , 0 );
  707.         vTotalVolume = Cum( V );
  708.         vTVWAPa = Cum( ( ( C + H + L ) / 3 ) * V ) / vTotalVolume;
  709.         vVWAP   = LastValue( vVWAPa );
  710.         vPVWAP  = LastValue( vPVWAPa );
  711.         vTVWAP  = LastValue( vTVWAPa );
  712.         vPutGLS[vARow] = ( vTVWAP - vLTP ) * vPutOI[vARow];
  713.         vPutGLD[vARow] = ( vVWAP - vLTP ) * vPutOI[vARow];
  714.  
  715.         vTrend = "NoTrend";
  716.         vTrendColor = 0;
  717.         vTrendPen = colorBlack;
  718.  
  719.         if( i == 0 ) GfxSetTextColor( vATMStrikeColor );
  720.         else GfxSetTextColor( colorBlack );
  721.  
  722.         vPutIV = OptionIV( 0, vImpliedFutPrice, StrToNum( vOptionStrike ), vDTE, vR, vLTP, vD );
  723.         vPutVega  = OptionVega( vImpliedFutPrice, StrToNum( vOptionStrike ), LastValue( vDTE ), vR, vPutIV, vD );
  724.         vPutDelta  = OptionDelta( 0, vImpliedFutPrice, StrToNum( vOptionStrike ), vDTE, vR, vPutIV, vD );
  725.         vPutTheta  = OptionTheta( 0, vImpliedFutPrice, StrToNum( vOptionStrike ), vDTE, vR, vPutIV, vD );
  726.         vPutGamma = OptionGamma( vImpliedFutPrice, StrToNum( vOptionStrike ), vDTE, vR, vPutIV, vD );
  727.  
  728.  
  729.         vFillColor = IIf( vLTP > vVWAP, colorBrightGreen, colorRed );
  730.         FillCell( vRow, 17, vFillColor ); //VWAP Color
  731.  
  732.         vPCR[vARow] =  abs( 1 - ( vPutOI[vARow] / vCallOI[vARow] ) )  ;
  733.         PrintInCell( NumToStr( vLTP, 1.2 ), vRow , 13, 2 );
  734.         PrintInCell( NumToStr( vPutOI[vARow], 1.0 ), vRow, 14, 2 );
  735.         PrintInCell( NumToStr( vPOIC[vARow], 1.0 ), vRow, 15, 2 );
  736.         PrintInCell( NumToStr( vPOIC[vARow] * 100 / vPPOI[vARow], 1.2 ), vRow, 16, 2 );
  737.         PrintInCell( NumToStr( vVWAP , 1.2 ), vRow , 17, 2 );
  738.         PrintInCell( NumToStr( vPutGamma, 1.5 ), vRow , 18, 2 );
  739.         PrintInCell( NumToStr( vPutDelta, 1.2 ), vRow, 19 , 2 );
  740.         PrintInCell( NumToStr( vPutTheta, 1.2 ), vRow, 20 , 2 );
  741.         PrintInCell( NumToStr( vPutVega, 1.2 ), vRow, 21 , 2 );
  742.         PrintInCell( NumToStr( LastValue( vPutIV ) * 100, 1.2 ), vRow, 22, 2 );
  743.         PrintInCell( NumToStr( vPutOI[vARow] / vCallOI[vArow], 1.2 ), vRow, 24, 2 );
  744.  
  745.  
  746.         if( i == 0 ) GfxSetTextColor( vATMStrikeColor );
  747.         else GfxSetTextColor( colorBlack );
  748.  
  749.         RestorePriceArrays();
  750.  
  751.     }
  752.  
  753.     vStraddle = vCLtp[vARow] + vPLtp[vARow];
  754.     vImpFutOfStrike = StrToNum( vOptionStrike ) + vCLtp[vARow] - vPLtp[vARow];
  755.  
  756.     if( i != 0 ) GfxSetTextColor( colorBlack );
  757.  
  758.     PrintInCell( vOptionStrike, vRow , 12, 2 );
  759.     PrintInCell( NumToStr( vStraddle, 1.0 ), vRow , 1, 2 );
  760.     PrintInCell( NumToStr( vImpFutOfStrike, 1.0 ), vRow , 23, 2 );
  761.  
  762.  
  763. }
  764.  
  765. vMaxE = ( vNumberOfStrikes * 2 ) - 1 ;
  766. vCallOIs = Sort( vCallOI, 0, vMaxE, True );
  767. vCOICs   = Sort( abs( vCOIC ), 0, vMaxE, True );
  768. vPutOIs  = Sort( vPutOI, 0, vMaxE, True );
  769. vPOICs   = Sort( abs( vPOIC ), 0, vMaxE, True );
  770. vPCRs    = Sort( vPCR, 0, vMaxE, True );
  771.  
  772. vMaxPainStrike = vATMStrike + ( ( vPCRs[0] - vNumberofStrikes ) * vStrikeRange ) ;
  773.  
  774. vFillColor = colorGold;
  775.  
  776. for( x = 1 ; x <= vNumberOfCols ; x++ )
  777. {
  778.     FillCell( vNumberofStrikes * 2 + 3, x, vFillColor );
  779. }
  780.  
  781. GfxSetTextColor( colorBlack );
  782. GfxSelectFont( "Segoe UI", cellheight * ( vFontWeight / 100 ), 600 );
  783.  
  784. PrintInCell( NumToStr( Cum( vCOIC ) * 100 / Cum( vCPOI ), 1.2 ), vNumberofStrikes * 2 + 3, 8, 2 );
  785. PrintInCell( NumToStr( Cum( vCOIC ), 1 ), vNumberofStrikes * 2 + 3, 9, 2 );
  786. PrintInCell( NumToStr( Cum( vCallOI ), 1 ), vNumberofStrikes * 2 + 3, 10, 2 );
  787. PrintInCell( "Total", vNumberofStrikes * 2 + 3 , 12, 2 );
  788. PrintInCell( NumToStr( Cum( vPutOI ), 1 ), vNumberofStrikes * 2 + 3, 14, 2 );
  789. PrintInCell( NumToStr( Cum( vPOIC ), 1 ), vNumberofStrikes * 2 + 3, 15, 2 );
  790. PrintInCell( NumToStr( Cum( vPOIC ) * 100 /  Cum( vPPOI )  , 1.2 ), vNumberofStrikes * 2 + 3, 16, 2 );
  791. PrintInCell( NumToStr( Cum( vPutOI ) / Cum( vCallOI )  , 1.2 ), vNumberofStrikes * 2 + 3, 24, 2 );
  792. GfxSetTextColor( colorBlack );
  793. GfxSelectFont( "Segoe UI", cellheight * ( vFontWeight / 100 ) );
  794.  
  795.  
  796. vFillColor = colorAqua;
  797. FillCell( ( vNumberofStrikes * 2 ) - vPutOIs[vMaxE] + 2, 14, vFillColor );
  798. FillCell( ( vNumberofStrikes * 2 ) - vCallOIs[vMaxE] + 2, 10, vFillColor );
  799. FillCell( ( vNumberofStrikes * 2 ) - vPOICs[vMaxE] + 2, 15, vFillColor );
  800. FillCell( ( vNumberofStrikes * 2 ) - vCOICs[vMaxE] + 2, 9, vFillColor );
  801.  
  802. PrintInCell( NumToStr( vPutOI[vPutOIs[vMaxE]], 1 ), ( vNumberofStrikes * 2 ) - vPutOIs[vMaxE] + 2 , 14, 2 );
  803. PrintInCell( NumToStr( vCallOI[vCallOIs[vMaxE]], 1 ), ( vNumberofStrikes * 2 ) - vCallOIs[vMaxE] + 2, 10, 2 );
  804. PrintInCell( NumToStr( vPOIC[vPOICs[vMaxE]], 1 ), ( vNumberofStrikes * 2 ) - vPOICs[vMaxE] + 2, 15, 2 );
  805. PrintInCell( NumToStr( vCOIC[vCOICs[vMaxE]], 1 ), ( vNumberofStrikes * 2 ) - vCOICs[vMaxE] + 2, 9, 2 );
  806.  
  807.  
  808. GfxSelectFont( "Impact", vRCellHeight * ( vFontWeight / 110 )   , 0, 0 );
  809. PrintInRibbon( NumToStr( vMaxPainStrike, 1 ), 0, 3, 2 );
  810.  
Add Comment
Please, Sign In to add comment