2017-03-16 83 views
0

使用股票報價我需要找到具有以下輸入參數的範圍:查找股票報價範圍

價格步驟:儘可能降低價格變動。步驟= 0.01意味着報價可以是100.01,100.1,但不是100.015。對於'大'股可以是> 1。

範圍內的步數。步驟= 10意味着我需要10次最低價格變動。像[100.1; 100.2)需要調整時間間隔以儘量減少移動,所以不需要[100.015; 100.15)可能的時間間隔。

輸入引號任何雙(6個位數後,就足夠了),可能會或可能不會遵守價格一步規則(例如,從股市的直接價值服從,但平均值不)。顯然,報價應該是間隔的。我嘗試了不同的方法,但都失敗了。

範圍是相當簡單:

public class Range<T extends Comparable> { 
    private T from = null; 
    private T to = null; 

    public Range(T from, T to) { 
     this.from = from; 
     this.to = to; 
    } 

    public T getFrom() { 
     return from; 
    } 

    public T getTo() { 
     return to; 
    } 

    @SuppressWarnings("unchecked") 
    public boolean contains(T value) { 
     return from.compareTo(value) <= 0 && to.compareTo(value) > 0; 
    } 

    @Override 
    public String toString() { 
     return "Range{" + 
       "from=" + from + 
       ", to=" + to + 
       '}'; 
    } 
} 


protected static Range<Double> getRangeFromPrice(double pips, int step, double price) { 
    BigDecimal modifier = new BigDecimal(pips * step).setScale(6, BigDecimal.ROUND_HALF_DOWN); 
    BigDecimal begin = new BigDecimal(price).divide(modifier, 0, BigDecimal.ROUND_HALF_DOWN).multiply(modifier); 
    return new Range<>(begin.doubleValue(), begin.add(modifier).doubleValue()); 
} 

此功能的大部分時間,例如對於點數= 0.01和步長= 10

  1. 價= 132範圍{從= 132.0,以= 132.1}確定
  2. 價格= 132.01範圍從{= 132.0,爲= 132.1}確定
  3. 價格= 132.1範圍從{= 132.1,爲= 132.2}確定
  4. 價格= 132.15範圍從{= 132.2,爲= 132.3} < - ERROR,價格不在間隔

我嘗試不同的舍入策略,但它們都失敗(在一個實例中或另外的)。現在我完全沒有想法。我怎樣才能自動選擇舍入策略?

回答

0

考慮:

Decimal STEP = 0.1; // floating-point 0.1 is always imprecise. 
Decimal shifted = price/step; // make steps integral. 
Decimal left = trunc(price) * step; // always ≤ price. 
Decimal right = trunc(price + 1) * step; // always > left. 
return Range(left, right); 
0
protected static Range<Double> getRangeFromPrice(double step, int count, double price) { 
    BigDecimal modifier = new BigDecimal(count * step).setScale(Common.PRICE_RESOLUTION, BigDecimal.ROUND_HALF_UP); 
    BigDecimal div = new BigDecimal(price).divide(modifier, Common.PRICE_RESOLUTION, BigDecimal.ROUND_HALF_EVEN).setScale(0, BigDecimal.ROUND_FLOOR); 
    BigDecimal begin = div.multiply(modifier); 
    Range<Double> ret = new Range<>(begin.doubleValue(), begin.add(modifier).doubleValue()); 

    assert ret.contains(price); 
    return ret; 
} 

我解決了原來的問題用下面的代碼。價格應該不是真的雙倍,我在數據庫中使用數字(19,6),但是在應用程序中,我使用double,因爲BigDecimal相當慢。 如果您想使用雙倍,則需要額外的舍入。

此代碼通過我的單元測試。