Как получить разницу в цене с помощью планировщика загрузки Spring

Пишу бота для торговли. Мне нужно получить разницу цен во временных интервалах. Допустим, на 00:00:00:0000 GMT цена пары 100.0000, а на 00:00:00:0005 GMT цена 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
}

person ken4ward    schedule 05.12.2019    source источник
comment
Когда вы запускаете проверку, это должно быть тем, что запланировано, а не двумя другими, они должны быть просто каким-то кешем.   -  person luk2302    schedule 05.12.2019
comment
Мне нравится твоя точка зрения. Не могли бы вы уточнить это. В настоящее время я объявил их как private static double initialPrice = 0; private static double instancePrice = 0; Что вы думаете?   -  person ken4ward    schedule 05.12.2019


Ответы (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 или более позднюю версию, вместо этого вам следует использовать необязательный параметр.

person Mario Santini    schedule 05.12.2019