Bermain JavaScript dengan orang tua -- membuat mitra kecil yang akan melakukan pembelian dan penjualan -- mengembangkan kode alat yang digunakan robot

Penulis:Mimpi kecil, Dibuat pada: 2017-03-15 11:22:52, Diperbarui pada: 2017-10-11 10:37:43

Bermain dengan orang tua dan orang tua JavaScript membuat mitra kecil untuk membeli dan menjual.


Dalam proses pengembangan robot, banyak potongan-potongan kode kecil yang dikumpulkan, beberapa di antaranya dapat diambil dari program strategi kuantitatifnya sendiri, di sini orang tua mengeluarkan beberapa kode yang ditulisnya untuk membuang tanda kutip, sebagai perbandingan yang ditulis untuk pemula, pembaca benar.

  • 1 {\displaystyle 1} untuk mengkonversi siklus garis K.

    Modul kode ini tidak ditulis sebagai kelas, hanya menulis fungsi, dan juga mudah dimodifikasi dan diperluas di kemudian hari. Fungsi ini adalah K-line untuk mengumpulkan siklus besar berdasarkan data K-line dasar pada periode tertentu. Pada saat biasa melihat pasar, atau ketika menggunakan strategi platform, secara default adalah K-line yang sering digunakan, seperti 1 hari, 1 jam, 1 menit, dll. Sumbernya:https://www.fmz.com/strategy/35986

    // K线周期合成  扩展为 根据基础K线 合成 为任意周期。
    

