看了E大网格操作的文章后,按照E大的思路生成了一个网格生成器,感谢E大!!
注意使用网格时,要合理设置小网,中网,大网。
import java.util.ArrayList;
import java.util.List;
// 网格生成器 用来生成股票的操作网格
public class Solution {
public static void main(String[] args) {
List<RowData> smallNet = generateNet(23.55, 0.10, 0.5, 0.08
, 200, 0.1);
printNet(smallNet);
// List<RowData> middleNet = generateNet(26.51, 0.05, 0.55
// , 200, 0.3);
// printNet(middleNet);
//
// List<RowData> bigNet = generateNet(26.51, 0.05, 0.55
// , 200, 0.3);
// printNet(bigNet);
// List<RowData> allNet = new ArrayList<>();
// allNet.addAll(smallNet);
// allNet.addAll(middleNet);
// allNet.addAll(bigNet);
//
// allNet = allNet.stream().sorted((d1, d2) -> {
// if (d1.buyUnitPrice - d2.buyUnitPrice > 0) {
// return -1;
// } else {
// return 1;
// }
// }).collect(Collectors.toList());
//
// printNet(allNet);
}
// 打印网格
public static void printNet(List<RowData> net) {
System.out.printf("%-4s %-4s %-10s %-15s %-8s %-13s %-15s %-8s %-8s %-8s\n\n", "序号", "幅度", "买入单价(1股)"
, "买入数量(100的倍数)", "买入金额", "卖出单价(1股)", "卖出数量(100的倍数)", "卖出金额", "盈利金额", "盈利比例%");
for (int i = 0; i < net.size(); ++i) {
RowData data = net.get(i);
System.out.printf("%-5d %-6.2f %-15.2f %-18d %-12.2f %-18.2f %-17d %-12.2f %-10.2f %-12.2f\n\n"
, i + 1, data.retreatRate, data.buyUnitPrice, data.buyCnt, data.buyTotalPrice, data.saleUnitPrice
, data.saleCnt, data.saleTotalPrice, data.profit, (data.profitRate * 100));
}
}
/**
* 传入参数,生成网格
*
* @param initPrice 设定最开始的单价
* @param decRate 递减比例
* @param decRateUpperLimit 递减比例上限,最好能整除递减比例
* @param incRate 递增比例
* @param initBuyCnt 买入数量 100的倍数
* @param buyCntUpperRate 买入数量的上升比例,只有到达100的倍数时,才会影响到 buyCnt
* @return 产生的网格
*/
public static List<RowData> generateNet(double initPrice, double decRate, double decRateUpperLimit
, double incRate, int initBuyCnt, double buyCntUpperRate) {
List<RowData> ret = new ArrayList<>();
int num = (int) (decRateUpperLimit / decRate);
for (int i = 0; i <= num; ++i) {
RowData data = new RowData();
data.retreatRate = 1 - decRate * i;
data.buyUnitPrice = ((int) ((initPrice * data.retreatRate) * 100 + 0.5)) / 100.0;
data.buyCnt = ((int) ((initBuyCnt * Math.pow(1 + buyCntUpperRate, i)) / 100)) * 100;
data.buyTotalPrice = data.buyCnt * data.buyUnitPrice;
data.saleUnitPrice = ((int) ((data.buyUnitPrice + initPrice * incRate) * 100 + 0.5)) / 100.0;
data.saleCnt = data.buyCnt;
data.saleTotalPrice = data.saleUnitPrice * data.saleCnt;
data.profit = data.saleTotalPrice - data.buyTotalPrice;
data.profitRate = data.profit / data.buyTotalPrice;
ret.add(data);
}
return ret;
}
}
class RowData {
double retreatRate = 0.0; // 回撤幅度
double buyUnitPrice = 0.0; // 买入单价
double saleUnitPrice = 0.0; // 卖出单价
int buyCnt = 0; // 买入数量
double buyTotalPrice = 0.0; // 买入总价
int saleCnt = 0; // 卖出数量
double saleTotalPrice = 0.0; // 卖出总价
double profit = 0.0; // 利润
double profitRate = 0.0; // 利润率
}