avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Dicipta dalam: 2021-05-28 09:50:12, dikemas kini pada: 2023-09-21 21:06:08
comments   14
hits   2531

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Dalam artikel sebelumnya, kami menerangkan analisis logik perdagangan strategi grid mudah Dalam artikel ini, kami akan terus melengkapkan reka bentuk strategi pengajaran ini.

  • Analisis logik transaksi Dalam artikel sebelumnya, kami menyebut bahawa selagi kami melintasi setiap garisan grid grid dan menentukan sama ada harga semasa melintasi garisan grid di atas atau di bawah garisan grid, tindakan transaksi boleh dicetuskan. Tetapi sebenarnya, masih terdapat banyak butiran logik yang tidak memahami penulisan strategi sering membentuk persepsi yang salah bahawa “logiknya sangat mudah, dan kodnya hanya perlu beberapa baris, tetapi dalam penulisan sebenar, masih ada. banyak butiran.”

Perincian pertama yang perlu kita pertimbangkan ialah reka bentuk grid tak terhingga. Ingat dalam artikel lepas kami mereka bentuk fungsi untuk menjana struktur data grid awalcreateNetapa? Fungsi ini menjana struktur data grid dengan bilangan talian grid yang terhingga. Jadi bagaimana jika harga melebihi sempadan struktur data grid ini (melangkaui garis grid teratas dengan harga tertinggi dan garis grid bawah dengan harga terendah) apabila strategi berjalan? Jadi kita perlu menambah mekanisme sambungan pada struktur data grid terlebih dahulu.

Mula menulis fungsi utama strategi, iaitu kod yang memulakan pelaksanaan strategi.

  var diff = 50                                 // 全局变量,网格间距,可以设计成参数,方便讲解,我们把这个参数写死在代码里。
  function main() {
      // 实盘开始运行后,从这里开始执行策略代码
      var ticker = _C(exchange.GetTicker)       // 获取市场最新的行情数据ticker,ticker这个数据的结构参看FMZ API文档:https://www.fmz.com/api#ticker
      var net = createNet(ticker.Last, diff)    // 我们上篇设计的初始构造网格数据结构的函数,这里构造一个网格数据结构net

      while (true) {                            // 然后程序逻辑就进入了这个while死循环,策略执行到此将不停的循环执行这里{}符号之内的代码
          ticker = _C(exchange.GetTicker)       // 死循环代码部分的第一行,获取最新的行情数据,更新给ticker变量
          // 检查网格范围
          while (ticker.Last >= net[net.length - 1].price) {
              net.push({
                  buy : false,
                  sell : false,
                  price : net[net.length - 1].price + diff,
              })
          }
          while (ticker.Last <= net[0].price) {
              var price = net[0].price - diff
              if (price <= 0) {
                  break
              }
              net.unshift({
                  buy : false,
                  sell : false,
                  price : price,
              })
          }

          // 还有其它代码...
      }
  }

Kod yang menjadikan struktur data grid boleh dilanjutkan ialah ini (dipetik daripada kod di atas):

        // 检查网格范围
        while (ticker.Last >= net[net.length - 1].price) {   // 如果价格超过网格最高价格的网格线
            net.push({                                       // 就在网格最高价格的网格线之后加入一个新的网格线
                buy : false,                                 // 初始化卖出标记
                sell : false,                                // 初始化买入标记
                price : net[net.length - 1].price + diff,    // 在之前最高价格的基础上再加一个网格间距
            })
        }
        while (ticker.Last <= net[0].price) {                // 如果价格低于网格最低价格的网格线
            var price = net[0].price - diff                  // 区别于向上添加,要注意向下添加新网格线的价格不能小于等于0,所以这里要判断
            if (price <= 0) {                                // 小于等于0就不添加了,跳出这层循环
                break
            }
            net.unshift({                                    // 就在网格最低价格的网格线之前添加一个新的网格线
                buy : false,
                sell : false,
                price : price,
            })
        }

