Advertisement
Guest User

Horizontal Volume Profile

a guest
Feb 28th, 2014
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.07 KB | None | 0 0
  1.     /**
  2.      * Získa počet elementov potrebných na výpočet hodnoty prvého elementu.
  3.      *
  4.      * @return
  5.      *   Vráti počet elementov potrebných na výpočet hodnoty prvého elementu.
  6.      */
  7.     @Override public int getLookback() {
  8.         /*
  9.          * Dokumentácia:
  10.          *   IIndicator => http://www.dukascopy.com/wiki/#IIndicator_interface/Method_getLookback
  11.          */
  12.  
  13.         return Math.max(intOptIns[ OPT_IN_RISING_PERIOD ], intOptIns[ OPT_IN_CLIMAX_PERIOD ]) - 1;
  14.     }
  15.  
  16.     /**
  17.      * Vypočíta hodnoty indikátora.
  18.      *
  19.      * @param
  20.      *   firstIndex Prvý index v zoskupení vstupných elementov.
  21.      * @param
  22.      *   lastIndex Posledný index v zoskupení vstupných elementov.
  23.      * @param
  24.      *   isOfferSideChanged Zmenila sa ponuková strana na danom grafe?
  25.      * @param
  26.      *   isPeriodChanged Zmenil sa časový rámec na danom grafe?
  27.      * @param
  28.      *   isInstrumentChanged Zmenil sa obchodovaný nástroj na danom grafe?
  29.      * @param
  30.      *   isFeedChanged Zmenila sa ponuková strana, časový rámec alebo obchodovaný
  31.      *   nástroj na danom grafe?
  32.      * @param
  33.      *   isNewBar Vytvorila sa nová sviečka na danom grafe?
  34.      * @param
  35.      *   isVisibleNewBar Vytvorila sa viditeľne nová sviečka na danom grafe?
  36.      * @param
  37.      *   isFirstCalculation Jedná sa o úplne prvý výpočet indikátora na danom grafe?
  38.      * @return
  39.      *   Vráti počet elementov na výstupe.
  40.      */
  41.     @Override protected int calculate(int firstIndex, int lastIndex, boolean isOfferSideChanged, boolean isPeriodChanged, boolean isInstrumentChanged, boolean isFeedChanged, boolean isNewBar, boolean isVisibleNewBar, boolean isFirstCalculation) {
  42.         /*
  43.          * Dokumentácia:
  44.          *   IIndicator => http://www.dukascopy.com/wiki/#IIndicator_interface/Method_calculate
  45.          */
  46.  
  47.         numOfCalculations++;
  48.  
  49.         if (!boolOptIns[ OPT_IN_DISPLAY ]) {
  50.             return lastIndex - firstIndex + 1;
  51.         }
  52.  
  53.         /**
  54.          * Počet elementov na výstupe.
  55.          */
  56.         int numOfElems = 0;
  57.  
  58.         /**
  59.          * Hlavné zoskupenie vstupných elementov.
  60.          */
  61.         IBar[] ins = getOfferSide().equals(OfferSide.ASK) ? barIns[ IN_ASK ] : barIns[ IN_BID ];
  62.  
  63.         /**
  64.          * Vyšší časový rámec.
  65.          */
  66.         int higherPeriod = Math.max(intOptIns[ OPT_IN_RISING_PERIOD ], intOptIns[ OPT_IN_CLIMAX_PERIOD ]);
  67.  
  68.         /**
  69.          * @var
  70.          *   int inIndex Index v zoskupení vstupných elementov.
  71.          * @var
  72.          *   int outIndex Index v zoskupení výstupných elementov.
  73.          */
  74.         for (int inIndex = lastIndex, outIndex = lastIndex - firstIndex ; inIndex >= firstIndex ; inIndex--, outIndex--, numOfElems++) {
  75.             /**
  76.              * Index na strane ponuky v zoskupení vstupných elementov.
  77.              */
  78.             int askInIndex = getOfferSide().equals(OfferSide.ASK) ? inIndex : getTimedIndex(ins[ inIndex ].getTime(), barIns[ IN_ASK ]);
  79.  
  80.             /**
  81.              * Index na strane dopytu v zoskupení vstupných elementov.
  82.              */
  83.             int bidInIndex = getOfferSide().equals(OfferSide.BID) ? inIndex : getTimedIndex(ins[ inIndex ].getTime(), barIns[ IN_BID ]);
  84.  
  85.             doubleOuts[ OUT_LINE_OF_ASK_VOLUME ][ outIndex ] = 0;
  86.             doubleOuts[ OUT_LINE_OF_BID_VOLUME ][ outIndex ] = 0;
  87.             doubleOuts[ OUT_LINE_OF_VOLUME     ][ outIndex ] = 0;
  88.  
  89.             if (askInIndex == -1 || bidInIndex == -1) {
  90.                 continue;
  91.             }
  92.  
  93.             /**
  94.              * Celkový objem uskutočnených obchodov.
  95.              */
  96.             double totalVolume = barIns[ IN_ASK ][ askInIndex ].getVolume() + barIns[ IN_BID ][ bidInIndex ].getVolume();
  97.  
  98.             /**
  99.              * Priemerný objem uskutočnených obchodov.
  100.              */
  101.             double averageVolume = 0;
  102.  
  103.             /**
  104.              * Najvyššia vrcholiaca hodnota.
  105.              */
  106.             double highestVal = 0;
  107.  
  108.             doubleOuts[ OUT_LINE_OF_ASK_VOLUME ][ outIndex ] =  barIns[ IN_ASK ][ askInIndex ].getVolume();
  109.             doubleOuts[ OUT_LINE_OF_BID_VOLUME ][ outIndex ] = -barIns[ IN_BID ][ bidInIndex ].getVolume();
  110.             doubleOuts[ OUT_LINE_OF_VOLUME     ][ outIndex ] =  totalVolume;
  111.  
  112.             /**
  113.              * Predchádzajúci index v zoskupení vstupných elementov.
  114.              *
  115.              * @var
  116.              *   int prevInIndex
  117.              */
  118.             for (int prevInIndex = inIndex - 1 ; prevInIndex > inIndex - higherPeriod ; prevInIndex--) {
  119.                 /**
  120.                  * Predchádzajúci index na strane ponuky v zoskupení vstupných elementov.
  121.                  */
  122.                 int prevAskInIndex = getOfferSide().equals(OfferSide.ASK) ? prevInIndex : getTimedIndex(ins[ prevInIndex ].getTime(), barIns[ IN_ASK ]);
  123.  
  124.                 /**
  125.                  * Predchádzajúci index na strane dopytu v zoskupení vstupných elementov.
  126.                  */
  127.                 int prevBidInIndex = getOfferSide().equals(OfferSide.BID) ? prevInIndex : getTimedIndex(ins[ prevInIndex ].getTime(), barIns[ IN_BID ]);
  128.  
  129.                 if (prevAskInIndex == -1 || prevBidInIndex == -1) {
  130.                     continue;
  131.                 }
  132.  
  133.                 /**
  134.                  * Predchádzajúci celkový objem uskutočnených obchodov.
  135.                  */
  136.                 double prevTotalVolume = barIns[ IN_ASK ][ prevAskInIndex ].getVolume() + barIns[ IN_BID ][ prevBidInIndex ].getVolume();
  137.  
  138.                 if (prevInIndex > inIndex - intOptIns[ OPT_IN_RISING_PERIOD ]) {
  139.                     averageVolume += prevTotalVolume;
  140.                 }
  141.  
  142.                 if (prevInIndex > inIndex - intOptIns[ OPT_IN_CLIMAX_PERIOD ]) {
  143.                     highestVal = Math.max(highestVal, prevTotalVolume * (ins[ prevInIndex ].getHigh() - ins[ prevInIndex ].getLow()));
  144.                 }
  145.             }
  146.  
  147.             averageVolume /= intOptIns[ OPT_IN_RISING_PERIOD ];
  148.  
  149.             if (averageVolume * doubleOptIns[ OPT_IN_CLIMAX_FACTOR ] <= totalVolume || totalVolume * (ins[ inIndex ].getHigh() - ins[ inIndex ].getLow()) >= highestVal) {
  150.                 doubleOuts[ OUT_CLIMAX_VOLUME ][ outIndex ] = totalVolume;
  151.  
  152.                 if (!isClimaxVolumeReported && boolOptIns[ OPT_IN_NOTIFY ] && numOfCalculations > 9 && ins[ inIndex ].getTime() == getCurrentTime() && (isClimaxVolumeReported = true)) {
  153.                     notify("Climax Volume", boolOptIns[ OPT_IN_NOTIFY_CLIMAX_VOLUME ], 2);
  154.                 }
  155.             } else if (averageVolume * doubleOptIns[ OPT_IN_RISING_FACTOR ] <= totalVolume) {
  156.                 doubleOuts[ OUT_RISING_VOLUME ][ outIndex ] = totalVolume;
  157.  
  158.                 if (!isRisingVolumeReported && boolOptIns[ OPT_IN_NOTIFY ] && numOfCalculations > 9 && ins[ inIndex ].getTime() == getCurrentTime() && (isRisingVolumeReported = true)) {
  159.                     notify("Rising Volume", boolOptIns[ OPT_IN_NOTIFY_RISING_VOLUME ]);
  160.                 }
  161.             } else {
  162.                 doubleOuts[ OUT_VOLUME ][ outIndex ] = totalVolume;
  163.             }
  164.         }
  165.  
  166.         return numOfElems;
  167.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement