Advertisement
Guest User

Horizontal Volume Profile

a guest
Feb 28th, 2014
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     @Override public int getLookback() {
  2.         return Math.max(intOptIns[ OPT_IN_RISING_PERIOD ], intOptIns[ OPT_IN_CLIMAX_PERIOD ]) - 1;
  3.     }
  4.  
  5.     @Override protected int calculate(int firstIndex, int lastIndex, boolean isOfferSideChanged, boolean isPeriodChanged, boolean isInstrumentChanged, boolean isFeedChanged, boolean isNewBar, boolean isVisibleNewBar, boolean isFirstCalculation) {
  6.         numOfCalculations++;
  7.  
  8.         if (!boolOptIns[ OPT_IN_DISPLAY ]) {
  9.             return lastIndex - firstIndex + 1;
  10.         }
  11.  
  12.         int numOfElems = 0;
  13.  
  14.         IBar[] ins = getOfferSide().equals(OfferSide.ASK) ? barIns[ IN_ASK ] : barIns[ IN_BID ];
  15.  
  16.         int higherPeriod = Math.max(intOptIns[ OPT_IN_RISING_PERIOD ], intOptIns[ OPT_IN_CLIMAX_PERIOD ]);
  17.  
  18.         for (int inIndex = lastIndex, outIndex = lastIndex - firstIndex ; inIndex >= firstIndex ; inIndex--, outIndex--, numOfElems++) {
  19.             int askInIndex = getOfferSide().equals(OfferSide.ASK) ? inIndex : getTimedIndex(ins[ inIndex ].getTime(), barIns[ IN_ASK ]);
  20.             int bidInIndex = getOfferSide().equals(OfferSide.BID) ? inIndex : getTimedIndex(ins[ inIndex ].getTime(), barIns[ IN_BID ]);
  21.  
  22.             doubleOuts[ OUT_LINE_OF_ASK_VOLUME ][ outIndex ] = 0;
  23.             doubleOuts[ OUT_LINE_OF_BID_VOLUME ][ outIndex ] = 0;
  24.             doubleOuts[ OUT_LINE_OF_VOLUME     ][ outIndex ] = 0;
  25.  
  26.             if (askInIndex == -1 || bidInIndex == -1) {
  27.                 continue;
  28.             }
  29.  
  30.             double totalVolume = barIns[ IN_ASK ][ askInIndex ].getVolume() + barIns[ IN_BID ][ bidInIndex ].getVolume();
  31.  
  32.             double averageVolume = 0;
  33.  
  34.             double highestVal = 0;
  35.  
  36.             doubleOuts[ OUT_LINE_OF_ASK_VOLUME ][ outIndex ] =  barIns[ IN_ASK ][ askInIndex ].getVolume();
  37.             doubleOuts[ OUT_LINE_OF_BID_VOLUME ][ outIndex ] = -barIns[ IN_BID ][ bidInIndex ].getVolume();
  38.             doubleOuts[ OUT_LINE_OF_VOLUME     ][ outIndex ] =  totalVolume;
  39.  
  40.             for (int prevInIndex = inIndex - 1 ; prevInIndex > inIndex - higherPeriod ; prevInIndex--) {
  41.                 int prevAskInIndex = getOfferSide().equals(OfferSide.ASK) ? prevInIndex : getTimedIndex(ins[ prevInIndex ].getTime(), barIns[ IN_ASK ]);
  42.  
  43.                 int prevBidInIndex = getOfferSide().equals(OfferSide.BID) ? prevInIndex : getTimedIndex(ins[ prevInIndex ].getTime(), barIns[ IN_BID ]);
  44.  
  45.                 if (prevAskInIndex == -1 || prevBidInIndex == -1) {
  46.                     continue;
  47.                 }
  48.  
  49.                 double prevTotalVolume = barIns[ IN_ASK ][ prevAskInIndex ].getVolume() + barIns[ IN_BID ][ prevBidInIndex ].getVolume();
  50.  
  51.                 if (prevInIndex > inIndex - intOptIns[ OPT_IN_RISING_PERIOD ]) {
  52.                     averageVolume += prevTotalVolume;
  53.                 }
  54.  
  55.                 if (prevInIndex > inIndex - intOptIns[ OPT_IN_CLIMAX_PERIOD ]) {
  56.                     highestVal = Math.max(highestVal, prevTotalVolume * (ins[ prevInIndex ].getHigh() - ins[ prevInIndex ].getLow()));
  57.                 }
  58.             }
  59.  
  60.             averageVolume /= intOptIns[ OPT_IN_RISING_PERIOD ];
  61.  
  62.             if (averageVolume * doubleOptIns[ OPT_IN_CLIMAX_FACTOR ] <= totalVolume || totalVolume * (ins[ inIndex ].getHigh() - ins[ inIndex ].getLow()) >= highestVal) {
  63.                 doubleOuts[ OUT_CLIMAX_VOLUME ][ outIndex ] = totalVolume;
  64.  
  65.                 if (!isClimaxVolumeReported && boolOptIns[ OPT_IN_NOTIFY ] && numOfCalculations > 9 && ins[ inIndex ].getTime() == getCurrentTime() && (isClimaxVolumeReported = true)) {
  66.                     notify("Climax Volume", boolOptIns[ OPT_IN_NOTIFY_CLIMAX_VOLUME ], 2);
  67.                 }
  68.             } else if (averageVolume * doubleOptIns[ OPT_IN_RISING_FACTOR ] <= totalVolume) {
  69.                 doubleOuts[ OUT_RISING_VOLUME ][ outIndex ] = totalVolume;
  70.  
  71.                 if (!isRisingVolumeReported && boolOptIns[ OPT_IN_NOTIFY ] && numOfCalculations > 9 && ins[ inIndex ].getTime() == getCurrentTime() && (isRisingVolumeReported = true)) {
  72.                     notify("Rising Volume", boolOptIns[ OPT_IN_NOTIFY_RISING_VOLUME ]);
  73.                 }
  74.             } else {
  75.                 doubleOuts[ OUT_VOLUME ][ outIndex ] = totalVolume;
  76.             }
  77.         }
  78.  
  79.         return numOfElems;
  80.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement