首页 > 解决方案 > 无法解析构造函数“BaseBar(java.time.ZonedDateTime, java.lang.Double)”?

问题描述

所以我是一名业余的 Android 开发人员并且有一个问题。我的应用程序使用这个库(https://github.com/ta4j/ta4j),但在将其更新到最新的稳定版本后,我遇到了这些错误!

这是错误:

Cannot resolve constructor 'BaseBar(java.time.ZonedDateTime, java.lang.Double, java.lang.Double, java.lang.Double, java.lang.Double, java.lang.Double)'

这是我班级的java代码:

public class RVCardAdapter extends RecyclerView.Adapter<RVCardAdapter.CryptoViewHolder> {

    //globals
    private List<SingleCryptoData> mCryptos;
    private int mExpandedPosition;
    //private int previousExpandedPosition = -1;


    //default constructor
    public RVCardAdapter() {
        super();
        mCryptos = new ArrayList<>();
    }

    //this refreshes the list
    public void clear() {
        mCryptos.clear();
        notifyDataSetChanged();
    }

    //this adds the POJO passed into the crypto list
    public void addData(SingleCryptoData crypto) {
        mCryptos.add(crypto);
        notifyDataSetChanged();
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @NonNull
    @Override
    public CryptoViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cryptocurrency_card, viewGroup, false);
        return new CryptoViewHolder(v);
    }

    //onBindViewHolder binds the data to the layout elements for each crypto
    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull CryptoViewHolder cryptoViewHolder, int i) {

        //loading animation
        FiftyShadesOf fiftyShades = new FiftyShadesOf(cryptoViewHolder.mCardViewDetails.getContext());
        fiftyShades.on(cryptoViewHolder.mSignal, cryptoViewHolder.mCardViewDetails, cryptoViewHolder.mSignalStrength);
        fiftyShades.fadein(true);
        fiftyShades.start();

        //set up output formatting
        Currency usd = Currency.getInstance("USD");
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.US);
        currencyFormat.setCurrency(usd);

        NumberFormat twoDecimalFormat = DecimalFormat.getInstance(Locale.US);
        twoDecimalFormat.setRoundingMode(RoundingMode.FLOOR);
        twoDecimalFormat.setMinimumFractionDigits(0);
        twoDecimalFormat.setMaximumFractionDigits(2);

        //TODO get display POJO data
        cryptoViewHolder.mCryptoName.setText(mCryptos.get(i).getName());
        cryptoViewHolder.mCryptoValue.setText(currencyFormat.format(mCryptos.get(i).getRaw().getPrice()));
        cryptoViewHolder.mCryptoSymbol.setText(mCryptos.get(i).getRaw().getFromSymbol());
        cryptoViewHolder.mCryptoDetailsVolume.setText(twoDecimalFormat.format(mCryptos.get(i).getRaw().getVolume24Hour()) + " " + mCryptos.get(i).getRaw().getFromSymbol());
        cryptoViewHolder.mCryptoDetailsLow.setText(currencyFormat.format(mCryptos.get(i).getRaw().getLow24Hour()));
        cryptoViewHolder.mCryptoDetailsHigh.setText(currencyFormat.format(mCryptos.get(i).getRaw().getHigh24Hour()));
        cryptoViewHolder.mCryptoDetailsOpen.setText(currencyFormat.format(mCryptos.get(i).getRaw().getOpen24Hour()));
        cryptoViewHolder.mCryptoDetailsPercentChange.setText(twoDecimalFormat.format(mCryptos.get(i).getRaw().getChangePercent24Hour()) + " %");

        //color percent change depending on value
        if (mCryptos.get(i).getRaw().getChangePercent24Hour() >= 0) {
            cryptoViewHolder.mCryptoDetailsPercentChange.setTextColor(Color.parseColor("#52BE80"));
        } else {
            cryptoViewHolder.mCryptoDetailsPercentChange.setTextColor(Color.RED);

        }


        //handles expanding animation

        //TODO stop first card from expanding
        final boolean isExpanded = cryptoViewHolder.getAdapterPosition() == mExpandedPosition;
        cryptoViewHolder.mCardViewDetails.setVisibility((isExpanded) ? View.VISIBLE : View.GONE);
        cryptoViewHolder.itemView.setActivated(isExpanded);

