// 执行回调函数。把 task 任务 对象 和 交易的结果 ret 对象 传入回调函数。
}
if (task.onFinish) { // 处理 任务的回调函数
task.onFinish(task, ret);
}
return self.ERR_SUCCESS;
}
self.poll = function() { // 迭代执行 弹出 tasks 中的任务 ,并调用 pollTask 执行任务。
var processed = 0 // 未执行完成的任务计数 ,每次初始0
_.each(self.tasks, function(task) { // 迭代 可以搜索 _.each 的用法
if (!task.finished) { // 如果 任务不是完成状态,
processed++ // 未完成任务 计数 累计
self.pollTask(task) // 执行弹出的任务
}
})
if (processed == 0) { // 如果没有未完成的任务,即 所有任务队列内的任务完成 ,执行清空 队列对象中 tasks 数组.
self.tasks = []
}
}
self.size = function() { // 给队列对象添加 函数 size 获取 任务队列 中 任务个数
return self.tasks.length
}
return self // 返回构造好的队列对象
}
$.AccountToTable = AccountToTable; // 把 AccountToTable 引用传递给 导出函数 (接口)
// 测试用 主函数 function main() { var p = $.NewPositionManager(); p.OpenShort(“MA701”, 1); p.OpenShort(“MA705”, 1); Log(p.GetPosition(“MA701”, PD_SHORT)); Log(p.GetAccount()); Log(p.Account()); Sleep(60000 * 10); p.CoverAll(); LogProfit(p.Profit()); Log($.IsTrading(“MA701”)); // 多品种时使用交易队列来完成非阻塞的交易任务 var q = $.NewTaskQueue(); q.pushTask(exchange, “MA701”, “buy”, 3, function(task, ret) { // 最后一个参数 function(task,ret){…} 就是一个 匿名函数作为回调函数传入任务对象task Log(task.desc, ret) // 回调函数中 输出了该任务的描述, 和任务完成的返回值,这些是预设,并不会马上执行。 if (ret) { q.pushTask(exchange, “MA701”, “closebuy”, 1, 123, function(task, ret) { // 在第一个压入队列的任务的回调函数中,压入匹配的任务到任务队列。用来实现配对交易。 // 只要第一个任务交易完成就会触发回调函数中的匹配操作。 Log(“q”, task.desc, ret, task.arg) }) } }) while (true) { // 在空闲时调用poll来完成未完成的任务 q.poll() Sleep(1000) } }
- ### 商品期货交易类库现已内置,点击既可以在策略中引用。最新的源码可以点击下图箭头位置获取。
![img](/upload/asset/1d23bb24089bf91c48d.jpg)
如有错误,欢迎斧正。
QQ:359706687
期货程序化 python的呢