美文网首页
利用RSI指标编写的策略

利用RSI指标编写的策略

作者: 往后余生9375 | 来源:发表于2022-02-06 18:15 被阅读0次

提示

代码只能运行在恒易交易系统上

问题

  • 每次不能全部抓住收益,总是很快就平单
  • 每一单的亏损较大,胜率有时较高,有时很低
package com.hengyi.strategytemplate.strategy;

import com.alibaba.fastjson.JSONObject;
import com.hengyi.tradesystem.entity.KLine;
import com.hengyi.tradesystem.entity.OrderProfit;
import com.hengyi.tradesystem.entity.Strategy;
import com.hengyi.tradesystem.enums.AlarmLevel;
import com.hengyi.tradesystem.enums.KLineType;
import com.hengyi.tradesystem.enums.OrdersType;
import com.hengyi.tradesystem.strategy.impl.BaseStrategy;
import com.hengyi.tradesystem.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;

/**
 * RSI策略
 *
 * @author dongzp
 * @version 1.0
 * @desc ssss
 **/
@Slf4j
@Component
public class RsiStrategy extends BaseStrategy {

    @Override
    public void init(String accountStrategyId, String strategyId, String accountId, String backTestId, Long jobId, String symbol, OrdersType ordersType, JSONObject runParams) {
        super.init(accountStrategyId, strategyId, accountId, backTestId, jobId, symbol, ordersType, runParams);
    }

    @Override
    public void pre(Strategy strategy) {
        System.out.println("=======================执行策略之前============================");
    }

    @Override
    public void run(Strategy strategy,Long currentTime) {
        // 回测不发送邮件
        setSendMail(false);
        // 这里可以根据策略需要编写业务代码
        System.out.println("执行策略中,当前日期:" + DateUtils.dateToStr(DateUtils.timestampToDate(currentTime)));
        List<KLine> kLineList = getKLineList("5m", 20);
        // 判断买点
        double[] rsi = getRsi(kLineList,6);
        double[][] kdj = getKdj(kLineList, 9, 3, 3);
        double nowRsi = rsi[rsi.length - 1];
        double nowK = kdj[0][kdj[0].length - 1];
        double nowD = kdj[1][kdj[1].length - 1];
        double nowJ = kdj[2][kdj[2].length - 1];

        // 放量
        int longVolumeNum = getLongVolumeNum(kLineList,10,3,true);

        // 卖点
        int entityUpNum = getEntityNum(kLineList, KLineType.ENTITY_UP, 10,true);
        int longEntityUpNum = getLongEntityNum(kLineList,KLineType.ENTITY_UP,10,3,true);
        int longShadowUpNum = getLongShadowNum(kLineList,KLineType.SHADOW_UP,10,3,true);

        // 买点
        int entityDownNum = getEntityNum(kLineList, KLineType.ENTITY_DOWN, 10,true);
        int longEntityDownNum = getLongEntityNum(kLineList, KLineType.ENTITY_DOWN, 10, 3,true);
        int longShadowDownNum = getLongShadowNum(kLineList,KLineType.SHADOW_DOWN,10,3,true);

        log.info("交易对:{} RSI:{}, KDJ:{},{},{}",getSymbol(),nowRsi,nowK,nowD,nowJ);
        String openQty = getRunParams().getString("openQty");
        log.info("策略开仓的数量设置的是:{},当前最新价:{}",openQty,getNewPrice(true));

        Boolean hasOpen = hasOpenOrder();
        if(hasOpen){
            OrderProfit orderProfit = getOrderProfit();
            log.info("目前盈亏率:{} 盈亏金额:{}U 开仓成本:{} 标记价格:{}",orderProfit.getProfitRate(),orderProfit.getProfitValue(),orderProfit.getAvgPrice(),orderProfit.getMarkPrice());
            if(orderProfit.getProfitRate().compareTo(new BigDecimal("-0.1")) <= 0){
                // 亏损达到10%
                closePosition();
                alarm("止损平单","您的订单是达到了10%的亏损平掉的", AlarmLevel.INFO);
            }

            // 开仓均价
            BigDecimal openAvgPrice = orderProfit.getAvgPrice();
            if(orderProfit.getMarkPrice().compareTo(openAvgPrice) > 0){
                // 收益超过5% 出现阴线或者放量就抛出
                int openEntityDownNum = getEntityNum(kLineList,KLineType.ENTITY_DOWN,3,true);
                int openLongEntityDownNum = getLongEntityNum(kLineList,KLineType.ENTITY_DOWN,1,3,true);
                int openLongVolumeNum = getLongVolumeNum(kLineList,1,3,true);

                if(orderProfit.getProfitRate().compareTo(new BigDecimal("0.1")) >= 0 && (openLongEntityDownNum > 0 || openLongVolumeNum > 0 || openEntityDownNum >= 3)){
                    closePosition();
                    alarm("止盈平单","您的订单是最近出现打的波动被平掉的", AlarmLevel.INFO);
                    return;
                }

                if((longEntityUpNum >= 2 || entityUpNum >= 7 || longShadowUpNum > 0) && (nowJ >= 100 || (nowK >=80 && nowD >=80 && nowJ >=80)) && nowRsi >=85){
                    // 判断是否有
                    closePosition();
                    alarm("止盈平单","您的订单是根据指标到达设定值被平掉的", AlarmLevel.INFO);
                }
            }
        }else{
            if((longVolumeNum >= 0 || longEntityDownNum >= 1 || longShadowDownNum >= 1 || entityDownNum >=7) && ((nowJ <= -1 || (nowK <=20 && nowD <=20 && nowJ <=20)) && nowRsi <= 18)){
                openLong(String.valueOf(System.currentTimeMillis()),"",openQty);
            }
        }
    }

    @Override
    public void post(Strategy strategy) {
        System.out.println("=======================执行策略之后=======================");
    }

}

相关文章

网友评论

      本文标题:利用RSI指标编写的策略

      本文链接:https://www.haomeiwen.com/subject/ounukrtx.html