Langkah seterusnya ialah mempertimbangkan cara untuk melaksanakan pencetusan transaksi secara terperinci.

  var diff = 50
  var amount = 0.002       // 增加一个全局变量,也可以设计成参数,当然为了简便讲解,我们也写死在策略代码,
                           // 这个参数控制每次网格线上触发交易时的交易量
  function main() {
      var ticker = _C(exchange.GetTicker)
      var net = createNet(ticker.Last, diff)
      var preTicker = ticker       // 在主循环(死循环)开始前,设置一个变量,记录上一次的行情数据
      while (true) {
          ticker = _C(exchange.GetTicker)
          // 检查网格范围
          while (ticker.Last >= net[net.length - 1].price) {
              net.push({
                  buy : false,
                  sell : false,
                  price : net[net.length - 1].price + diff,
              })
          }
          while (ticker.Last <= net[0].price) {
              var price = net[0].price - diff
              if (price <= 0) {
                  break
              }
              net.unshift({
                  buy : false,
                  sell : false,
                  price : price,
              })
          }  

          // 检索网格
          for (var i = 0 ; i < net.length ; i++) {     // 遍历网格数据结构中的所有网格线
              var p = net[i]
              if (preTicker.Last < p.price && ticker.Last > p.price) {         // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
                  if (i != 0) {
                      var downP = net[i - 1]
                      if (downP.buy) {
                          exchange.Sell(-1, amount, ticker)
                          downP.buy = false 
                          p.sell = false 
                          continue
                      }
                  }
                  if (!p.sell && !p.buy) {
                      exchange.Sell(-1, amount, ticker)
                      p.sell = true
                  }
              } else if (preTicker.Last > p.price && ticker.Last < p.price) {  // 下穿,买入
                  if (i != net.length - 1) {
                      var upP = net[i + 1]
                      if (upP.sell) {
                          exchange.Buy(-1, amount * ticker.Last, ticker)
                          upP.sell = false 
                          p.buy = false 
                          continue
                      }
                  }
                  if (!p.buy && !p.sell) {
                      exchange.Buy(-1, amount * ticker.Last, ticker)
                      p.buy = true 
                  } 
              }
          }
          preTicker = ticker    // 把当前的行情数据记录在preTicker中,在下一次循环中,作为“上一次”行情数据和最新的对比,判断上穿下穿
          Sleep(500)
      }
  }  

Anda boleh lihat:

  • Melintasi keadaan garisan grid:preTicker.Last < p.price && ticker.Last > p.price
  • Melintasi keadaan garisan grid:preTicker.Last > p.price && ticker.Last < p.price

Inilah yang kita bincangkan dalam artikel sebelum ini:

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Menyilang ke atas atau ke bawah hanyalah langkah pertama dalam menentukan sama ada perdagangan boleh diletakkan, yang juga memerlukan penentuan tanda dalam data garis grid.

Jika ia adalah lintasan menaik, harga dinilai lebih rendah daripada garis grid semasa dan tanda beli pada garis grid terdekat Jika nilai tanda beli adalah benar, ia bermakna garisan grid sebelumnya telah dibeli. dan garis grid sebelumnya ditetapkan semula tanda beli akar adalah palsu, dan tanda jualan baris grid semasa ditetapkan semula kepada palsu.

Selepas menilai keadaan sebelumnya, jika ia tidak dicetuskan, teruskan menilai Jika tanda beli/jual pada garisan grid semasa kedua-duanya adalah palsu, bermakna garisan grid semasa boleh didagangkan Oleh kerana ia adalah lintasan ke atas, kita laksanakan operasi jual di sini Selepas pelaksanaan Tandakan bendera jualan garis grid semasa sebagai benar.

Logik untuk mengendalikan laluan bawah adalah sama (ini dibiarkan untuk difikirkan oleh pemula).

Selesaikan ujian balik strategi

Untuk melihat beberapa data ujian belakang, fungsi ditulisshowTblPaparkan data.

