商品期货计划委托工具

Author: 扫地僧, Date: 2021-11-04 15:05:31
Tags: 商品期货工具JavaScript


// 全局变量
var _TaskQueue = []
var ENTRUST = 0
var STOPLOSS = 1
var STOPPROFIT = 2 
var BACKHAND = 3
var dictTaskType = ["委托任务", "止损任务", "止盈任务", "反手任务"]

var q = $.NewTaskQueue()


function closeTask (taskType) {
    for (var i = 0; i < _TaskQueue.length; i++) {
        if (taskType == _TaskQueue[i].taskType) {
            _TaskQueue[i].taskFinished = true
            Log("关闭任务:", dictTaskType[taskType])
        }
    }
}

// 任务处理对象
function TaskQueueProcess () {
    // 获取行情
    exchange.SetContractType(_EntrustSymbol)
    var ticker = _C(exchange.GetTicker)

    for (var i = 0; i < _TaskQueue.length; i++) {
        var task = _TaskQueue[i]
        if (task.taskFinished == false && task.taskType == ENTRUST && task.taskTrigger * ticker.Last >= task.taskTrigger * task.taskPrice) {
            q.pushTask(exchange, task.taskSymbol, task.taskDirection, task.taskAmount, function(tradeTask, ret) {
                Log(tradeTask.desc, ret, "委托完成")
                if (ret) {
                    // 回调,创建后续任务
                    if (_EntrustStopLossPrice != -1) {     // 创建止损任务
                        var newTask = {
                            taskType : STOPLOSS,
                            taskSymbol : task.taskSymbol,
                            taskPrice : _EntrustStopLossPrice, 
                            taskAmount : task.taskAmount,
                            taskDirection : task.taskDirection == "buy" ? "closebuy" : "closesell",                    
                            taskTrigger : task.taskDirection == "buy" ? -1 : 1,              // 做多止损:低于价格触发,做空止损:高于价格触发
                            taskFinished : false
                        }
                        _TaskQueue.push(newTask)
                        Log("创建止损任务", newTask, "#FF0000")
                    }
                    if (_EntrustStopProfitPrice != -1) {   // 创建止盈任务
                        var newTask = {
                            taskType : STOPPROFIT,
                            taskSymbol : task.taskSymbol,
                            taskPrice : _EntrustStopProfitPrice, 
                            taskAmount : task.taskAmount,
                            taskDirection : task.taskDirection == "buy" ? "closebuy" : "closesell",                    
                            taskTrigger : task.taskDirection == "buy" ? 1 : -1,               // 做多止盈:高于价格触发,做空止盈:低于价格触发
                            taskFinished : false
                        }
                        _TaskQueue.push(newTask)
                        Log("创建止盈任务", newTask, "#FF0000")
                    }
                }
            })
            task.taskFinished = true
            break        
        } else if (task.taskFinished == false && task.taskType == STOPLOSS && ticker.Last * task.taskTrigger >= task.taskPrice * task.taskTrigger) {    
            q.pushTask(exchange, task.taskSymbol, task.taskDirection, task.taskAmount, function(tradeTask, ret) {
                Log(tradeTask.desc, ret, "止损完成")
                // 关闭止盈任务
                closeTask(STOPPROFIT)
                if (ret) {
                    // 回调,创建后续任务
                    if (_EntrustStopLossBackhandPrice != -1) {
                        var newTask = {
                            taskType : BACKHAND,
                            taskSymbol : task.taskSymbol,
                            taskPrice : _EntrustStopLossBackhandPrice, 
                            taskAmount : task.taskAmount,
                            taskDirection : task.taskDirection == "closebuy" ? "sell" : "buy",                    
                            taskTrigger : task.taskDirection == "closebuy" ? -1 : 1,   // -1 小于时触发, 1大于时触发
                            taskFinished : false
                        }
                        _TaskQueue.push(newTask)
                        Log("创建反手任务", newTask, "#FF0000")
                    }
                }
            })
            task.taskFinished = true
            break
        } else if (task.taskFinished == false && task.taskType == STOPPROFIT && ticker.Last * task.taskTrigger >= task.taskPrice * task.taskTrigger) {    
            q.pushTask(exchange, task.taskSymbol, task.taskDirection, task.taskAmount, function(tradeTask, ret) {
                Log(tradeTask.desc, ret, "止盈完成")
                // 关闭止损任务
                closeTask(STOPLOSS)
            })
            task.taskFinished = true
            break
        } else if (task.taskFinished == false && task.taskType == BACKHAND && ticker.Last * task.taskTrigger >= task.taskPrice * task.taskTrigger) {    
            q.pushTask(exchange, task.taskSymbol, task.taskDirection, task.taskAmount, function(tradeTask, ret) {
                Log(tradeTask.desc, ret, "反手完成")
            })
            task.taskFinished = true
            break
        }
    }
    q.poll()
}

function main() {
    if (_IsRecovery) {
        recoveryData = _G("_TaskQueue")
        if (!recoveryData) {
            _TaskQueue = recoveryData
        } else {
            Log("没有可用于恢复的数据")
        }
    }

    // 根据参数生成任务
    if (_EntrustSymbol == "null" || _EntrustPrice <= 0 || _EntrustAmount <= 0) {
        throw "没有设置委托合约或者委托价格无效或者委托数量无效"
    } else {
        var task = {
            taskType : ENTRUST,
            taskSymbol : _EntrustSymbol,
            taskPrice : _EntrustPrice, 
            taskAmount : _EntrustAmount,
            taskDirection : _EntrustMode == 0 ? "buy" : "sell",                     
            taskTrigger : _EntrustTriggerType == 0 ? 1 : -1,                        
            taskFinished : false
        }

        Log("请注意,创建委托任务", task, "#FF0000")
        _TaskQueue.push(task)
    }
    

    while (true) {
        if (exchange.IO("status")) {
            TaskQueueProcess()
            // 状态栏显示
            LogStatus(_D(), "已连接")
        } else {
            LogStatus(_D(), "未连接")
        }
        Sleep(500)
    }
}

// 扫尾取消所有挂单
function onexit(){
    Log("策略停止,保存数据:", _TaskQueue)
    _G("_TaskQueue", _TaskQueue)
}

function onerror(){
    Log("策略异常停止,保存数据:", _TaskQueue)
    _G("_TaskQueue", _TaskQueue)
}




相关内容

更多内容