使用分享报价我需要找到具有以下输入参数的范围:
价格步骤:可能实现最低价格变动。 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
我尝试了不同的舍入策略,但所有这些策略都失败了(在一个例子或另一个例子中)。现在我完全没有想法了。如何自动选择舍入策略?
答案 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相当慢。 如果你想使用双倍,则需要额外的舍入。
此代码通过了我的单元测试。