0

我正在编写一个用于交易的机器人。我需要在时间间隔内获得价格差异。假设在格林威治标准时间 00:00:00:0000,一对的价格是 100.0000,而在格林威治标准时间 00:00:00:0005,价格是 101.0000,我想得到这个差价。

我正在使用 Spring 启动调度程序,当我运行应用程序时,它总是返回价格并不高。我希望它不断检查价格差异是否达到价格。

这是每 5 分钟检查一次

@Scheduled(fixedRate = (10*60*1000))
private double getInitialPrice(){
    try {
        initialPrice = Double.parseDouble(String.valueOf(api.pricesMap().get("BTCUSDT")));
    } catch (BinanceApiException e) {
        e.printStackTrace();
    }
    return initialPrice;
}

这是每 5 毫秒检查一次

@Scheduled(fixedRate = (5))
private double getInstancePrice(){
    try {
        instancePrice = Double.parseDouble(String.valueOf(api.pricesMap().get("BTCUSDT")));
    } catch (BinanceApiException e) {
        e.printStackTrace();
    }
    return instancePrice;
}

我现在正在检查,希望 getInstancePrice() 方法将始终检查直到它为真。它没有通过测试,因为它总是返回价格不高,而手动检查时价格更高。我如何让它不断检查直到它给出时差?

if( getInstancePrice() > getInitialPrice() ){
   //do this
}
4

1 回答 1

1

我认为您不需要将属性设为静态,因为这意味着它们对于所有类实例具有相同的值。

另一点是从使用@Scheduled注解的方法返回一个值。

在您的代码中:

if( getInstancePrice() > getInitialPrice() ){
   //do this
}

您只是在执行 api 调用并更新您的值,如果它们从 API 提供的时间相同,那将几乎相同。

您应该做的只是initialPrice在开始时设置您的,然后将其与从 api 获得的新值进行比较:

private Double initialPrice = null;
private double instancePrice;
...
@Scheduled(fixedRate = (5))
private double getInstancePrice(){
    try {
        instancePrice = Double.parseDouble(String.valueOf(api.pricesMap().get("BTCUSDT")));
        if (initialPrice == null) {
            initialPrice = instancePrice;
        } else if (instancePrice > initialPrice) {
            // do this
        }
    } catch (BinanceApiException e) {
        e.printStackTrace();
    }
    return instancePrice;
}

您需要initialPrice成为 Double 的对象才能将其设置为 null 并对其进行初始化。如果您使用的是 Java 8 或更高版本,则应使用 Optional 代替。

于 2019-12-05T10:47:16.993 回答