//        if (isExpanded)
//            previousExpandedPosition = cryptoViewHolder.getAdapterPosition();

        cryptoViewHolder.itemView.setOnClickListener(v -> {
            mExpandedPosition = (isExpanded) ? -1 : cryptoViewHolder.getAdapterPosition();
            //notifyItemChanged(previousExpandedPosition);  //this used to close the
            notifyItemChanged(cryptoViewHolder.getAdapterPosition());
        });


        //HISTODATA API
        CryptoCompareAPI service = ServiceFactory.createRetrofitRx(CryptoCompareAPI.class, CryptoCompareAPI.BASE_URL);


        if (android.os.Build.VERSION.SDK_INT >= 26){
            //DAYS OF HISTORY TO GET FOR EACH CRYPTO
            int historyDays = 14;

            service.getHistoricalData(mCryptos.get(i).getRaw().getFromSymbol(), "USD", historyDays, "CryptoAnalysis")
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<HistoData>() {

                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        //in histodata, the last element is the newest, and is yesterday. it will be at position [days]
                        @Override
                        public void onNext(HistoData histoData) {

                            TimeSeries series = new BaseTimeSeries("Strategy");

                            //TODO make usable on API 21+
                            ZonedDateTime endTime = ZonedDateTime.now().minusDays(historyDays);

                            //loop for each day of results in histodata
                            for (int i = 0; i < histoData.getData().size(); i++) {

                                //create a new base bar
                                Bar bar = new BaseBar(
                                        endTime.plusDays(i),
                                        histoData.getData().get(i).getOpen(),
                                        histoData.getData().get(i).getHigh(),
                                        histoData.getData().get(i).getLow(),
                                        histoData.getData().get(i).getClose(),
                                        histoData.getData().get(i).getVolumeTo()
                                );

                                series.addBar(bar);

                            }


                            //RUN ANALYSIS
                            Signal signal = TechnicalAnalysis.getSignal(series);

                            //INFLATE LAYOUT STUFF
                            cryptoViewHolder.mSignal.setText(signal.getSignalResult());
                            cryptoViewHolder.mRsiValue.setVisibility(View.VISIBLE);
                            cryptoViewHolder.mRsiValue.setText(String.valueOf((int) signal.getRsiStrength()));
                            cryptoViewHolder.mMomentumValue.setVisibility(View.VISIBLE);
                            cryptoViewHolder.mMomentumValue.setText(String.valueOf((int) signal.getMomentumStrength()));
                            cryptoViewHolder.mEmaValue.setVisibility(View.VISIBLE);
                            cryptoViewHolder.mEmaValue.setText(String.valueOf((int) signal.getEmaStrength()));
                            //cryptoViewHolder.mSignalStrength.setText("(" + String.valueOf(signal.getSignalStrength()) + ")");


                        }

                        @Override
                        public void onError(Throwable e) {

                            if (e.getMessage() != null)
                                Log.e("Histo API Error", e.getMessage());

                        }

                        @Override
                        public void onComplete() {

                            fiftyShades.stop();
                        }

                    });
        } else {

            int historyDays = 14;

            service.getHistoricalData(mCryptos.get(i).getRaw().getFromSymbol(), "USD", historyDays, "CryptoAnalysis")
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<HistoData>() {

                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        //in histodata, the last element is the newest, and is yesterday. it will be at position [days]
                        @Override
                        public void onNext(HistoData histoData) {

                            TimeSeries series = new BaseTimeSeries("Strategy");

                            //RUN ANALYSIS
                            Signal signal = TechnicalAnalysis.getSignal(series);

                            //INFLATE LAYOUT STUFF
                            cryptoViewHolder.mSignal.setText(signal.getSignalResult());
                        }

                        @Override
                        public void onError(Throwable e) {

                            if (e.getMessage() != null)
                                Log.e("Histo API Error", e.getMessage());

                        }

                        @Override
                        public void onComplete() {

                            fiftyShades.stop();
                        }

                    });

        }

    }

    @Override
    public int getItemCount() {
        return mCryptos.size();
    }

    static class CryptoViewHolder extends RecyclerView.ViewHolder {

        CardView mCardView;
        TextView mCryptoDetailsOpen;
        TextView mCryptoDetailsHigh;
        TextView mCryptoDetailsLow;
        TextView mCryptoDetailsVolume;
        TextView mCryptoDetailsPercentChange;
        TextView mCryptoName;
        TextView mCryptoValue;
        TextView mCryptoSymbol;
        ConstraintLayout mCardViewDetails;
        TextView mSignal;
        TextView mRsiValueLabel;
        TextView mRsiValue;
        TextView mEmaValueLabel;
        TextView mEmaValue;
        TextView mMomentumValueLabel;
        TextView mMomentumValue;
        TextView mSignalStrength;
        TextView mLowerApi;



        CryptoViewHolder(View itemView) {
            super(itemView);
            mCryptoDetailsHigh = itemView.findViewById(R.id.crypto_details_high);
            mCryptoDetailsOpen = itemView.findViewById(R.id.crypto_details_open);
            mCryptoDetailsLow = itemView.findViewById(R.id.crypto_details_low);
            mCryptoDetailsVolume = itemView.findViewById(R.id.crypto_details_volume);
            mCryptoDetailsPercentChange = itemView.findViewById(R.id.crypto_details_percent_change);
            mCardViewDetails = itemView.findViewById(R.id.card_view_details);
            mCardView = itemView.findViewById(R.id.card_view);
            mCryptoName = itemView.findViewById(R.id.crypto_name);
            mCryptoValue = itemView.findViewById(R.id.crypto_value);
            mCryptoSymbol = itemView.findViewById(R.id.crypto_symbol);
            mSignal = itemView.findViewById(R.id.signal);

            if (android.os.Build.VERSION.SDK_INT >= 26) {

                mRsiValue = itemView.findViewById(R.id.rsi_indicator_value);
                mRsiValue.setVisibility(View.VISIBLE);
                mEmaValue = itemView.findViewById(R.id.ema_indicator_value);
                mEmaValue.setVisibility(View.VISIBLE);
                mMomentumValue = itemView.findViewById(R.id.momentum_indicator_value);
                mMomentumValue.setVisibility(View.VISIBLE);
                mRsiValueLabel = itemView.findViewById(R.id.rsi_value_label);
                mRsiValueLabel.setVisibility(View.VISIBLE);
                mEmaValueLabel = itemView.findViewById(R.id.ema_value_label);
                mEmaValueLabel.setVisibility(View.VISIBLE);
                mMomentumValueLabel = itemView.findViewById(R.id.momentum_value_label);
                mMomentumValueLabel.setVisibility(View.VISIBLE);

                mLowerApi = itemView.findViewById(R.id.lowApi);
                mLowerApi.setVisibility(View.GONE);
            }
            //mSignalStrength = itemView.findViewById(R.id.signal_strength);
        }
    }
}

