看了E大网格操作的文章后,按照E大的思路生成了一个网格生成器,感谢E大!!
注意使用网格时,要合理设置小网,中网,大网。
import java.util.ArrayList;
import java.util.List;
// 网格生成器 用来生成基金的操作网格
public class Solution {
public static void main(String[] args) {
List<RowData> smallNet = generateNet(1.0, 0.05, 0.50
, 0.08, 0.07, 10000.00, 2.0);
printNet(smallNet);
// List<RowData> middleNet = generateNet(0.97, 0.15, 0.65
// , 0.1, 10000.00, 0.0);
// printNet(middleNet);
//
// List<RowData> bigNet = generateNet(0.87, 0.30, 0.65
// , 0.2, 10000.00, 0.0);
// 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("%-5s %-4s %-5s %-10s %-9s %-4s %-9s %-9s %-9s %-8s %-9s %-9s\n\n", "序号", "幅度", "买入"
, "买入数量", "买入金额", "卖出", "卖出数量", "卖出金额", "盈利金额", "盈利比例%", "本期留存数量", "本期留存利润");
for (int i = 0; i < net.size(); ++i) {
RowData data = net.get(i);
System.out.printf("%-6d %-6.2f %-6.3f %-12d %-12.2f %-6.3f %-12d %-12.2f %-12.2f %-12.2f %-12d %-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)
, data.curLeftCnt, data.curLeftProfit);
}
}
/**
* 传入参数,生成网格
*
* @param initPrice 设定最开始的单价
* @param decRate 递减比例
* @param decRateUpperLimit 递减比例上限,最好能整除递减比例
* @param incRate 递增比例
* @param increaseRatePerGrid 递减一格增加总金额的比例
* @param initTotalPrice 最开始的买入总价
* @param remainProfitRate 留利润比例
* @return 产生的网格
*/
public static List<RowData> generateNet(double initPrice, double decRate, double decRateUpperLimit
, double incRate, double increaseRatePerGrid, double initTotalPrice, double remainProfitRate) {
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 = initPrice * data.retreatRate;
data.buyTotalPrice = initTotalPrice * Math.pow(1 + increaseRatePerGrid, i);
data.buyCnt = (int) (data.buyTotalPrice / data.buyUnitPrice);
data.saleUnitPrice = data.buyUnitPrice + initPrice * incRate;
data.profit = data.saleUnitPrice * data.buyCnt - data.buyTotalPrice;
data.saleTotalPrice = data.saleUnitPrice * data.buyCnt - data.profit * remainProfitRate;
data.saleCnt = (int) (data.saleTotalPrice / data.saleUnitPrice);
data.profitRate = data.profit / data.buyTotalPrice;
data.curLeftCnt = data.buyCnt - data.saleCnt;
data.curLeftProfit = data.curLeftCnt * data.saleUnitPrice;
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; // 本期盈利比例
int curLeftCnt = 0; // 本期留存数量
double curLeftProfit = 0.0; // 本期留存利润
}