ロボット開発の過程で多くの小さなコード片段が蓄積され,そのいくつかは自分の定量化戦略プログラムに借用することができます.
このコードモジュールは,クラスバックリとして書かれていない,ただ関数を書いているだけで,後期に修正し拡張することも便利である. その役割は,特定の周期の基礎K線データに基づいて,大きな周期を合成するK線である. 通常の市場を見たり,またはプラットフォームの策略を書いているとき,デフォルトは,通常使用される周期のK線である. 例えば1日,1時間,1分,など. 他の周期のデータ,例えば4時間,6時間,8時間のK線を処理する必要がある場合は,自分で手動する必要があります. だからこれを書いた. ソースアドレス:https://www.fmz.com/strategy/35986
// K线周期合成 扩展为 根据基础K线 合成 为任意周期。
var cloneObj = function ((obj) { // ディープコピーオブジェクト関数
var str, newobj = obj.constructor === Array? [] : {};
if (typeof obj!==
if(!records || records.length < 2){
throw (!records) ? "传入的records参数为 错误" + records : "基础K线长度小于2";
}
var BaseCycle = records[records.length - 1].Time - records[records.length - 2].Time;
if(NewCycleForMS % BaseCycle !== 0){
throw "目标周期‘" + NewCycleForMS + "’不是 基础周期 ‘" + BaseCycle + "’ 的整倍数,无法合成!";
}
if(NewCycleForMS / BaseCycle > records.length){
throw "基础K线数量不足,请检查是否基础K线周期过小!";
}
// 時間軸を判定し,基線Kの開始時刻を目標線Kの開始時刻と比較して探します. var objTime = new Date (((); この項目は, for (var i = 0; i < AssRecords.length; i++) { オブジェタイム.セットタイム ((AssRecords[i].Time); var ret = GetDHM ((objTime,BaseCycle,NewCycleForMS));
if (isFirstFind === true && SearchFirstTime(ret, BaseCycle, NewCycleForMS) === true) {
FirstStamp = AssRecords[i].Time;
for (j = 0; j < i; j++) {
AssRecords.shift(); // 把目标K线周期前不满足合成的数据排除。
}
isFirstFind = false;
break; // 排除后跳出
}else if(isFirstFind === false){
if((AssRecords[i].Time - FirstStamp) % NewCycleForMS === 0){
for (j = 0; j < i; j++) {
AssRecords.shift(); // 把目标K线周期前不满足合成的数据排除。
}
break;
}
}
}
var BarObj = { // 定义一个 K线柱结构
Time: 0,
Open: 0,
High: 0,
Low: 0,
Close: 0,
Volume: 0,
};
var n = 0;
for (n = 0; n < AssRecords.length - (NewCycleForMS / BaseCycle); n += (NewCycleForMS / BaseCycle)) { // 合成
/*
{
Time :一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
Open :开盘价
High :最高价
Low :最低价
Close :收盘价
Volume :交易量
}
*/
BarObj.Time = AssRecords[n].Time;
BarObj.Open = AssRecords[n].Open;
BarObj.High = Calc_High(AssRecords, n, BaseCycle, NewCycleForMS);
BarObj.Low = Calc_Low(AssRecords, n, BaseCycle, NewCycleForMS);
BarObj.Close = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Close;
BarObj.Volume = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Volume;
AfterAssRecords.push(cloneObj(BarObj));
}
BarObj.Time = AssRecords[n - (NewCycleForMS/BaseCycle) ].Time + NewCycleForMS; // 最後の時間は変更できません. BarObj.Open = AssRecords[n].Open; BarObj.Open = AssRecords[n].Open; BarObj.Open = AssRecords[n].Open; BarObj.Open = AssRecords[n].Open; BarObj.Open = AssRecords[n].Open; BarObj.Open = AssRecords[n].Open; BarObj.Open = AssRecords[n].Open; バール・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ BarObj.Close = AssRecords [AssRecords.length - 1].Close; BarObj.Volume = AssRecords[AssRecords.length - 1].Volume; ファイルファイル: ファイルファイル: ファイルファイル: ファイルファイル: ファイルファイル: var max = AssRecords[n].High; var min = AssRecords[n].Low; for ((var index_n = n + 1 ;index_n < AssRecords.length; index_n++) { 計算機は,数値値で,数値で,数値で 低値で計算される数値です. {cH00ffff} BarObj.High = max; BarObj.Low = min; AfterAssRecords.push ((cloneObj ((BarObj))));
return AfterAssRecords;
ありがとうございました.
ありがとうございました.
function main() { // テストコード
ワイルド・オブ・ザ・ウィズexchange.IO(status) (状態) {
ログステータス (LogStatus)
{cH00ffff}
var Info = _C ((exchange.SetContractType,
// インタフェースのパラメータを処理します.
var Num_UI_NewCycleForMS = 1 について
var arrayNum = UI_NewCycleForMS.split (("*");
for ((var indexNum = 0 ; indexNum < arrayNum.length ; indexNum++) {
Num_UI_NewCycleForMS = Num_UI_NewCycleForMS * 番号 (arrayNum[indexNum]);
{cH00ffff}
Log (
while (true) { と表示する
records = _C (exchange.GetRecords);
// Log (
- #### 2、传统期货差价监控 (CTP)
当需要分析两个品种差价走势的时候,会用上这段代码。有时候也会把这段代码修改集成到自己的策略程序里面(比如跨期对冲策略),代码会绘制出一个差价走势图,在学习如何让机器人程序画图也是很有帮助的,很好的例子。
源码地址: https://www.fmz.com/strategy/5379
var __lastDiff = 0;
var __AType = [
- #### 3、CTP手动全平CTP商品期货持仓
在Simnow 上测试 商品期货策略时经常需要把已经开过的仓位平掉重新测试代码,这样就需要个类似一键平仓的程序来处理 恢复模拟账号未开仓状态。这里使用了一个交易处理模块: $.NewPositionManager 就是该模块的接口函数,作用是生成一个对象,可以调用该对象的方法处理具体操作,比如 全平仓: CoverAll(); 。 做了一点额外的功能,在全部平仓完以后,会打印出所有交易的标的物名称。
var p = $.NewPositionManager (新位置管理者) ";
機能 main ((() {
真実である
もしexchange.IOこの状態は,
p.CoverAll ((());
var positions = _C ((exchange.GetPosition) );
if ((positions.length === 0) {
ログ (
- #### 4、商品期货主力合约过滤
在处理商品期货合约的连续性时会遇到主力合约的问题,如何更快的过滤识别出主力合约呢? 同样也写了个代码模块,可以改造,嵌入,或者单独使用。
在 filter 变量中指定要 扫描的合约代码头。(即不含日期信息的合约代码的部分)
変数値が 0 になります.
変数列は,
main ((() {の関数について
var filter = [
if (ticker) {
var obj = JSON.parse(exchange.GetRawJSON());
if (obj.OpenInterest > vol) {
vol = obj.OpenInterest;
volIdx = i;
}
}
}
// 取消订阅行情(之后此合约K线将停止收集), 当然也可以不取消, 这里演示用
for (var i = 0; i < ss.length; i++) {
_C(exchange.SetContractType, "-" + ss[i]);
}
strArray.push(ss[volIdx]);
Log("主力合约为", ss[volIdx], "持仓", vol, '#ff0000');
}
for(var i = 0 ; i < strArray.length; i++){
str += strArray[i] + ',';
}
Log("主力合约:", str);
}
- #### 5、交互模块
有时候需要给机器人交互,需要下命令、改参数、获取详细运行状态参数 就需要交互代码了。
function get_Command() {// インタラクションを担当する関数,インタラクションをタイムリー更新する.関連する数値,熟悉したユーザが自力で拡張することができます. var keyValue = 0;// コマンドが送信したパラメータ 数値 変数で表示する var cmd = GetCommand ((); //取得 インタラクティブコマンド API if (cmd) { を表示する ログ (ボタンを押すと: ログ,cmd);//ログが表示される この関数は,JSON を理解したいので,ここで処理したトラブルは終わりました. // は,文字列を処理し,函数に戻す文字列を: で2つの文字列に分割します.
if(arrStr.length === 2){//接受的不是 按钮型的,是数值型。
jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新
//拼接 ,拼接成 JSON 字符串 用于转换为JSON 对象。
jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象
for(var key in jsonObj){ // 遍历对象中的 成员名
keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
}
if(arrStr[0] == "upDateAmount"){// 此处为 数字型 。这里处理分为 按钮 和 数字型 。 详见 策略参数 设置界面 下的 交互设置
way = 1;
}
if(arrStr[0] == "扩展1"){
way = 2;
}
if(arrStr[0] == "扩展2"){
way = 3;
}
if(arrStr[0] == "扩展3"){
way = 4;
}
}else if(arrStr.length === 1){// 此处为 按钮型
//路由
if(cmd == "cmdOpen"){
way = 0;
}
if(cmd == "cmdCover"){
way = 5;
}
}else{
throw "error:" + cmd + "--" + arrStr;
}
switch(way){ // 分支选择 操作
case 0://处理 发出开仓信号
tiaojian = 1;
break;
case 1://处理
Amount = keyValue;//把交互界面设置的 数值 传递给 Amount
Log("开仓量修改为:",Amount);//提示信息
break;
case 2://处理
break;
case 3://处理
break;
case 4://处理
break;
case 5://处理 发出平仓信号
tiaojian = 2;
break;
default: break;
}
} }
有时我们甚至需要在机器人运行时插入运行JS 代码:
var cmd = GetCommand ((); // API を呼び出し,インターフェースインタラクティブコントローラのメッセージを取得します.
if (cmd) { // メッセージがあるかどうかを判断する
var js = cmd.split ((
当然还有很多代码工具尽在 : https://www.fmz.com/square
#### 先写到这,欢迎读者给我留言!提出建议和意见,如果感觉好玩可以分享给更多热爱程序热爱交易的朋友
https://www.fmz.com/bbs-topic/735
### 程序员 littleDream 原创