var cloneObj = function ((obj) { // Fungsi objek yang disalin dalam var str, newobj = obj.constructor === Array? [] : {}; if (typeof obj!== object) { kembali; } lain jika (JSON) { str = JSON.stringify ((obj); // objek seri newobj = JSON.parse ((str); // redirect } lainnya { for (var i in obj) { newobj[i] = typeof obj[i] === Object? cloneObj ((obj[i]) : obj[i]; Aku tidak tahu. Aku tidak tahu. return newobj; Aku tidak tahu. Apa yang terjadi? var DAY = 0; var HOURS = 1; var MINUTES = 2; var isFirstFind = true; var FirstStamp = null; Apa yang terjadi? fungsi GetDHM ((objTime, BaseCycle, NewCycleForMS) { var ret = []; if ((BaseCycle % (1000 * 60 * 60 * 24) === 0) { ret[0] = objTime.getDate ((); ret[1] = hari; }else if ((BaseCycle % (1000 * 60 * 60) === 0) { ret[0] = objTime.getHours ((); ret[1] = HOURS; }else if ((BaseCycle % (1000 * 60) === 0) { ret[0] = objTime.getMinutes (); ret[1] = MINUTES; Aku tidak tahu. if ((NewCycleForMS % (1000 * 60 * 60 * 24) === 0) { ret[2] = HARI; }else if ((NewCycleForMS % (1000 * 60 * 60) === 0) { ret[2] = HOURS; }else if ((NewCycleForMS % (1000 * 60) === 0) { ret[2] = MINUTES; Aku tidak tahu. Return ret; Aku tidak tahu. Apa yang terjadi? fungsi SearchFirstTime ((ret, BaseCycle, NewCycleForMS) { if ((ret[1] === DAY && ret[2] === DAY) { var array_day = []; for ((var i = 1 ; i < 29; i += (NewCycleForMS / BaseCycle)) { array_day.push ((i); Aku tidak tahu. for ((var j = 0 ; j < array_day.length; j++) { if ((ret[0] === array_day[j]) { return true; Aku tidak tahu. Aku tidak tahu. }else if(ret[1] === HOURS && ret[2] === HOURS) { var array_hours = []; for ((var i = 0 ; i < 24; i += (NewCycleForMS / BaseCycle)) { array_hours.push (i); Aku tidak tahu. for ((var j = 0 ; j < array_hours.length ; j++) { if ((ret[0] === array_hours[j]) { return true; Aku tidak tahu. Aku tidak tahu. }else if(ret[1] === MINUTES && ret[2] === MINUTES) { var array_minutes = []; for ((var i = 0; i < 60; i += (NewCycleForMS / BaseCycle)) { array_minutes.push (i); Aku tidak tahu. for ((var j = 0; j < array_minutes.length; j++) { if ((ret[0] === array_minutes[j]) { return true; Aku tidak tahu. Aku tidak tahu. - Apa yang kau lakukan? throw target cycle tidak cocok dengan basis cycle! target cycle milliseconds: + NewCycleForMS + " basis cycle milliseconds: " + BaseCycle; Aku tidak tahu. Aku tidak tahu. Apa yang terjadi? fungsi Calc_High ((AssRecords, n, BaseCycle, NewCycleForMS) { var max = AssRecords[n].High; for ((var i = 1 ; i < NewCycleForMS / BaseCycle; i++) { max = Math.max ((AssRecords[n + i].High, max); Aku tidak tahu. return max; Aku tidak tahu. Apa yang terjadi? fungsi Calc_Low ((AssRecords, n, BaseCycle, NewCycleForMS) { var min = AssRecords[n].Low; for ((var i = 1 ; i < NewCycleForMS / BaseCycle; i++) { Min = Math.min ((AssRecords[n + i].Low, min); Aku tidak tahu. return min; Aku tidak tahu. Apa yang terjadi? fungsi AssembleRecords (rekaman, NewCycleForMS) { var AssRecords = records.slice(0); // Menyalin dalam var AfterAssRecords = [];

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线周期过小!";
}

// Menentukan titik waktu, menemukan titik awal garis K dasar terhadap garis K target. var objTime = new Date (); for (var i = 0; i < AssRecords.length; i++) { objTime.setTime ((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; // Waktu terakhir tidak dapat diubah, 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++) { max = Math.max ((max, AssRecords[index_n].High); Min = Math.min (min, AssRecords[index_n].Low); Aku tidak tahu. BarObj.High = max; BarObj.Low = min; AfterAssRecords.push ((cloneObj ((BarObj)));

return AfterAssRecords;

Aku tidak tahu. Apa yang terjadi? function main() { // Kode pengujian while(!exchange.IO("status")) { LogStatus (http://www.logstatus.com/) Aku tidak tahu. var Info = _C ((exchange.SetContractType, Phosphate MA705); // Sintesis data K-line kontrak metanol 705 var records = exchange.GetRecords (); while (!records.length < 24) { records = exchange.GetRecords (); Aku tidak tahu.
// Mengatasi parameter antarmuka, jika Anda menulis kebijakan Anda sendiri, Anda dapat merujuknya var Num_UI_NewCycleForMS = 1; var arrayNum = UI_NewCycleForMS.split (("*"); for ((var indexNum = 0 ; indexNum < arrayNum.length ; indexNum++) { Num_UI_NewCycleForMS = Num_UI_NewCycleForMS * Number ((arrayNum[indexNum]); Aku tidak tahu. Log (( masa millisecond siklus kustom adalah: , Num_UI_NewCycleForMS);
while ((true) { records = _C ((exchange.GetRecords); // Log (( data K-line asli: batang panjang, records.length, data batang: batang, records); records = AssembleRecords ((records, Num_UI_NewCycleForMS); // Parameter pertama adalah garis K dasar, parameter kedua adalah milisekund siklus yang akan dikonversi, 1000 * 60 * 20 yang berarti konversi menjadi 20 menit // Log (() setelah mengubah data K-line: panjang log, records.length, data log: panjang log, records); $2.PlotRecords (rekaman, Bitcoin); / throw stop ; / ceshi Sleep ((1000); Aku tidak tahu. Aku tidak tahu.


- #### 2、传统期货差价监控 (CTP)

当需要分析两个品种差价走势的时候,会用上这段代码。有时候也会把这段代码修改集成到自己的策略程序里面(比如跨期对冲策略),代码会绘制出一个差价走势图,在学习如何让机器人程序画图也是很有帮助的,很好的例子。
源码地址: https://www.fmz.com/strategy/5379

var __lastDiff = 0; var __AType = [Last,Buy,Sell][AType]; var __BType = [Last,Buy,Sell][BType]; Apa yang terjadi? fungsi _N ((v, precision) { if (typeof(precision)!= number) { Precision = 4; Aku tidak tahu. var d = parseFloat ((v.toFixed ((Math.max ((10, precision + 5))); s = d.toString (().split ((""); if (s.length < 2つの s[1].length <= precision) { kembali d; Aku tidak tahu. Apa yang terjadi? var b = Math.pow ((10, precision); return Math.floor ((d * b) / b; Aku tidak tahu. Apa yang terjadi? fungsi EnsureCall ((method) { Tidak, tidak, tidak. while (!(r = method.apply(this, Array.prototype.slice.call ((arguments).slice))) { Sleep (Interval); Aku tidak tahu. kembali r; Aku tidak tahu. Apa yang terjadi? fungsi on Tick (() { var a = EnsureCall ((exchange.SetContractType, AInstrument); var tickerA = EnsureCall (exchange.GetTicker); var b = EnsureCall ((exchange.SetContractType, BInstrument); var tickerB = EnsureCall (exchange.GetTicker); var diff = _N ((ticker A [__AType] - ticker B [__BType]); LogStatus ((a.InstrumentName, _N ((tickerA[__AType]), b.InstrumentName, _N ((tickerB[__BType]), perbedaan nilai: , diff); Jika (__lastDiff! = 0) { if (Math.abs(Math.abs(diff) - Math.abs ((__lastDiff)) > 200) { kembali; Aku tidak tahu. Aku tidak tahu. if (diff!= __lastDiff) { // add menambahkan data ke serial, dengan format parameter [series serial, data]; __chart.add (([0, [new Date (().getTime ((), diff))); __lastDiff = diff; Aku tidak tahu. Aku tidak tahu. Apa yang terjadi? fungsi main (() { if (exchange.GetName().indexOf(Futures_CTP) == -1) { Taruhan ini hanya mendukung opsi futures (CTP) tradisional. Aku tidak tahu. SetErrorFilter ((logininreadydefendflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflowcontrolflow)); // Fungsi Chart harus diteruskan oleh struktur yang tidak terkait dengan konteksnya (tambahkan aturan HighStocks, detail parameter Cara menggunakan HighStocks) __chart = Chart (dalam bahasa Inggris) tooltip: { xDateFormat: %Y-%m-%d %H:%M:%S, %A Aku tidak tahu. title: { text: Gambar analisis harga titanium Aku tidak tahu. rangeSelector: { Tunggu sebentar. "Mengharukan" adalah ungkapan yang sering diucapkan oleh para pengunjuk rasa. Count: 1, text: 1h {\cH00FFFF}, {\cH00FFFF} "Mengharukan" adalah ungkapan yang sering diucapkan oleh para pengunjuk rasa. Count: 3 text: 3h {\cH00FFFF}, {\cH00FFFF} "Mengharukan" adalah ungkapan yang sering diucapkan oleh para pengunjuk rasa. Jumlah: 8, text: 8h {\cH00FFFF}, {\cH00FFFF} "Mengharukan" adalah kata pengantar dari kata pengantar. text: All Aku tidak tahu apa yang terjadi. selected: 0, inputEnabled: false Aku tidak tahu. xAxis: { type: Tangga waktu tanggal Aku tidak tahu. Jadi kita bisa melihat PlotLines: [{] nilai: NormalDiff, Warna: Kuning-hijau, DashStyle: ShortDash adalah sebuah aplikasi yang digunakan untuk membuat gambar. width: 1, {\cH00FFFF}, {\cH00FFFF} nilai: HighDiff, Warna: Merah Putih DashStyle: ShortDash adalah sebuah aplikasi yang digunakan untuk membuat gambar. width: 1, {\cH00FFFF}, {\cH00FFFF} nilai: - NormalDiff, Warna: Kuning-hijau, DashStyle: ShortDash adalah sebuah aplikasi yang digunakan untuk membuat gambar. width: 1, {\cH00FFFF}, {\cH00FFFF} nilai: - HighDiff, Warna: Merah Putih DashStyle: ShortDash adalah sebuah aplikasi yang digunakan untuk membuat gambar. width: 1, Aku tidak tahu. Aku tidak tahu. seri: [{ Name: Harga aluminium yang buruk, data: [], tooltip: { valueDecimals: 2 Aku tidak tahu. Aku tidak tahu. }); // reset Menghapus semua informasi sebelum grafik // __chart.reset (); var a = EnsureCall ((exchange.SetContractType, AInstrument); var b = EnsureCall ((exchange.SetContractType, BInstrument); Log ((a.InstrumentName + . + __AType, -, b.InstrumentName + . + __BType, perbedaan yang dibuat sebagai hasil yang ditampilkan pada tabel); TickInterval = Math.max ((TickInterval, 50); Interval = Math.max (Interval, 50); sementara (benar) { onTick (); Sleep (Tick Interval); Aku tidak tahu. Aku tidak tahu.


- #### 3、CTP手动全平CTP商品期货持仓

在Simnow 上测试 商品期货策略时经常需要把已经开过的仓位平掉重新测试代码,这样就需要个类似一键平仓的程序来处理 恢复模拟账号未开仓状态。这里使用了一个交易处理模块: $.NewPositionManager 就是该模块的接口函数,作用是生成一个对象,可以调用该对象的方法处理具体操作,比如 全平仓: CoverAll(); 。  做了一点额外的功能,在全部平仓完以后,会打印出所有交易的标的物名称。

var p = $.NewPositionManager ((); Fungsi utama sementara (benar) Jikaexchange.IO("status") === true) { p.CoverAll (); var positions = _C (exchange.GetPosition); if ((positions.length === 0) { Log ((positions is :, positions); "Mengenai apa yang terjadi?" Aku tidak tahu. - Apa yang terjadi? LogStatus (tidak terhubung ke server, sedang menunggu); Aku tidak tahu. Sleep ((2000); Aku tidak tahu. Var dict =exchange.IO("instruments"); // Kembali daftar semua produk di bursa {nama produk: detail} for ((var k in dict) { Log ((Nama produk: , k, Informasi lebih lanjut: Nama produk: , dict[k]); Aku tidak tahu. Log ((exit., _C ((exchange.GetPosition)); Aku tidak tahu.

  
- #### 4、商品期货主力合约过滤

  在处理商品期货合约的连续性时会遇到主力合约的问题,如何更快的过滤识别出主力合约呢? 同样也写了个代码模块,可以改造,嵌入,或者单独使用。
  在 filter 变量中指定要 扫描的合约代码头。(即不含日期信息的合约代码的部分)  
    

var str = null; Var strArray = []; fungsi main (() { var filter = [MA,CF,zn,SR,pp,l,ni,i,v,jm,al,jd,cs,p]; produk var = []; Log (yang menunggu untuk terhubung ke server transaksi); while (!exchange.IO("status")) Sleep ((1000); Log (yang mulai mendapatkan semua kontrak); var instruments = _Cexchange.IO"Mengharukan" adalah sebuah istilah yang digunakan oleh para ilmuwan di dunia. Log (mencari daftar kontrak yang berhasil); var len = 0; untuk (var instrumentId in instruments) { len++; Aku tidak tahu. Log (length of the list of contracts is: log, len); untuk (var instrumentId in instruments) { if (instruments[instrumentId].IsTrading) { var found = false; for (var i = 0; i < filter.length; i++) { if (instruments[instrumentId].ProductID == filter[i]) { found = true; Aku tidak tahu. Aku tidak tahu. if (!found) { Teruskan; Aku tidak tahu. if (typeof(products[instruments[instrumentId].ProductID]) === undefined) { products[instruments[instrumentId].ProductID] = []; Aku tidak tahu. produk[instruments[instrumentId].ProductID].push ((instrumentId); produk[instruments[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId]; produk[instrumentId] Aku tidak tahu. Aku tidak tahu. for (var produk dalam produk) { var ss = products[product]; Log (( Subscribe to, product, of, ss.length, contract, to identify the main contract); Var vol = 0, VolIdx = 0; for (var i = 0; i < ss.length; i++) { _C ((exchange.SetContractType, ss[i]); Aku tidak tahu. Sleep ((5000); for (var i = 0; i < ss.length; i++) { _C ((exchange.SetContractType, ss[i]); Var ticker = exchange.GetTicker ();

        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 (() {// Fungsi yang bertanggung jawab untuk interaksi, interaksi diperbarui secara real-time Nilai terkait, pengguna yang akrab dapat memperluas sendiri var keyValue = 0;// Parameter yang dikirimkan oleh perintah var way = null; // rute var cmd = GetCommand ((); // Dapatkan API perintah interaktif Jika (cmd) { Log (jika Anda menekan tombol: log, cmd);/ log ditampilkan ArrStr = cmd.split ((":"); // fungsi GetCommand kembali adalah sebuah string, di sini saya menyelesaikan masalah karena ingin membiasakan diri dengan JSON //, jadi pertama-tama kita akan memproses string, dan kemudian kita akan membagi string yang dikembalikan menjadi dua string dengan: nomor.

  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 ((); // Panggilan API untuk mendapatkan pesan dari kontrol interaktif antarmuka. if (cmd) { // Mengetahui apakah ada pesan var js = cmd.split ((:, 2) [1]; // pemisahan Mesej yang dikembalikan String, dibatasi untuk mengembalikan 2, membuat elemen indeks menjadi 1 Atur nilai ke variabel yang bernama js Log (( menjalankan kode debugging:??, js); // output Kode yang dijalankan try { // Mengidentifikasi keanehan eval ((js); // Mengeksekusi fungsi eval, yang mengeksekusi parameter yang dikirimkan ((kode)). } catch(e) { // Membuang Keanehan Log ((Exception, e); // Menghasilkan informasi yang salah Aku tidak tahu. Aku tidak tahu.




当然还有很多代码工具尽在 : https://www.fmz.com/square


#### 先写到这,欢迎读者给我留言!提出建议和意见,如果感觉好玩可以分享给更多热爱程序热爱交易的朋友 
https://www.fmz.com/bbs-topic/735

### 程序员 littleDream 原创

Lebih banyak