查找股票报价范围

时间:2017-03-16 12:59:41

标签: java math

使用分享报价我需要找到具有以下输入参数的范围:

价格步骤:可能实现最低价格变动。 Step = 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());
}

此功能大部分时间都有效,例如pips = 0.01和step = 10

  1. price = 132范围{from = 132.0,to = 132.1}确定
  2. price = 132.01范围{from = 132.0,to = 132.1}确定
  3. price = 132.1范围{from = 132.1,to = 132.2}确定
  4. price = 132.15范围{from = 132.2,to = 132.3}&lt; - 错误,价格不在区间内
  5. 我尝试了不同的舍入策略,但所有这些策略都失败了(在一个例子或另一个例子中)。现在我完全没有想法了。如何自动选择舍入策略?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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相当慢。 如果你想使用双倍,则需要额外的舍入。

此代码通过了我的单元测试。