
Hay muchos traders manuales en el mundo de las criptomonedas que necesitan robots imitadores, pero les preocupa el hecho de que lleva mucho tiempo comenzar con el diseño programático cuando no tienen conocimientos básicos. Basándonos en este tipo de demanda, en este artículo diseñaremos un robot de copia de comercio al contado sencillo para ayudar a los amigos en el círculo de las criptomonedas que no tienen conocimientos básicos de comercio algorítmico.
En primer lugar, analicemos las necesidades. La función de este robot es garantizar que cuando una cuenta realice una operación de compra o venta, otras cuentas de copia sigan el ejemplo y ejecuten esta operación. Por ello, primero aclararemos dos cuestiones:
Ahora que hemos identificado preliminarmente esta necesidad, debemos seguir pensando en el siguiente paso. ¿Cómo identificamos las acciones de las cuentas de referencia?
El seguimiento de las cuentas de referencia es muy sencillo para las cuentas al contado. Solo tenemos que comparar la cantidad de monedas en los datos de información de cuenta más recientes con la cantidad de monedas en los datos de información de cuenta más recientes obtenidos actualmente. Si el número de monedas en los últimos datos de información de la cuenta obtenidos actualmente es mayor que el registro anterior, demuestra que la cuenta de referencia ha ejecutado una operación de compra y la compra fue exitosa. Por el contrario, si hay menos monedas, se realiza una operación de venta de la cuenta de referencia. Después de descubrir esta acción, podemos permitir que otras cuentas de intercambio realicen la misma operación.
Cuando se descubre que se ha ejecutado una transacción en una cuenta de referencia, se debe actualizar el registro de datos de la cuenta más reciente para compararlo con la información de la cuenta que se obtenga la próxima vez para determinar si hay alguna nueva acción de transacción.
La lógica anterior se describe mediante el código de estrategia:
// 检测跟单
var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks) // 检测币数发生的变化
var func = null
if (amount > 0) { // 币变多了
func = $.Buy // 买入
} else if (amount < 0) { // 币变少了
func = $.Sell // 卖出
} else {
continue
}
// 执行跟单
Log("跟单!数量:", Math.abs(amount), "#FF0000")
for (var i = 1 ; i < exchanges.length ; i++) { // i 等于 0 时,是参考交易所,不处理,处理其它的跟单交易所
func(exchanges[i], Math.abs(amount)) // 执行具体的交易函数,可能是$.Buy 或者是 $.Sell ,具体看amount 是大于0,还是小于0
}
// 执行跟单之后更新参考交易所账户信息记录
initAcc = nowAcc // 更新参考交易所最近一次的账户信息,用于下次对比
La lógica de detección principal de la estrategia es el código anterior. Para simplificar el diseño, la estrategia utiliza la plantilla oficial FMZ [Biblioteca de comercio de divisas digitales].$.Buy , $.SellTodas estas son funciones de esta plantilla, y su función es ejecutar operaciones de orden.
Agregue algunas barras de estado a la estrategia para facilitar el seguimiento de los datos de cada cuenta. La estrategia completa es la siguiente:
function test() {
// 测试函数
var ts = new Date().getTime()
if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
Sleep(1000 * 60 * 10)
var x = Math.random()
if (x > 0.5) {
$.Buy(exchange, x / 10)
} else {
$.Sell(exchange, x / 10)
}
}
}
function main() {
LogReset(1)
if (exchanges.length < 2) {
throw "没有跟单的交易所"
}
var exName = exchange.GetName()
// 检测参考交易所
if (exName.includes("Futures_")) {
throw "仅支持现货跟单"
}
Log("开始监控", exName, "交易所", "#FF0000")
// 检测跟单交易所
for (var i = 1 ; i < exchanges.length ; i++) {
if (exchanges[i].GetName().includes("Futures_")) {
throw "不支持期货交易所跟单"
}
}
var initAcc = _C(exchange.GetAccount)
while(1) {
if(IsVirtual()) {
// 测试函数
test()
}
Sleep(5000)
// 更新参考账户当前的账户信息
var nowAcc = _C(exchange.GetAccount)
// 参考交易所账户信息
var refTbl = {
type : "table",
title : "参考交易所",
cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
rows : []
}
refTbl.rows.push([exName, nowAcc.Stocks, nowAcc.FrozenStocks, nowAcc.Balance, nowAcc.FrozenBalance])
// 跟单交易所账户信息
var followTbl = {
type : "table",
title : "跟单交易所",
cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
rows : []
}
for (var i = 1 ; i < exchanges.length ; i++) {
var acc = _C(exchanges[i].GetAccount)
var name = exchanges[i].GetName()
followTbl.rows.push([name, acc.Stocks, acc.FrozenStocks, acc.Balance, acc.FrozenBalance])
}
// 状态栏显示
LogStatus(_D(), "\n`" + JSON.stringify(refTbl) + "`", "\n`" + JSON.stringify(followTbl) + "`")
// 检测跟单
var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks)
var func = null
if (amount > 0) {
func = $.Buy
} else if (amount < 0) {
func = $.Sell
} else {
continue
}
// 执行跟单
Log("跟单!数量:", Math.abs(amount), "#FF0000")
for (var i = 1 ; i < exchanges.length ; i++) {
func(exchanges[i], Math.abs(amount))
}
// 执行跟单之后更新参考交易所账户信息记录
initAcc = nowAcc
}
}
Hagamos una prueba en tiempo real utilizando la prueba de intercambio simulada wexApp de FMZ. Aquí agregué tres cuentas wexApp, que son independientes entre sí. Uno de ellos sirve como intercambio de referencia y los otros dos sirven como intercambio de copias.

Luego, colocamos manualmente un pedido utilizando la terminal comercial de FMZ para ver si el robot seguirá automáticamente el pedido.

Puede ver que el robot detectó la transacción y ejecutó la operación de copia.

Estrategia completa: https://www.fmz.com/strategy/255182
La estrategia es solo para aprender. Si tienes alguna pregunta, deja un mensaje.