1. 首页
  2. 期货软件

技巧:教您如何实施商品期货计划佣金工具

制作产品期货 交易时,并非所有策略都是全自动的交易。有许多半自动编程交易工具代替手动跟踪。尽管这种工具不是完整的策略,但它也是基于用户的交易意图。以有序的方式组织交易也是最简单的交易策略。让我们一起实现交易工具。

半自动交易工具可能有很多要求。我们只是组织一些要求以实现它们。对于更高级和更复杂的要求,我们可以随后进行优化和升级。

商品期货计划委托工具(教学)

根据上述要求,我们可以一一实现这些功能。首先,分析止盈和止损操作是基于初始计划的委托订单交易的。开仓后,将生成操作,因此获利和止损。亏损基于的是稍后将创建第一个计划委托订单。止损反手也基于止损完成后发生的操作。

手把手教你实现一个商品期货计划委托工具

大致就是这样的过程。

苹果手机股票盯盘_手机股票盯盘软件_商品期货盯盘软件

那么这里遇到的第一个问题是商品期货盯盘软件股指期货,当我们设计时,如何完成一个任务,自动创建另一个后续任务?

解决此问题的方法非常简单。 FMZ Quantitative 交易平台提供了强大的模板库,可以使用内置产品期货 交易库轻松解决。

创建每种策略时,该库将包含在模板列中。选中它并保存策略以供参考。

商品期货盯盘软件_苹果手机股票盯盘_手机股票盯盘软件

回到我们的问题,如何使一个任务完成后自动自动创建另一个任务集,我们使用“ product 期货 交易类库”中的$ .NewTaskQueue()函数来创建交易队列控制对象很好。

策略中定义的全局变量

// 全局变量
var _TaskQueue = []    // 任务队列,数据结构是一个数组。
var ENTRUST = 0        // 定义的任务类型,ENTRUST 代表计划委托
var STOPLOSS = 1       // 代表止损委托
var STOPPROFIT = 2     // 代表止盈委托
var BACKHAND = 3       // 代表反手委托
var dictTaskType = ["委托任务", "止损任务", "止盈任务", "反手任务"]     // 委托类型的中文参照,用于程序中显示这些名字
var q = $.NewTaskQueue()   // 创建 商品期货交易类库 交易队列控制对象。

如何使用该对象q?很简单商品期货盯盘软件,下面的代码。 task.taskSymbol是当前任务的合同代码,task.taskDirection是当前任务的交易方向,task.taskAmount是当前任务的订单数量。最后,function(tradeTask,ret){…是解决我们问题的回调函数。可以在当前任务完成后触发此回调函数,以便我们可以轻松地在此回调函数中实现后续任务的创建。

q.pushTask(exchange, task.taskSymbol, task.taskDirection, task.taskAmount, function(tradeTask, ret) {
    Log(tradeTask.desc, ret, "XX委托完成")
    if (ret) {
        // 回调,创建后续任务
        // ...
        // ..
        // .
    }
})

让我们首先看看完整的策略代码:

// 全局变量
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 : -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 : 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)
}

事实上,最重要的是看Task整篇文章中的策略代码。在此函数中,存储在_TaskQueue数组中的任务将被逐一判断,以确定该任务是否有效,并将当前行情条件与特定的Task参数组合在一起,以确定是否满足我们的委托触发条件。当达到触发条件时,将使用模板的q对象执行任务。根据预设的回调函数,当任务执行完成时,将创建后续任务以完成委派过程。

回测测试:

手把手教你实现一个商品期货计划委托工具

手把手教你实现一个商品期货计划委托工具

设置参数时:

手把手教你实现一个商品期货计划委托工具

默认情况下该参数无效。例如,当“订单价格”为-1时期货交易,表示没有订单。止损,获利和反手价格也是如此。设置-1将不会启用此功能。您可以在代码中看到:

手把手教你实现一个商品期货计划委托工具

判断,如果参数集为-1期货开户,则不会在回调函数中创建后续任务。

链接到教学策略:

策略仅用于教学,应谨慎使用。

END

文章来源:期货开户,如若转载,请注明出处:http://www.hjczyzs.com/2636.html

联系我们

97866923

在线咨询:点击这里给我发消息

联系QQ:97866923