La transacción de cuantificación del círculo de monedas es algo nuevo - que te acerca a la cuantificación del círculo de monedas.

El autor:Un sueño pequeño., Creado: 2021-05-28 09:50:12, Actualizado: 2023-09-21 21:06:08

img

El círculo de monedas cuantificados transacciones de nuevo en la vista de la broma que te lleva cerca de la moneda cuantificados (v)

En el artículo anterior, explicamos el análisis lógico de transacciones de una estrategia de red simple, y en este artículo continuamos para completar el diseño de esta estrategia de enseñanza.

  • Análisis lógico de transacciones En el artículo anterior, dijimos que tan solo recorriendo cada línea de red de la red, juzgar el precio actual a través de la línea de red puede desencadenar acciones comerciales. Pero en realidad hay muchos detalles lógicos, a menudo los novatos que no entienden la estrategia de escritura son fáciles de formar una percepción errónea de que la lógica de la red es muy simple, el código debe ser de solo unas pocas líneas, en realidad se escriben muchos detalles.

    Primero, el primer detalle que tenemos que considerar es el diseño de este aspecto de la red infinita. Recuerden que en el artículo anterior diseñamos una función que genera la estructura de datos inicial de la red.createNet¿Qué pasa si, cuando se ejecuta la estrategia, el precio se extiende más allá de los límites de la estructura de datos de la red (más allá de la línea de red más alta y más baja)? Así que primero tenemos que añadir un mecanismo de extensión a la estructura de datos de la red.

    Comienza a escribir la función principal de la política, la función principal es el código que comienza a ejecutarse.

    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,
                })
            }
            
            // 还有其它代码...
        }
    }
    

    Para que la estructura de datos de la red pueda ser extendida, este es el código (seleccionado en el código de arriba):

          // 检查网格范围
          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,
              })
          }
    

    El siguiente paso es considerar cómo concretar el desencadenamiento de transacciones.

    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)
        }
    }  
    

    En la página de Facebook de la organización:

    • Las condiciones para subir a la red:preTicker.Last < p.price && ticker.Last > p.price
    • Las condiciones para pasar por la red son las siguientes:preTicker.Last > p.price && ticker.Last < p.price

    En el artículo anterior hablamos de:

    img

    El paso de arriba a abajo es sólo el primer paso para determinar si se puede realizar un pedido, y también se debe determinar el marcado en los datos de la red.

    Si es sobrecarga, el precio es inferior al precio de la línea de la red actual y la marca de compra en la línea de la red más reciente. Si el valor de la marca de compra es verdadero, indica que la línea de la red anterior fue comprada, vuelve a colocar la marca de compra en la última como falsa, vuelve a colocar la marca de venta en la red actual como falsa.

    Después de juzgar las condiciones que acabamos de ver, si no hay un desencadenante, continúa el juicio, si la marca de compra / venta en la red actual es falsa, significa que la red actual puede ser negociada, ya que es de carga, aquí ejecutamos la operación de venta, después de ejecutar la marca de venta de la red actual.

    La lógica de procesamiento es la misma (deja esto a los novatos para que piensen).

La estrategia completa de retrospección

Para ver algunos de los datos de la revisión, escribo una función.showTblMuestra los datos.

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

El código completo de la estrategia:

/*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)
    }
}

La estrategia de retrospectiva:

img

img

img

Se puede ver las características de la estrategia de la red, cuando se encuentran con un mercado de tendencia, habrá mayores pérdidas y ganancias durante la convulsión del mercado se recuperarán. Por lo tanto, las estrategias de red no son sin riesgo, las estrategias de contado todavía pueden estar acostumbradas a la mediocridad y la dureza, mientras que las estrategias de red de contratos futuros son más riesgosas y requieren una configuración muy conservadora de los parámetros de la red.


Relacionados

Más.

- ¿Qué quieres decir?Es el lenguaje C++.

- ¿ Qué pasa?¿No debería ser cuando se pone a la venta sólo para recorrer una línea de red más alta que el precio actual? También hay exchange.Sell ((-1, amount, ticker) ¿Cómo esta función es diferente de la de los documentos de API, que veo en los documentos de API dice exchange.Sell ((Price, Amount), por qué tienes tres parámetros, no entiendo, es muy complejo, estoy loco

- ¿ Qué pasa?No es fácil.

¿Qué es?Cuando sube y baja, exchange.Buy ((-1, amount * ticker.Last, ticker), amount * ticker.Last es una tontería, ¿por qué no sale?

CYZWXEl objetivo de la estrategia es: el último_tick = línea = [] el valor de las acciones de la entidad es el valor de las acciones de la entidad. def precio neto (precio actual): línea global Imprimir (precio actual) línea = [precio actual*(1+0.003*i) para i en el rango ((-1000,1000) ] Línea de registro - ¿ Qué? Def ontick ((): el último_tick global línea global lista de compra de red global cuenta = cambio.GetAccount (() El ticker = intercambio.GetTicker() el último_tick.append ((ticker['último']) si el len ((último_tick) == 1:retorno elf len ((last_tick) == 100: del último_tick[0] para i en el rango (línea): si last_tick[-1] > línea[i] y last_tick[-2] < línea[i] y len(grid_buy_list)!= 0 y i > min(grid_buy_list) y cuenta['Acciones'] >= 0,001: En el caso de las empresas de servicios de telecomunicaciones, el valor de las transacciones se calcula en función de la cantidad de dinero que reciben. del grid_buy_list[grid_buy_list.index(min(grid_buy_list))] Registro (intercambio.Conta de acceso) elif last_tick[-1] < línea[i] y last_tick[-2] > línea[i] y i no están en la lista de compras: cambio.Comprar ((último_tick[-1],0.01) La lista de compras de la red. Registro (intercambio.Conta de acceso) Definición principal: ¿Qué es lo que está sucediendo? Registro (intercambio.Conta de acceso) mientras que ((Verdadero): En la línea. El sueño (1000)

CYZWXGracias a Dream God, por los detalles, para volver a comprar todo lo explicado, como si hubiera escrito una versión py.

Un sueño pequeño.La estrategia es el lenguaje JavaScript.

- ¿ Qué pasa?¿Acaso los contratos permanentes en el texto no son futuros?

Un sueño pequeño.Los futuros son el número de contratos, el precio del mercado al instante es el importe de la compra. Los pedidos de venta al instante son el número de monedas.

- ¿ Qué pasa?¿No es este el contrato el parámetro del pedido para el pago de la moneda digital? ¿No es este el contrato? ¿No es este el parámetro del pedido para el pago de la moneda digital?

- ¿ Qué pasa?Oh, ya lo sé.

Un sueño pequeño.Las funciones de la API de FMZ pueden generar funciones de salida de registro, como: Log ((...) ;; exchange.Buy ((Price, Amount) ;; exchange.CancelOrder ((Id) etc., con algunos parámetros de salida adjuntos después de los parámetros necesarios.