avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

간단한 디지털 통화 현물 거래 로봇 구현

만든 날짜: 2021-02-18 16:09:43, 업데이트 날짜: 2023-09-26 20:57:30
comments   6
hits   3831

간단한 디지털 통화 현물 거래 로봇 구현

간단한 디지털 통화 현물 거래 로봇 구현

암호화폐 세계에는 모방 로봇이 필요한 수동 트레이더가 많지만, 기본 지식이 전혀 없는 상태에서 프로그래밍 설계를 시작하는 데 시간이 오래 걸린다는 사실에 어려움을 겪고 있습니다. 이러한 수요에 따라, 이 글에서는 알고리즘 트레이딩에 대한 기본 지식이 없는 암호화폐 업계의 친구들을 돕기 위해 간단한 스팟 복제 트레이딩 로봇을 설계해보겠습니다.

먼저, 필요 사항을 분석해 보겠습니다. 이 로봇의 기능은 한 계정에서 매수 또는 매도 작업이 있을 때 다른 복사 계정도 이에 따라 이 작업을 실행하도록 하는 것입니다. 따라서 우리는 먼저 두 가지 주제를 명확히 해보겠습니다.

  • 참조 계정: 해당 계정의 모든 움직임을 모니터링하는 모니터링 계정입니다.
  • 복사 계정: 주문을 따르는 계정입니다. 참조 계정에서 동작이 발생하면 복사 계정은 동일한 동작을 수행합니다.

이제 우리는 이러한 필요성을 예비적으로 파악했으므로 다음 단계에 대해 계속 생각해 보아야 합니다. 참조 계정의 동작을 어떻게 식별합니까?

스팟 계정의 경우 참조 계정을 모니터링하는 것은 매우 간단합니다. 가장 최근의 계정 정보 데이터의 코인 수와 현재 얻은 최신 계정 정보 데이터의 코인 수를 비교하기만 하면 됩니다. 현재 입수된 최신 계좌정보 데이터의 코인 개수가 이전 기록보다 많은 경우, 참조 계좌에서 매수 연산을 실행하였고 매수가 성공한 것으로 증명됩니다. 반대로, 코인이 적은 경우에는 참조 계좌에 대한 매도 작업이 수행됩니다. 우리는 이 동작을 발견한 후 다른 거래소 계정에서도 동일한 동작을 수행하도록 했습니다.

참조 계정에서 거래가 실행된 것으로 확인되면 가장 최근의 계정 데이터 기록을 업데이트하여 다음에 얻은 계정 정보와 비교하여 새로운 거래 동작이 있는지 확인해야 합니다.

위의 논리는 전략 코드에 의해 설명됩니다.

        // 检测跟单
        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                                  // 更新参考交易所最近一次的账户信息,用于下次对比

해당 전략의 주요 감지 논리는 위의 코드입니다. 디자인의 단순성을 위해 이 전략에서는 FMZ 공식 [디지털 통화 거래 라이브러리] 템플릿을 사용했습니다.$.Buy , $.Sell이는 모두 이 템플릿의 기능이며, 그 기능은 주문 작업을 실행하는 것입니다.

각 계정의 데이터 모니터링을 용이하게 하기 위해 전략에 상태 표시줄 디스플레이를 추가합니다. 전체 전략은 다음과 같습니다.

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

FMZ의 wexApp 시뮬레이션 환전 테스트를 사용하여 실시간 테스트를 진행해 보겠습니다. 여기에 서로 독립적인 세 개의 wexApp 계정을 추가했습니다. 그 중 하나는 참고 자료 교환의 역할을 하고, 다른 두 개는 사본 교환의 역할을 합니다.

간단한 디지털 통화 현물 거래 로봇 구현

그런 다음 FMZ 거래 터미널을 사용하여 수동으로 주문을 하여 로봇이 자동으로 주문을 따르는지 확인합니다.

간단한 디지털 통화 현물 거래 로봇 구현

로봇이 거래를 감지하고 복사 작업을 실행한 것을 볼 수 있습니다.

간단한 디지털 통화 현물 거래 로봇 구현

전체 전략: https://www.fmz.com/strategy/255182

이 전략은 학습을 위한 것일 뿐입니다. 질문이 있으시면 메시지를 남겨주세요.