Loading ...

JS构造新对象的心得---关于商品期货交易模板

Author: 小小梦, Created: 2016-05-06 23:29:17, Updated:

JS构造新对象的心得

最近小小梦准备写一个期货的策略,今天重新学习下Z大写的商品期货的交易类库,看到下面这段时,看不明白了。所以写篇文章以防以后忘记。先上代码! img

//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());
}

看到这,我想初学JS的同学也和我一样,对上面的代码有茫茫多的问号。Z大的模板我们不仅要会用,还要知道是怎么运作的,这样才能做到得心应手的写策略代码,言归正传。

先看看测试的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);
}

运行一下试试,看看结果。 img 可以看到在执行 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()获取盈亏。 分析的浅显,如有错误,欢迎指正! ^-^


More

haifengzchui 分析的很透彻!之前看了半天没看懂!不过我也运行了下你的例子,和你的结果有点不同。 https://dn-filebox.qbox.me/f4cb47a4b16c3aabb49969b3dced9cf752e74c6a.png

xuanxuan 小小梦钻得好深,太难了,我等只管用

逐浪蚊子 看你的分析我都茫然,我这个底子真的有点太差了~ ~!

逐浪蚊子 看你的分析我都茫然,我这个底子真的有点太差了~ ~!

小小梦 ^_^ 我研究研究 修改下 ,之前写的时候,也是才开始学习JS ,对于JS 对象还不是很了解。