资源加载中... loading...

伪高频策略实现(PLUS)

Author: ianzeng123, Date: 2023-09-07 13:21:01
Tags:

伪高频策略PLUS版本,增加附加状态栏,会显示包括策略运行期间的挂单价格,止盈止损价格,交易期间内成功和失败的次数信息的统计,收益曲线会显示每笔交易的盈亏变化,图表会显示进场挂单价格,入场的位置和仓位类型,开仓成功以后,会显示止盈止损价格和出场的位置,以及平仓是否盈利或者损失。大家可以挑选自己喜欢的品种,更改参数或者策略的逻辑,来实现属于你的高频策略,有好的想法大家也可以留言在评论区,我们可以共同探讨创建更好的高频策略。 (已更新:添加加锁功能)


/*backtest
start: 2023-08-02 09:00:00
end: 2023-08-02 15:00:17
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES","depthDeep":20}]
mode: 1
*/

function cancelOrders(symbol, offset) {
    var orders = null;
    while (1) {
        orders = _C(exchange.GetOrders);
        if (orders.length == 0) {
            break;
        }
        for (var i = 0; i < orders.length; i++) {
            if ((orders[i].ContractType == symbol && orders[i].Offset == offset) || typeof(offset) == "undefined") {
                exchange.CancelOrder(orders[i].Id, orders[i]);
                Sleep(interval);
            }
        }
        Sleep(interval);
    }
    return orders;
}

function trade(distance, price, amount) {
    var tradeFunc = null;
    if (distance == "buy") {
        tradeFunc = exchange.Buy;
    } else if (distance == "sell") {
        tradeFunc = exchange.Sell;
    } else if (distance == "closebuy" || distance == "closebuy_today") {
        tradeFunc = exchange.Sell;
    } else if (distance == "closesell" || distance == "closesell_today") {
        tradeFunc = exchange.Buy;
    }
    exchange.SetDirection(distance);
    return tradeFunc(price, amount);
}

function getOrderBySymbol(symbol, orders) {
    var ret = [];
    _.each(orders, function(order) {
        if (order.ContractType == symbol) {
            ret.push(order);
        }
    });
    return ret;
}

function hasOrder(orders, type, offset) {
    var ret = false;
    _.each(orders, function(order) {
        if (order.Offset == offset && order.Type == type) {
            ret = order;
        }
    });
    return ret;
}

var p = $.NewPositionManager(); //交易类库函数

var success_count = 0; //成功次数统计
var fail_count = 0; //止损次数统计

var orderlong = null;  //多头挂单价格
var ordershort = null; //空头挂单价格
var profitprice = null; //止盈挂单价格
var lossprice = null; //止损挂单价格

var tblStatus = {
    type: "table",
    title: "策略运行状态信息",
    cols: ["合约名称", "当前价格", "多头挂单", "空头挂单", "止盈价格","止损价格",  "持仓方向", "持仓价格", "持仓数量", "持仓盈亏", "止损次数", "成功次数"],
    rows: []
};
 
