//PositionManager对象的 构造函数
var PositionManager = (function() {// (一个匿名函数)(); ==> 立即执行 例如:function a(){alert("我是函数!")} ,声明后立即执行 a();一样
//返回PositionManager 函数 给 构造函数
function PositionManager(e) {//构造函数
if (typeof(e) === 'undefined') {//参数e没有 传递进来的值 执行以下
e = exchange;//把 交易所对象赋值给e
}
if (e.GetName() !== 'Futures_CTP') {//交易所 不是CTP期货 则
throw 'Only support CTP';//抛出 错误信息
}
this.e = e;// 把e 赋值给 var PositionManager = (function() { , var 后的 PositionManager函数对象
this.account = null;// 同上
}
PositionManager.prototype.GetAccount = function() {//prototype是每个函数对象都有的属性,它指向函数原型的引用,
//如果 函数为构造函数,即PositionManager用作构造函数,那么 新生成的对象 会继承prototype 的属性
return _C(this.e.GetAccount);//本函数 给prototype 添加了一个属性函数 GetAccount 函数,获取交易所账户信息
};
PositionManager.prototype.OpenLong = function(contractType, shares) {//同上,开多仓,参数 合约类型(类似商品名称),份数
if (!this.account) {//如果账户信息 不存在 null
this.account = _C(exchange.GetAccount); //获取全局 对象 交易所对象的账户信息
}
return Open(this.e, contractType, PD_LONG, shares);//调用上面的 Open函数 处理开多仓。
};
PositionManager.prototype.OpenShort = function(contractType, shares) {//类似上面,
if (!this.account) {
this.account = _C(exchange.GetAccount);
}
return Open(this.e, contractType, PD_SHORT, shares);//调用Open函数 处理开空仓
};
PositionManager.prototype.Cover = function(contractType) {//平仓
if (!this.account) {
this.account = _C(exchange.GetAccount);
}
return Cover(this.e, contractType);//调用平仓函数
};
PositionManager.prototype.Profit = function(contractType) {//计算 盈亏
var accountNow = _C(this.e.GetAccount);//获取此刻账户信息
return _N(accountNow.Balance - this.account.Balance);//计算盈亏并返回,第一次初始时account为null,不管开仓平仓,会获取一下 账户信息
};
return PositionManager;//返回函数对象
})();
//导出的函数 生成一个 新的 交易管理对象
$.NewPositionManager = function(e) {//JS声明函数的 一种方法,先声明后执行
return new PositionManager(e);//返回 由PositionManager构造函数 生成的新对象,先调用构造函数
};
function main() {//测试 函数
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
Sleep(60000 * 10);
p.Cover("MA609");
LogProfit(p.Profit());
}
先看看测试的main函数,在main函数中声明了一个变量 p 并且调用了导出函数$.NewPositionManager(),那我们先看看这个导出函数: return new PositionManager(e);//返回 由PositionManager构造函数 生成的新对象,先调用构造函数。 导出函数内就只有这一句,就是new了一个对象,并返回。这里new 后面跟一个 函数 就是 构造函数调用(可以查犀牛书,这里不赘述),构造函数返回一个对象,我们继续看构造函数。
var PositionManager = (function() {// (一个匿名函数)(); ==> 立即执行 例如:function a(){alert("我是函数!")} ,声明后立即执行 a();一样
//返回PositionManager 函数 给 构造函数
function PositionManager(e) {//构造函数
if (typeof(e) === 'undefined') {//参数e没有 传递进来的值 执行以下
e = exchange;//把 交易所对象赋值给e
}
if (e.GetName() !== 'Futures_CTP') {//交易所 不是CTP期货 则
throw 'Only support CTP';//抛出 错误信息
}
this.e = e;// 把e 赋值给 var PositionManager = (function() { , var 后的 PositionManager函数对象
this.account = null;// 同上
}
......
代码第一行var PositionManager… 看到PositionManager是一个函数对象,等号后面是(function(){})() 这样的调用,开始我也没看明白,查查资料,这样的调用会马上执行,看到这我们先看看我写的实验例子:
var f1 = (function(){
function f2(x){
Log("f2 aaa ",x);
this.a = 99;
}
Log("bbbbbbb");
return f2;
})();
function main(){
Log("CCC");
var b = new f1(22);
Log(b);
b.a = 87;
Log(b);
}
运行一下试试,看看结果。
可以看到在执行 Log(“CCC”), 之前 先执行了Log(“bbbbbbb”) , (function(){})() 这样的调用方式就是立即执行function后花括号内的代码,但是注意f2这样的函数声明,f2函数并没有先调用(注意,但是f2被返回了,并赋给f1)。看执行的图片,在执行Log(“bbbbbbb”)后执行了main函数中的Log(“CCC”),继续看接下来用new 后面跟函数,就是构造函数调用,f1为构造函数,注意调用构造函数时传入了参数22,生成了新对象赋值给b,你看执行结果可能会奇怪,为什么new f1(22)会导致Log("f2 aaa ",x)执行(参数22传给了x),这是因为之前(function(){})()这样调用方式先执行了,已经返回f2给f1,所以会这样,接下来 Log(b)输出了对象的结构内容,我们看一下在构造函数内执行的赋值this.a = 99,这句就把新生成的对象添加成员a并赋值99,我们修改一下b对象的a成员,改为87,再输出b对象看看是否改变,看到这应该对模板代码PositionManager构造函数的结构了解了吧。
PositionManager构造函数一样,在开始的时候先执行(function(){})()内的代码,你可以看到有好几个类似 PositionManager.prototype.XXX 这样的语句(详细的请查资料,不赘述),这些语句就是给代码中 function PositionManager(e) 这个函数对象添加成员函数(添加了开多仓、开空仓、平仓、计算收益等等成员函数),添加完毕,返回PositionManager函数对象给var PositionManager 这句声明的对象,在执行 return new PositionManager(e) 时 就去执行这段了。
function PositionManager(e) {//构造函数
if (typeof(e) === 'undefined') {//参数e没有 传递进来的值 执行以下
e = exchange;//把 交易所对象赋值给e
}
if (e.GetName() !== 'Futures_CTP') {//交易所 不是CTP期货 则
throw 'Only support CTP';//抛出 错误信息
}
this.e = e;// 把e 赋值给 var PositionManager = (function() { , var 后的 PositionManager函数对象
this.account = null;// 同上
}
初始化新建对象的成员e 、account 。 接下来就是使用了。
function main() {//测试 函数
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
Sleep(60000 * 10);
p.Cover("MA609");
LogProfit(p.Profit());
}
用导出的函数生成一个新对象p,用来管理交易操作,调用对象p的成员函数OpenShort()开空仓,再调用对象p的成员函数Cover()平仓,也可以调用成员函数Profit()获取盈亏。 分析的浅显,如有错误,欢迎指正! ^-^
逐浪蚊子 看你的分析我都茫然,我这个底子真的有点太差了~ ~!
逐浪蚊子 看你的分析我都茫然,我这个底子真的有点太差了~ ~!