显示错误的行:

       for (int i = 0; i < histoData.getData().size(); i++) {

                                //create a new base bar
                                Bar bar = new BaseBar(
                                        endTime.plusDays(i),
                                        histoData.getData().get(i).getOpen(),
                                        histoData.getData().get(i).getHigh(),
                                        histoData.getData().get(i).getLow(),
                                        histoData.getData().get(i).getClose(),
                                        histoData.getData().get(i).getVolumeTo()
                                );

                                series.addBar(bar);

                            }

第 2 类:

public class TechnicalAnalysis {

    //variables and their values, these dictate how likely the signal is to move one way or another.
    //Eventually, these will be tweaked and changed to be more accurate.

    private static double rsiOversold = 25;
    private static double rsiOverbought = 75;
    private static double rsiWeight = 0.35;
    private static double momentumWeight = 0.3;
    private static double emaWeight = 0.35;


    public static Signal getSignal(TimeSeries series) {

        int numBars = series.getBarCount();                 //this is the number of days in the series

        //create indicators from series
        //in all of these, the LAST member is the latest
        ClosePriceIndicator closePrices = new ClosePriceIndicator(series);
        RSIIndicator rsi = new RSIIndicator(closePrices, numBars);
        EMAIndicator shortEma = new EMAIndicator(closePrices, numBars / 4);
        EMAIndicator longEma = new EMAIndicator(closePrices, numBars);

        //init strength vars
        int rsiStrength = 0;
        int momentumStrength = 0;
        int emaStrength = 0;

        //RSI 35%

        for (int i = 0; i < numBars; i++) {
            if (rsi.getValue(i).isGreaterThanOrEqual(rsiOverbought)) {
                rsiStrength += i;
            } else if (rsi.getValue(i).isLessThanOrEqual(rsiOversold)) {
                rsiStrength -= i;
            }
        }


        //EMA 45%
        for (int i = 0; i < numBars; i++) {
            if (shortEma.getValue(i).isGreaterThan(longEma.getValue(i).multipliedBy(1.04))) {
                emaStrength += i;
            } else {
                emaStrength -= i;
            }
        }


        //MOMENTUM 20%
        for (int i = 0; i < numBars; i++) {
            if (series.getBar(i).getClosePrice().isGreaterThan(series.getBar(i).getOpenPrice())) {
                momentumStrength += i;
            } else {
                momentumStrength -= i;
            }
        }


        //finally, return the completed
        double rsiValue = rsiStrength * rsiWeight;
        double emaValue = emaStrength * emaWeight;
        double momentumValue = momentumStrength * momentumWeight;

        return new Signal(rsiValue, emaValue, momentumValue);
    }


}

2 类错误:

isGreaterThanOrEqual
(org.ta4j.core.num.Num)
in Num cannot be applied to (double)

2 类错误行:

        for (int i = 0; i < numBars; i++) {
            if (rsi.getValue(i).isGreaterThanOrEqual(rsiOverbought)) {
                rsiStrength += i;
            } else if (rsi.getValue(i).isLessThanOrEqual(rsiOversold)) {
                rsiStrength -= i;
            }
        }

有人可以帮忙吗?

标签: javaandroid

解决方案


推荐阅读