function main() {
    var initAccount = _C(exchange.GetAccount);
    var preprofit = 0 //先前权益
    var curprofit = 0 //当前权益
    var holdPrice = null //持仓价格
    var holdType = null //持仓类型
    var holdAmount = null //持仓数量
    var holdProfit = null //持仓盈亏
    var isLock = false //止盈挂单锁

    while (true) {
        if (exchange.IO("status")) {
            
            exchange.SetContractType(symbol);
            var t = exchange.GetTicker(); 
            var r = exchange.GetRecords();
            var ContractType = symbol
            var curprice = r[r.length-1].Close

            var positions = _C(exchange.GetPosition);
            var pos = [p.GetPosition(symbol, PD_LONG, positions), p.GetPosition(symbol, PD_SHORT, positions)];
            var orders = getOrderBySymbol(symbol, _C(exchange.GetOrders));

            if (orders.length == 0 && (!pos[0] && !pos[1])) {
                profitprice = null
                lossprice = null
                isLock = false //解锁

                holdPrice = ''
                holdType = ''
                holdAmount = ''
                holdProfit = ''

                preprofit = curprofit
                curprofit = exchange.GetAccount().Balance - initAccount.Balance
                LogProfit(curprofit, "权益", '&');

                if(preprofit < curprofit){
                    success_count += 1
                    $.PlotFlag(r[r.length-2].Time, '止盈离场', '止盈离场')
                }

                if(preprofit > curprofit){
                    fail_count += 1
                    $.PlotFlag(r[r.length-2].Time, '止损离场', '止损离场')
                }

                orderlong = t.Buy - priceTick * deviation
                ordershort = t.Sell + priceTick * deviation

                // 当前没有挂单,没有持仓,基于盘口挂单
                trade("buy", orderlong, 1);
                trade("sell", ordershort, 1);
                
            } else if (pos[0] || pos[1]) {
                // 只要有持仓
                orderlong = null
                ordershort = null

                var cur_pos = pos[0] ? pos[0] : pos[1]
                holdPrice = cur_pos.Price 
                holdType = pos[0] ? '多头方向' : '空头方向'
                holdAmount = cur_pos.Amount
                holdProfit = cur_pos.Profit

                if ((pos[1] && hasOrder(orders, ORDER_TYPE_BUY, ORDER_OFFSET_OPEN)) || (pos[0] && hasOrder(orders, ORDER_TYPE_SELL, ORDER_OFFSET_OPEN))) {
                    $.PlotFlag(r[r.length-1].Time, pos[0] ? '多单进场' : '空单进场', pos[0] ? '多单进场' : '空单进场')
                    cancelOrders(symbol, ORDER_OFFSET_OPEN);
                    Log('删除挂单:', pos[0] ? '空单' : '多单');
                }

                var longCoverOrder = hasOrder(orders, ORDER_TYPE_SELL, ORDER_OFFSET_CLOSE);
                var shortCoverOrder = hasOrder(orders, ORDER_TYPE_BUY, ORDER_OFFSET_CLOSE);

                if (pos[0] && !longCoverOrder && isLock == false) {
                    profitprice = t.Sell + priceTick * profit
                    lossprice = t.Sell - priceTick * maxCoverDeviation
                    trade("closebuy", profitprice, pos[0].Amount);
                    isLock = true //加锁
                }

                if (pos[1] && !shortCoverOrder && isLock == false) {
                    // 有空头持仓
                    profitprice = t.Buy - priceTick * profit
                    lossprice = t.Buy + priceTick * maxCoverDeviation
                    trade("closesell", profitprice, pos[1].Amount);
                    isLock = true //加锁
                }

                // 重新平仓条件
                if (pos[0] && longCoverOrder && t.Sell < lossprice) {
                    Log('多头止损');
                    cancelOrders(symbol);
                    p.Cover(symbol);
                }

                if (pos[1] && shortCoverOrder && t.Buy > lossprice) {
                    Log('空头止损');
                    cancelOrders(symbol);
                    p.Cover(symbol);
                }
            }

            $.PlotRecords(r, "K线数据")
            $.PlotLine("多头挂单", orderlong, r[r.length - 1].Time)
            $.PlotLine("空头挂单", ordershort, r[r.length - 1].Time)
            $.PlotLine("挂单盈利线", profitprice, r[r.length - 1].Time)
            $.PlotLine("挂单止损线", lossprice, r[r.length - 1].Time)

            tblStatus.rows = [];
            tblStatus.rows.push([ContractType, curprice, orderlong, ordershort, profitprice, lossprice, holdType, holdPrice, holdAmount, holdProfit, fail_count, success_count]);
            lastStatus = '`' + JSON.stringify([tblStatus]) + '`';

            LogStatus(lastStatus);

        } else {
            LogStatus("未连接", _D());
        }
        Sleep(interval);
    }
}


template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6