function showTbl(arr) {
    var tbl = {
        type : "table", 
        title : "网格",
        cols : ["网格信息"],
        rows : []
    }
    var arrReverse = arr.slice(0).reverse()
    _.each(arrReverse, function(ele) {
        var color = ""
        if (ele.buy) {
            color = "#FF0000"
        } else if (ele.sell) {
            color = "#00FF00"
        }
        tbl.rows.push([JSON.stringify(ele) + color])
    })
    LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}

Kod strategi lengkap:

/*backtest
start: 2021-04-01 22:00:00
end: 2021-05-22 00:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"OKEX","currency":"ETH_USDT","balance":100000}]
*/

var diff = 50
var amount = 0.002
function createNet(begin, diff) {
    var oneSideNums = 10
    var up = []
    var down = []
    for (var i = 0 ; i < oneSideNums ; i++) {
        var upObj = {
            buy : false,
            sell : false, 
            price : begin + diff / 2 + i * diff,
        }
        up.push(upObj)

        var j = (oneSideNums - 1) - i
        var downObj = {
            buy : false,
            sell : false,
            price : begin - diff / 2 - j * diff,
        }
        if (downObj.price <= 0) {  // 价格不能小于等于0 
            continue
        }
        down.push(downObj)
    }

    return down.concat(up)
}

function showTbl(arr) {
    var tbl = {
        type : "table", 
        title : "网格",
        cols : ["网格信息"],
        rows : []
    }
    var arrReverse = arr.slice(0).reverse()
    _.each(arrReverse, function(ele) {
        var color = ""
        if (ele.buy) {
            color = "#FF0000"
        } else if (ele.sell) {
            color = "#00FF00"
        }
        tbl.rows.push([JSON.stringify(ele) + color])
    })
    LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}

function main() {
    var ticker = _C(exchange.GetTicker)
    var net = createNet(ticker.Last, diff)
    var preTicker = ticker 
    while (true) {
        ticker = _C(exchange.GetTicker)
        // 检查网格范围
        while (ticker.Last >= net[net.length - 1].price) {
            net.push({
                buy : false,
                sell : false,
                price : net[net.length - 1].price + diff,
            })
        }
        while (ticker.Last <= net[0].price) {
            var price = net[0].price - diff
            if (price <= 0) {
                break
            }
            net.unshift({
                buy : false,
                sell : false,
                price : price,
            })
        }

        // 检索网格
        for (var i = 0 ; i < net.length ; i++) {
            var p = net[i]
            if (preTicker.Last < p.price && ticker.Last > p.price) {         // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
                if (i != 0) {
                    var downP = net[i - 1]
                    if (downP.buy) {
                        exchange.Sell(-1, amount, ticker)
                        downP.buy = false 
                        p.sell = false 
                        continue
                    }
                }
                if (!p.sell && !p.buy) {
                    exchange.Sell(-1, amount, ticker)
                    p.sell = true
                }
            } else if (preTicker.Last > p.price && ticker.Last < p.price) {  // 下穿,买入
                if (i != net.length - 1) {
                    var upP = net[i + 1]
                    if (upP.sell) {
                        exchange.Buy(-1, amount * ticker.Last, ticker)
                        upP.sell = false 
                        p.buy = false 
                        continue
                    }
                }
                if (!p.buy && !p.sell) {
                    exchange.Buy(-1, amount * ticker.Last, ticker)
                    p.buy = true 
                } 
            }
        }

        showTbl(net)
        preTicker = ticker 
        Sleep(500)
    }
}

Ujian Balik Strategi:

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Pemula dalam Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto, sila lihat ini - Membawa Anda Lebih Dekat dengan Dagangan Kuantitatif dalam Bulatan Mata Wang Kripto (V)

Ia boleh dilihat bahawa ciri-ciri strategi grid adalah bahawa akan terdapat kerugian terapung yang besar apabila terdapat pasaran trend, dan pulangan hanya akan pulih dalam pasaran yang tidak menentu. Oleh itu, strategi grid tidak bebas risiko Strategi spot masih boleh dikekalkan, tetapi strategi grid kontrak hadapan adalah lebih berisiko dan memerlukan tetapan konservatif untuk parameter grid.