資源の読み込みに... 荷物...

FMZ API インストラクション

作者: リン・ハーンゼロ, 作成日:2020年4月20日 10:19:00, 更新日:2023年4月12日 14:44:56

sted IP アドレスは10.0.3.15 }


#### exchange.SetTimeout(...)

```exchange.SetTimeout(Millisecond)```, in which the parameter **Millisecond** is a millisecond value.

Only for the ```rest``` protocol, it is used to set the time-out period for ```rest``` requests, and it takes effect only by setting it once.
For example: ```exchange.SetTimeout(3000)```, set the timeout time of the ```rest``` request of the exchange object ```exchange```, if it exceeds 3 seconds, timeout will return ```null```.

Note:
* The parameter ```Millisecond``` is millisecond, and 1,000 milliseconds equals 1 second. 
* Only need to set once.
* Only for the **rest** protocol.
* ```SetTimeout``` is not a global function, but an exchange object method. 

### Special Requirements for C++ Written Strategies   
The main difference between ```C++``` written strategy and ```JavaScript``` written strategy is the returned data differences of **FMZ API** interface. For example, the ```exchange.GetTicker()``` function.

- JavaScript
```exchange.GetTicker()``` returns an object if the call succeeds, or returns ```null``` if the call fails (due to the exchange server problems or network problems, etc.).

```javascript
function main() {
    var ticker = exchange.GetTicker()
    // Determine if the call to "exchange.GetTicker" function failed, and return "null" when it failed
    if (ticker){
        Log(ticker)
    }
}
  • C++exchange.GetTicker()呼び出しが成功するとオブジェクトを返します.呼び出しが失敗した場合,返されたオブジェクトは依然としてオブジェクトであり,通常の返されたオブジェクトとは属性によって区別されます.Valid.

    void main() {
        auto ticker = exchange.GetTicker();
        // Determine if the call to "exchange.GetTicker()" function failed and if the "Valid" attribute of the returned object is "false"
        if (ticker.Valid) {
            Log(ticker);
        }
    }
    

この2つの差はmain()機能についてC++文書戦略とmain()標準C11の機能: 返金値がC++プログラム入力機能main()C11 はintタイプC++戦略のスタートアップ機能は,また機能ですmain()FMZ プラットフォームでは,この2つの関数は同じではありません.main()機能についてC++戦略はvoid type.

void main() {
    // Use "Test" function to test
    if (!Test("c++")) {
        // Show an exception to stop the program
        Panic("Please download the latest-versioned docker");
    }

    // Determine if the return of all objects is valid with "Valid" 
    LogProfitReset();
    LogReset();
    Log(_N(9.12345, 2));
    Log("use _C", _C(exchange.GetTicker), _C(exchange.GetAccount));
}

JavaScript の 特殊 な 問題

JavaScript言語の理由 (JavaScript言語の組み込み文字列サポート)asciiそしてutf-16暗号化できない文字列に出くわしたとき,ArrayBuffer文字列パラメータを通過できるすべての API インターフェースは,ArrayBuffer type.

JavaScript 多スレッド化

複数のスレッド機能がサポートされていますJavaScriptシステム底部からの言語戦略,以下を含む:カスタム実行機能の同時実行;同時スレッド間の通信のサポート,同時スレッドとメインスレッド間の通信のサポート;ストレージ,スレッド環境内の変数の共有およびその他の機能.これまでのところ,ライブ取引環境での使用のみをサポートしています.参照してください:https://www.fmz.com/bbs-topic/9974.

について__Thread(function, arguments...)function は同時実行されるスレッドを作成する.スレッド実行機能以外の変数への直接参照 (孤立した環境で実行) をサポートしない.外部変数への参照はコンパイルできない.他の閉じる関数への参照もサポートされない.プラットフォームのすべての API はスレッド内で呼び出せるが,他のユーザー定義関数は呼び出せない.パラメータfunctionパラメータは,関数参照または無名の関数であることができます.argumentsは,このパラメータです.function機能 (実際に送信されたパラメータ)arguments...複数のパラメータが入力可能であることを意味します. 返却値:スレッド Id.

function testFunc(n) {
    Log("Execute the function testFunc, parameter n:", n)
}

function main() {
    var testThread1 = __Thread(function () {
        Log("Executes an anonymous function with no parameters.")
    })

    var testThread2 = __Thread(testFunc, 10)   // parameter n : 10
    
    __threadJoin(testThread1)                  // You can use the __threadJoin function to wait for concurrent threads to complete
    __threadJoin(testThread2)                  // If you don't wait for the execution of testThread1 and testThread2 to complete, the main thread will automatically release the concurrent thread after the execution is completed first, and terminate the execution function of the concurrent thread
}

呼び出し方法がサポートされています__Thread([function, arguments...], [function, arguments...], ...),つまり,複数のスレッド実行機能が作成されたスレッドで連続的に実行されます.

function threadTestFuncA(a) {
    Log(a)
    threadTestFuncC(4)
    
    // The threadTestFuncC function can be called, but the threadTestFuncB function cannot be called

    // this.d
    Log(d)
}

function threadTestFuncB(b) {
    Log(b)
    threadTestFuncC(2)

    this.d = 5
}

function main() {
    // Execute the threadTestFuncB function first, and then execute the threadTestFuncA function
    // threadTestFuncC will not be executed automatically, but it can be called by other thread execution functions
    var threadId = __Thread([threadTestFuncA, 3], [threadTestFuncB, 1], ["function threadTestFuncC(c) {Log(c)}"])
    __threadJoin(threadId)
}

同期実行機能が__Thread逆順序で実行されます.上記の例では,Logプリントする機能1 ~ 5スレッド実行機能の間の共有変数はサポートされています.例えば,this.dこの例の変数は,threadTestFuncB機能と使用されていますthreadTestFuncA機能文字列を表示する機能です."function threadTestFuncC(c) {Log(c)}"上記の例では,スレッドが外部関数とライブラリに関数呼び出しを実行できるようにします.

外部ライブラリをインポートするには,以下の特定の使用例があります.

function ml(input) {
    const net = new brain.NeuralNetwork();
    net.train([
        { input: [0, 0], output: [0] },
        { input: [0, 1], output: [1] },
        { input: [1, 0], output: [1] },
        { input: [1, 1], output: [0] },
    ]);
    return net.run(input);
}

function main() {
    Log(__threadJoin(__Thread([ml, [1, 0]], [HttpQuery("https://unpkg.com/brain.js")])))
}

__threadPeekメッセージ

について__threadPeekMessage(threadId, timeout)機能はスレッド通信チャネルからデータを読み取り,パラメータthreadId返されるIDは__Thread()パラメータを設定する機能threadId設定が0である場合,メインスレッドから送信されたデータを受信することを意味します.つまり,現在のメイン関数 (パラメータのthreadIdは,同時スレッド実行関数でのみサポートされる0に設定されています).パラメータtimeoutこのパラメータで設定されたミリ秒数に応じてブロックして待つ.timeout設定されています.-1送信スレッドが実行を完了し,データがないとき,送信スレッドは,__threadPeekMessage返した値:受信されたデータ.

実行関数の間の通信です. 実行関数と実行関数の間の通信は,testFunc作成された並行糸とmainメインスレッドの機能とスレッド実行機能testFuncまず処刑される

function testFunc() {
    for(var i = 0 ; i < 5 ; i++) {                // 0 ~ 5, after sending to the main thread 5 times, the execution of the thread function is completed, and the __threadPeekMessage function in the main function fetches all the data, it will not block again, and returns a null value immediately
        __threadPostMessage(0, i)                 // Send data to the main thread
        var msg = __threadPeekMessage(0, -1)      // Listen for data from the main thread
        Log("from main msg:", msg)
        Sleep(500)
    }
    Log("testFunc execution is complete")
}

function main() {
    var testThread = __Thread(testFunc)           // Create a thread with an Id of 1 
    
    for (var i = 0 ; i < 10 ; i++) {
        __threadPostMessage(1, i)                 // Send data to the thread whose Id is 1, that is, the thread that executes the testFunc function in this example
        var msg = __threadPeekMessage(1, -1)      // Listen to the data sent by the thread whose Id is 1, that is, the data sent by the thread that executes the testFunc function in the example
        Log("from testFunc msg:", msg)
        Sleep(500)
    }
}

__thread 投稿メッセージ

について__threadPostMessage(threadId, data)パラメータは,スレッド通信チャンネルにデータを書き込むthreadId返されるIDは__Thread()パラメータを設定しますthreadId設定が0である場合,現在のメイン機能 (パラメータ threadId は 0 に設定され,同時スレッド実行機能のみでサポートされます) にデータを送信することを意味します.data文字列,ブール値,オブジェクト,配列,その他の種類のデータを通過できます.この関数は返却値がありません.

その時に__threadPostMessage信号とデータを送信するためにスレッドの実行関数に呼び出されると,メッセージイベントも生成されます.EventLoop()メッセージ通知を受信する機能

function testFunc() {
    for(var i = 0 ; i < 10 ; i++) {
        Log("post msg, i:", i)
        __threadPostMessage(0, {msg: "testFunc", i: i})
        Sleep(100)
    }
}

function main() {
    var testThread = __Thread(testFunc)
    
    for (var i = 0 ; i < 10 ; i++) {
        var e = EventLoop()
        Log("e:", e)
        // e: {"Seq":1,"Event":"thread","Index":1,"Nano":1677745512064773600,"Deleted":0,"Symbol":"","Ticker":{"Info":null,"High":0,"Low":0,"Sell":0,"Buy":0,"Last":0,"Volume":0,"OpenInterest":0,"Time":0}}
        if (e.Event == "thread") {
            var msg = __threadPeekMessage(testThread, -1)
            Log("msg:", msg, "#FF0000")
        }
        Sleep(500)
    }
    
    var retThreadJoin = __threadJoin(testThread)
    Log("retThreadJoin:", retThreadJoin)
}

_thread参加する

について__threadJoin(threadId, timeout)このパラメータは,システムリソースの終了と復元を指定したIDを持つスレッドを待つために使用されます.threadId返されるIDは__Thread()パラメータtimeoutはスレッド終了を待つためのタイムアウト設定,ミリ秒で.タイムアウトが設定されていない場合,スレッド実行終了まで待つことを意味します.返却値:タイプは実行結果を示すオブジェクトです.タイムアウトした場合,返却します.undefined.

収益価値構造,例えば:

{
    "id":1,                 // Thread Id
    "terminated":false,     // Whether the thread is terminated forcibly
    "elapsed":2504742813,   // The running time of the thread (nanoseconds)
    "ret": 123              // The return value of the thread function
}

__thread 終了

について__threadTerminateこのパラメータは,threadJoin を実行する際に,threadJoin を実行し,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行する際に,threadJoin を実行するときに,threadJoin が実行するときに,threadJoin が実行するときに,threadJoin が実行するthreadId返されるIDは__Thread()Function. Return value: 実行結果を示すブール値.

function testFunc() {
    for(var i = 0 ; i < 10 ; i++) {
        Log("i:", i)
        Sleep(500)
    }
}

function main() {
    var testThread = __Thread(testFunc)
    
    var retThreadTerminate = null 
    for (var i = 0 ; i < 10 ; i++) {
        Log("main i:", i)
        if (i == 5) {
            retThreadTerminate = __threadTerminate(testThread)
        }
        Sleep(500)
    }
    
    Log("retThreadTerminate:", retThreadTerminate)
}

__threadGetData について

__threadGetData(threadId, key), この関数はスレッド間で共有される変数にアクセスするために使用されます.スレッドが実行していない場合にデータが有効です.__threadJoin機能 (成功した出口を待っている) を実行していない__threadTerminateパラメータは,この関数で,threadId線 ID とパラメータkey保存されたキーネームです.key-value返却値: に対応するキー値を返します.keyについてkey-value pair.

threadId0 は主糸を表示します (つまり,main機能が位置している) を使用できます.__threadId()パラメータを設定します.threadId指定されたIDのスレッド環境の変数も読み取ることができます. この機能は,threadの実行機能で現在のスレッドに保存されている変数を読み取るために使用できます.

function main() {
    var t1 = __Thread(function() {
        Sleep(2000)
        var id = __threadId()                                                   // Get the Id of the current thread
        Log("id:", id, ", in testThread1 print:", __threadGetData(id, "msg"))   // Retrieve the key value corresponding to the key name msg in the current thread, i.e. "testThread2"
        Log("id:", 2, ", in testThread1 print:", __threadGetData(2, "msg"))     // Read the key value corresponding to the key name msg in the thread with thread Id 2, i.e. 99
    })

    var t2 = __Thread(function(t) {
        __threadSetData(t, "msg", "testThread2")                                // Set a key-value pair to the thread with Id t1 (Id 1), with the key name msg and the key value "testThread2"
        __threadSetData(__threadId(), "msg", 99)                                // Set the key-value pair in the current thread (Id is 2) with the key name msg and the key value 99
        __threadSetData(0, "msg", 100)                                          // Set up a key-value pair in the main thread, with the key name msg and the key value 100
    }, t1)
    
    __threadJoin(t1)   // You can check the __threadJoin(threadId, timeout) function, which is used to wait for the end of thread execution
    Log("in main, get msg:", __threadGetData(0, "msg"))
}

__threadSetデータ

__threadSetData(threadId, key, value)このパラメータは,スレッド環境の変数を保存するために使用されます.threadId線 ID,パラメータkey保存されたキーネームです.key-valueパラメーターvalueこの関数には返される値はありません.

threadId0 は主糸を表示します (つまり,main機能が位置している) で,__threadId()この関数は,現在のスレッドの Id を取得します.value削除する手段が指定されていないkey. スレッド間の共有変数への相互アクセスをサポートします. スレッドが実行していない場合にデータが有効です.__threadJoin機能 (成功終了を待っている) を実行していない__threadTerminateパラメータの値valueシリアル化可能な変数でなければならない.

function testFunc() {
    var id = __threadId()                  // Get the current thread Id
    __threadSetData(id, "testFunc", 100)   // Stored in the current thread environment
    __threadSetData(0, "testFunc", 99)     // Stored in the main threaded environment
    Log("testFunc execution is complete")
}

function main() {
    // threadId is 1, the created thread with threadId 1 will be executed first, as long as the thread resources are not recycled, the variables stored locally in the thread will be valid
    var testThread = __Thread(testFunc)
    
    Sleep(1000)

    // Output in main, get testFunc: 100
    Log("in main, get testFunc:", __threadGetData(testThread, "testFunc"))

    // Output in main, get testFunc: 99
    Log("in main, get testFunc:", __threadGetData(0, "testFunc"))

    // Delete the testFunc key-value pair in the thread environment with Id testThread
    __threadSetData(testThread, "testFunc")

    // After deleting and reading again, the __threadGetData function returns undefined
    Log("in main, get testFunc:", __threadGetData(testThread, "testFunc"))
}

_threadId について

__threadId()パラメータなしで,現在のスレッドのIDを取得するために使用されます.返却値:threadIdロープの流れを

function testFunc() {
    Log("in testFunc, __threadId():", __threadId())
}

function main() {
    __Thread(testFunc)

    // If the execution of the main thread is completed, the created child thread will stop executing, so here Sleep(1000), wait for 1 second
    Sleep(1000)
    Log("in main, __threadId():", __threadId())
}

サポート ワーム コード

についてJavaScript言語戦略では, wasm ファイルのヘックスコードをロードし,インスタンスを作成し,その中のコードを実行できます.JavaScriptコード,それは一定の速度優位性を持っています.

wasm.parseModule

wasm.parseModule(data)文字列を解析するdataパラメータは,warm のコード化がヘクサクトル文字列に変換されています. 返却値:warm のモデルオブジェクトを返します.戦略の例.

例えば,次の c++ 関数コードは wasm コードにコンパイルされ,それからヘクサクトル文字列に変換され,dataパラメータwasm.parseModule(data) function.

// Recursive Algorithm for Fibonacci Numbers
int fib(int f) {
    if (f < 2) return f;
    return fib(f - 1) + fib(f - 2);   
}

wasm.buildInstance

wasm.buildInstance(module, opt)モデルインスタンスを作成します.moduleパラメータは wasm モデルで,optパラメータは, wasm インスタンスのプログラムに割り当てられたスタックスペースを設定するために使用される構成情報です. 返却値: wasm モデルインスタンスを返します.

optパラメータ設定例:

{
    stack_size: 65*1024*1024,
}

callFunction を入力する

callFunction(funcName, param1, ...), これは wasm モデルインスタンスの方法であり, wasm モデルインスタンスの関数を実行するために使用されます.funcNameパラメータは実行される関数の名前で,param1パラメータは,関数を実行するときに渡されたパラメータです (パラメータによって指定されます)funcName).

ブロックチェーン

FMZ Quant Trading プラットフォームは,公式にアクセス可能で,web3ネットワークの契約defi簡単に交換できます

エサリアム

構成

戦略コードを書いて,Ethereumチェーン上でスマートコントラクトのメソッドコールを実装します.exchange.IOFMZ Quant Trading プラットフォームのアクセスノードを設定します. アクセスノードは自己構築のノードまたは第三者のサービスを使用することができます.infura.

このページでは交換暗号通貨のプロトコルを選択し,交換を選択します.Web3設定するRpc Address(アクセスノードのサービスアドレス)Private Key(プライベートキー) プライベートキーの局所的な展開をサポートします.鍵 の 安全].

ABI を登録する

標準的な契約を呼び出すERC20標準契約以外の方法を呼び出すには,ABI コンテンツを登録する必要があります:exchange.IO("abi", tokenAddress, abiContent)契約の ABI コンテンツを取得するには,結果フィールドのみを取って,次の URL を使用できます.

https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

Ethereum RPC を呼び出す方法

標準値の2番目のパラメータがexchange.IO機能は"eth"直接ノードサーバーに利用可能な RPC メソッドを呼び出すことができます.

  • 財布内のETHの残高をクエリする

    function main() {
        // "owner" needs to be replaced with a specific wallet address
        // "latest" parameter labels for string position: 'latest', 'earliest' or 'pending', please refer to https://eth.wiki/json-rpc/API#the-default-block-parameter
        // The return value ethBalance is a hexadecimal string: 0x9b19ce56113070
        var ethBalance = exchange.IO("api", "eth", "eth_getBalance", "owner", "latest")
    
        // ETH has a precision unit of 1e18
        var ethDecimal = 18
    
        // Because of the JavaScript language precision, it is necessary to use the system underlying encapsulated function BigInt, BigDecimal to process.
        // Convert ethBalance to readable quantity, 0x9b19ce56113070 to 0.043656995388076145.
        Log(Number((BigDecimal(BigInt(ethBalance))/BigDecimal(Math.pow(10, ethDecimal))).toString()))
    }
    
  • ETH 送金

    function mian() {
        // ETH has a precision unit of 1e18
        var ethDecimal = 18
    
        // Number of transfers, readable quantity e.g. 0.01 ETH
        var sendAmount = 0.01
    
        // Because of the JavaScript language precision, it is necessary to use the system underlying encapsulated function BigInt, BigDecimal to process, and converts readable quantities into data for processing on the chain.
        var toAmount = (BigDecimal(sendAmount)*BigDecimal(Math.pow(10, ethDecimal))).toFixed(0)
        
        // "toAddress" is the address of the recipient's ETH wallet at the time of the transfer, which needs to be filled in specifically, and toAmount is the number of transfers.
        exchange.IO("api", "eth", "send", "toAddress", toAmount)
    }
    
  • 検索ガス価格

    function toAmount(s, decimals) {
        return Number((BigDecimal(BigInt(s))/BigDecimal(Math.pow(10, decimals))).toString())
    }  
    
    function main() {
        var gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
        Log("gasPrice:", toAmount(gasPrice, 0))   // 5000000000 , in wei (5 gwei)
    }
    
  • 問い合わせ eth_estimateガス

    function toAmount(s, decimals) {
        // The toAmount function can convert the hex-encoded value to a decimal value
        return Number((BigDecimal(BigInt(s))/BigDecimal(Math.pow(10, decimals))).toString())
    }  
    
    function main() {
        // Encoding the call to the approve method
        var data = exchange.IO("encode", "0x111111111117dC0aa78b770fA6A738034120C302", "approve", "0xe592427a0aece92de3edee1f18e0157c05861564", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
        Log("data:", data)
        var gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
        Log("gasPrice:", toAmount(gasPrice, 0))
        var obj = {
            "from" : "0x0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",   // walletAddress
            "to"  : "0x111111111117dC0aa78b770fA6A738034120C302",
            "gasPrice" : gasPrice,
            "value" : "0x0",
            "data" : "0x" + data,
        }
        
        var gasLimit = exchange.IO("api", "eth", "eth_estimateGas", obj)
        Log("gasLimit:", toAmount(gasLimit, 0))
        Log("gas fee", toAmount(gasLimit, 0) * toAmount(gasPrice, 0) / 1e18)
    }
    

コード化サポート

機能についてexchange.IO概要をまとめていますencode函数呼び出しのエンコーディングをhex公開されているプラットフォームを参照できます.Uniswap V3 トレーディングクラスライブラリ テンプレート特定の用途のために.エンコーディングのコールunwrapWETH9この方法が例として用いられる.

function main() {
    // Main network address of ContractV3SwapRouterV2: 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
    // To call the unwrapWETH9 method, you need to register the ABI first, omit the registration here.
    // "owner" represents the wallet address, it needs to fill in the specific, 1 represents the number of unwrapping, unwrap a WETH into ETH
    var data = exchange.IO("encode", "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", "unwrapWETH9(uint256,address)", 1, "owner")
    Log(data)
}

呼び出すときexchange.IO("encode",...)2番目のパラメータ (文字列型) が0x暗号化された方法の呼び出し (encodeスタートしない場合0x指定されたタイプ順序をコードするために使用されます.abi.encodeについてsolidity次の例を参照してください.

function main() {
    var x = 10 
    var address = "0x02a5fBb259d20A3Ad2Fdf9CCADeF86F6C1c1Ccc9"
    var str = "Hello World"
    var array = [1, 2, 3]
    var ret = exchange.IO("encode", "uint256,address,string,uint256[]", x, address, str, array)   // uint i.e. uint256 , the type length needs to be specified on FMZ
    Log("ret:", ret)
    /*
    000000000000000000000000000000000000000000000000000000000000000a    // x
    00000000000000000000000002a5fbb259d20a3ad2fdf9ccadef86f6c1c1ccc9    // address
    0000000000000000000000000000000000000000000000000000000000000080    // offset of str
    00000000000000000000000000000000000000000000000000000000000000c0    // offset of array
    000000000000000000000000000000000000000000000000000000000000000b    // the length of str
    48656c6c6f20576f726c64000000000000000000000000000000000000000000    // str data
    0000000000000000000000000000000000000000000000000000000000000003    // the length of the array
    0000000000000000000000000000000000000000000000000000000000000001    // array the first data
    0000000000000000000000000000000000000000000000000000000000000002    // array the second data
    0000000000000000000000000000000000000000000000000000000000000003    // array the third data
    */
}

トゥップルまたはトゥップルを含むタイプの順序的なエンコーディングをサポートする:

function main() {
    var types = "tuple(a uint256,b uint8,c address),bytes"
    var ret = exchange.IO("encode", types, {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }, "0011")
    Log("encode: ", ret)
}

このタイプオーダーはtupleそしてbytes呼び出すときに2つのパラメータを入力する必要があります.exchange.IOencode:

    1. 型に対応する変数tuple:
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    

    送信されたパラメータは,また,構造とタイプのtuple定義されているようにtypesパラメータ:tuple(a uint256, b uint8, c address).

    1. 型に対応する変数bytes:
    "0011"
    

配列や配列を含むタイプの配列コードをサポートする:

function main() {
    var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"]   // ETH address, USDT address
    var ret = exchange.IO("encode", "address[]", path)
    Log("encode: ", ret)
}

EncodePacked のサポート

DEX 式を呼び出すときUniswap V3交換経路のようなパラメータを通す必要があります.encodePackaged操作:

function main() {
    var fee = exchange.IO("encodePacked", "uint24", 3000)
    var tokenInAddress = "0x111111111117dC0aa78b770fA6A738034120C302"
    var tokenOutAddress = "0x6b175474e89094c44da98b954eedeac495271d0f"
    var path = tokenInAddress.slice(2).toLowerCase()
    path += fee + tokenOutAddress.slice(2).toLowerCase()
    Log("path:", path)
}

解読のサポート

データ処理は,暗号化だけでなく (encode解読する (decode) を使います.exchange.IO("decode", types, rawData)実行する機能decode operation.

function main() {
    // register SwapRouter02 abi
    var walletAddress = "0x398a93ca23CBdd2642a07445bCD2b8435e0a373f"
    var routerAddress = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
    var abi = `[{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactOutputParams","name":"params","type":"tuple"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"}]`
    exchange.IO("abi", routerAddress, abi)   // abi only uses the contents of the local exactOutput method, the full abi can be searched on the Internet

    // encode path
    var fee = exchange.IO("encodePacked", "uint24", 3000)
    var tokenInAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    var tokenOutAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"
    var path = tokenInAddress.slice(2).toLowerCase()
    path += fee + tokenOutAddress.slice(2).toLowerCase()
    Log("path:", path)

    var dataTuple = {
        "path" : path, 
        "recipient" : walletAddress, 
        "amountOut" : 1000, 
        "amountInMaximum" : 1, 
    }
    // encode SwapRouter02 exactOutput 
    var rawData = exchange.IO("encode", routerAddress, "exactOutput", dataTuple)
    Log("method hash:", rawData.slice(0, 8))   // 09b81346
    Log("params hash:", rawData.slice(8))

    // decode exactOutput params
    var decodeRaw = exchange.IO("decode", "tuple(path bytes,recipient address,amountOut uint256,amountInMaximum uint256)", rawData.slice(8))
    Log("decodeRaw:", decodeRaw)
}

この例では,encodePacked初期操作はpathパラメータ処理exactOutput後で暗号化する必要がある方法呼び出しpathパラメータとして.encode方法exactOutputルーティング契約には"つのパラメータのみがあり,パラメータタイプはtuple方法についてexactOutput名称は0x09b81346解読された結果です.decodeRawによるexchange.IO ("decode",...)変数と一致しています.dataTuple.

プライベートキーを切り替えるためのサポート

複数のウォレットアドレスを操作するためにプライベートキーを切り替えるのをサポートします.例えば:

function main() {
    exchange.IO("key", "Private Key")   // "Private Key" represents the private key string, which needs to be filled in specifically
}

スマートコントラクトを呼び出す方法

標準の第1パラメータexchange.IO機能は"api"この呼び出しが拡張呼び出しであることを示す.exchange.IOfunction は呼び出すスマートコントラクトのアドレスです

呼び出す方法がpayable方法名 (方法の4番目のパラメータ) の後に転送 ETH 値を追加する必要があります.exchange.IO文字列の形式で値を通す,例えば,multicall方法Uniswap V3次のコンテンツは,いくつかのスマートコントラクト方法の呼び出しの例です.

  • 十進数

    についてdecimals方法としてconstant方法ERC20発生しないgas特定のデータに精度データをクエリすることができます.token.....decimals返信値: 精度データtoken.

    function main(){
        var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"    // The contract address of the token, in the example the token is 1INCH
        Log(exchange.IO("api", tokenAddress, "decimals"))                  // Query, print 1INCH tokens with precision index of 18
    }
    
  • 給付金

    についてallowance方法としてconstant方法ERC20発生しないgas消費量について質問することができます.token特定の契約住所についてallowance返回値: 許可金額の 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値:token.

    function main(){
        // The contract address of the token, in the example the token is 1INCH
        var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"            
    
        // For example, the query yields 10000000000000000000000, divided by the precision unit of the token 1e18, the current exchange object bound to the wallet to the spender address authorized 1 1INCH.
        Log(exchange.IO("api", tokenAddress, "allowance", "owner", "spender"))   
    }
    

    owner: ウォレットアドレスは例の文字列ownerに置き換えられます.実際の使用では,アドレスを記入する必要があります.spender: 許可された契約アドレスは,例の文字列"spender"に置き換えられます.実際の使用では,アドレスを具体的に記入する必要があります.例えば,アドレスは,Uniswap V3 router v1.

  • 承認する

    についてapproveこの方法はconstant方法ERC20生産するgas消費を許可するために使用されます.token契約の住所についてapprove方法が2つのパラメータを通過する必要があります.最初のものは許可されるアドレスであり,第二は許可された金額です.txid.

    function main(){
        // The contract address of the token, in the example the token is 1INCH
        var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"   
    
        // The hexadecimal string of the authorization amount: 0xde0b6b3a7640000 , the corresponding decimal string: 1e18 , 1e18 divided by the precision unit of the token, i.e. 1 token amount, so this refers to the authorization of one token.
        Log(exchange.IO("api", tokenAddress, "approve", "spender", "0xde0b6b3a7640000"))  
    }
    

    spender: 許可された契約の住所,例は文字列で置き換えられます spender,実際の使用は,特定の住所を記入する必要があります.Uniswap V3 router v1 address. 0xde0b6b3a7640000: 十六進数文字列で表される許可数は,1e18, で割ったtoken例の精度単位 (すなわち 1e18) で,1 を得ます.token authorized.

    基準の3番目のパラメータはexchange.IO方法の名前が渡されるapprove形式でも書ける.methodId標準メソッドの名前も書ける.例えば"approve ((address,uint256) "など.

  • 複数通話

    についてmulticall定数でない方法である.Uniswap V3発生するgas複数の方法でトークンを交換するために使用されます.multicall方法にはパラメータを転送する複数の方法がある可能性があります.詳細については,方法を含む ABI に問い合わせることができます.メソッドを呼び出す前に ABI を登録する必要があります.返回値:txid.

    具体例についてはmulticall方法の呼び出しは,一般の参照してくださいUniswap V3 トレーディングクラスライブラリ テンプレート私たちのプラットフォームの

    偽コードは,いくつかの詳細を記述するために使用されます:

    exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data)
    

    ContractV3SwapRouterV2: Uniswap V3 のルーター v2 アドレスvalueETHの金額を 0 に設定します.tokenIn取引のトークンはETHではありません.deadline: 設定できます(new Date().getTime() / 1000) + 36001時間有効ですdata: 行われる梱包作業のデータ.

    指定することも可能です.gasLimit/gasPrice/nonce方法呼び出しの設定では,再び記述するために偽コードを使用します:

    exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 123456, gasLimit: 21000})
    

    パラメータを設定できます{gasPrice: 11, gasLimit: 111, nonce: 111}パラメータは,あなたの特定のニーズに応じて,最後のパラメータに設定されますexchange.IO機能は省略できます.nonce設定しないgasLimit/gasPrice/nonceシステムデフォルトの値をすべて使います

    この例では,stateMutabilitymulticall(uint256,bytes[])方法としてpayableそして,valueパラメータを入力する必要があります.stateMutability":"payable"視界から見ることができますABI.....exchange.IO要求されるパラメータを決定します.stateMutabilityの属性ABI登録されている場合stateMutability属性はnonpayable,パラメータvalue送信する必要はありません.

共通の関数呼び出し

  1. 交換オブジェクトによって設定された財布のアドレスを取得します.
function main() {
    Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object.
}
  1. ブロックチェーンの RPC ノードを切り替える
function main() {
    var chainRpc = "https://bsc-dataseed.binance.org"
    e.IO("base", chainRpc)    // Switch to BSC chain
}

インディケーター機能

指示関数に追加する必要がありますTA.またはtalib.前置詞として

インディケーター関数を呼び出す例talib図書館とTA図書室:

function main(){
    var records = exchange.GetRecords()
    var macd = TA.MACD(records)
    var atr = TA.ATR(records, 14)

    // Print the last row of indicator values
    Log(macd[0][records.length-1], macd[1][records.length-1], macd[2][records.length-1])
    Log(atr[atr.length-1])

    // Print all indicator data, and JavaScript written strategies have integrated a talib library on FMZ Quant Trading platform 
    Log(talib.MACD(records))
    Log(talib.MACD(records, 12, 26, 9))
    Log(talib.OBV(records))

    // The talib library can also be passed in an array of numbers, which can be passed in order. For example: OBV (Records [Close], Records [Volume]) requires the parameters of the two arrays, including "Close" and "Volume"
    Log(talib.OBV([1,2,3], [7.1, 6.2, 3, 3]))

    // You can also directly pass in the "records" array containing the "Close" and "Volume" attribute
    Log(talib.OBV(records))
    Log(TA.Highest(records, 30, 'High'))
    Log(TA.Highest([1,2,3,4], 0))
}
# Python needs to install the talib library separately 
import talib
def main():
    r = exchange.GetRecords()
    macd = TA.MACD(r)
    atr = TA.ATR(r, 14)
    Log(macd[0][-1], macd[1][-1], macd[2][-1])
    Log(atr[-1])

    # For Python, the system extends the attributes of the array returned by GetRecords, and adds "Open", "High", "Low", "Close" and "Volume" to facilitate the call of the functions in the talib library
    Log(talib.MACD(r.Close))
    Log(talib.MACD(r.Close, 12, 26, 9))
    Log(talib.OBV(r.Close, r.Volume))

    Log(TA.Highest(r, 30, "High"))
    Log(TA.Highest([1, 2, 3, 4], 0))
void main() {
    auto r = exchange.GetRecords();
    auto macd = TA.MACD(r);
    auto atr = TA.ATR(r, 14);
    Log(macd[0][macd[0].size() - 1], macd[1][macd[1].size() - 1], macd[2][macd[2].size() - 1]);
    Log(atr[atr.size() - 1]);

    Log(talib.MACD(r));
    Log(talib.MACD(r, 12, 26, 9));
    Log(talib.OBV(r));

    Log(TA.Highest(r.Close(), 30));
}

次のパラメータのデータは,関数によって得られるすべてのデータです.exchange.GetRecords(Period)- わかった どれだけの長さか注意してくださいrecords,長さが指標関数のパラメータ計算要件を満たしていない場合,無効値が返されます.

TA - 一般的に使用される指標図書館

についてTAFMZ Quant トレーディングプラットフォームの指標ライブラリは,一般的に使用される指標アルゴリズムを最適化して,JavaScript, Pythonそしてcpp オープンソースのTAライブラリコード.

MACD - 収束と離散の移動平均値

TA.MACD(data, fast period, slow period, signal period)標準の周期パラメータ (12, 26, 9) で,2次元の配列を返します.[DIF, DEA, MACD] respectively.

function main(){
    // You can fill in different k-line periods, such as PERIOD_M1, PERIOD_M30 and PERIOD_H1...
    var records = exchange.GetRecords(PERIOD_M15)
    var macd = TA.MACD(records, 12, 26, 9)
    // You can see from the log that three arrays are returned, corresponding to DIF, DEA, MACD
    Log("DIF:", macd[0], "DEA:", macd[1], "MACD:", macd[2])
}
def main():
    r = exchange.GetRecords(PERIOD_M15)
    macd = TA.MACD(r, 12, 26, 9)
    Log("DIF:", macd[0], "DEA:", macd[1], "MACD:", macd[2])
void main() {
    auto r = exchange.GetRecords(PERIOD_M15);
    auto macd = TA.MACD(r, 12, 26, 9);
    Log("DIF:", macd[0], "DEA:", macd[1], "MACD:", macd[2]);
}

KDJ - ストカスティック指標

TA.KDJ(data, period 1, period 2, period 3)2次元の配列を返します. この配列は(K, D, J) respectively.

function main(){
    var records = exchange.GetRecords(PERIOD_M15)
    var kdj = TA.KDJ(records, 9, 3, 3)
    Log("k:", kdj[0], "d:", kdj[1], "j:", kdj[2])
}
def main():
    r = exchange.GetRecords(PERIOD_M15)
    kdj = TA.KDJ(r, 9, 3, 3)
    Log("k:", kdj[0], "d:", kdj[1], "j:", kdj[2])
void main() {
    auto r = exchange.GetRecords();
    auto kdj = TA.KDJ(r, 9, 3, 3);
    Log("k:", kdj[0], "d:", kdj[1], "j:", kdj[2]);
}

RSI - 相対強度指数

TA.RSI(data, period), 既定周期パラメータが 14 で,一次元配列を返します.

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var rsi = TA.RSI(records, 14)
    Log(rsi)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    rsi = TA.RSI(r, 14)
    Log(rsi)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto rsi = TA.RSI(r, 14);
    Log(rsi); 
}

ATR - 平均的な真価変動

TA.ATR(data, period); ATR ((data, period),デフォルトの周期パラメータが 14 で,一次元配列を返します.

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var atr = TA.ATR(records, 14)
    Log(atr)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    atr = TA.ATR(r, 14)
    Log(atr)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto atr = TA.ATR(r, 14);
    Log(atr);
}

OBV - バランス量

TA.OBV(data)単次元配列を返します.

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var obv = TA.OBV(records)
    Log(obv)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    obv = TA.OBV(r)
    Log(obv)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto obv = TA.OBV(r);
    Log(obv);
}

MA - 移動平均値

TA.MA(data, period); MA ((data, period), デフォルトの周期パラメータが 9 で, 1 次元の配列を返します.

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var ma = TA.MA(records, 14)
    Log(ma)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    ma = TA.MA(r, 14)
    Log(ma)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto ma = TA.MA(r, 14);
    Log(ma);
}

EMA - 指数関数移動平均

TA.EMA(data, period)指数的な平均指標で,デフォルトの周期パラメータは9で,一次元配列を返します.

function main(){
    var records = exchange.GetRecords()
    // Determine if the number of K-line bars meets the requirement of the indicator calculation period 
    if (records && records.length > 9) {
        var ema = TA.EMA(records, 9)          
        Log(ema)
    }
}
def main():
    r = exchange.GetRecords()
    if r and len(r) > 9:
        ema = TA.EMA(r, 9)
        Log(ema)
void main() {
    auto r = exchange.GetRecords();
    if(r.Valid && r.size() > 9) {
        auto ema = TA.EMA(r, 9);
        Log(ema);
    }
}

BOLL - ボリンガー帯

TA.BOLL(data, period, multiplier); BOLL ((data, period, multiplier) はボリンジャー帯の指標で,デフォルトパラメータは (20, 2) で,2次元の配列を返します.[Upline, Midline, Downline].

function main() {
    var records = exchange.GetRecords()
    if(records && records.length > 20) {
        var boll = TA.BOLL(records, 20, 2)
        var upLine = boll[0]
        var midLine = boll[1]
        var downLine = boll[2]
        Log(upLine)
        Log(midLine)
        Log(downLine)
    }
}
def main():
    r = exchange.GetRecords()
    if r and len(r) > 20:
        boll = TA.BOLL(r, 20, 2)
        upLine = boll[0]
        midLine = boll[1]
        downLine = boll[2]
        Log(upLine)
        Log(midLine)
        Log(downLine)
void main() {
    auto r = exchange.GetRecords();
    if(r.Valid && r.size() > 20) {
        auto boll = TA.BOLL(r, 20, 2);
        auto upLine = boll[0];
        auto midLine = boll[1];
        auto downLine = boll[2];
        Log(upLine);
        Log(midLine);
        Log(downLine);
    }
}

アリガター - アリガター指標

TA.Alligator(data, mandible period, tooth period, upper lip period); Alligator ((data, mandible period, tooth period, upper lip period) は,デフォルトパラメータ (13,8,5) を持つ Alligator インディケーターで,二次元配列を返します.[Mandible, Teeth, Upper Lip].

CMF - チャイキン・マネー・フロー

TA.CMF(data, period); CMF ((data, period) はチャイキンマネーフロー指標で,デフォルトの期間のパラメータは20で,一次元配列を返します.

最高値 - 期間中最高値

TA.Highest(data, period, attribute), 最新期間の最大値 (現在のバーを除く) を返します.TA.Highest(records, 30, 'High'). もしperiodB が 0 であれば,すべての B が 0 になります.attribute指定されていない場合,データは通常の配列とみなされ,価格 (値型) を返します.

最低値 - 期間 最低値

TA.Lowest(data, period, attribute), 最新期間の最小値 (現在のバーを除く) を返します.TA.Highest(records, 30, 'Low'). もしperiod値が 0 であれば,すべてのバーを表示します.属性が指定されていない場合,データは通常の配列とみなされ,価格 (値型) が返されます.

薬剤の使用TA.Highest(...)そしてTA.Lowest(...)についてC++戦略は,HighestそしてLowest最初のパラメータは返信値ではありません.auto r = exchange.GetRecords()式を呼び出す必要があります.r特定の属性データを送信します 例えば: passr.Close()コール方法Close, High, Low, Open, Volumeそれはちょうどr.Close().

C++例として:

void main() { 
    Records r;
    r.Valid = true;
    for (auto i = 0; i < 10; i++) {
        Record ele;
        ele.Time = i * 100000;
        ele.High = i * 10000;
        ele.Low = i * 1000;
        ele.Close = i * 100;
        ele.Open = i * 10;
        ele.Volume = i * 1;
        r.push_back(ele);
    }

    for(int j = 0; j < r.size(); j++){
        Log(r[j]);
    }

    // Note: if the first parameter passed in is not r, you need to call "r.Close()"
    auto highest = TA.Highest(r.Close(), 8);   
    Log(highest);                     
}

添付された第三者ライブラリ

JavaScript

C++

  • JavaScript図書館http://mathjs.org/

    function main() {
        Log(math.round(math.e, 3))                // 2.718
        Log(math.atan2(3, -3) / math.pi)          // 0.75
        Log(math.log(10000, 10))                  // 4
        Log(math.sqrt(-4))                        // {"mathjs":"Complex","re":0,"im":2}   
    }
    

    http://mikemcl.github.io/decimal.js/

    function main() {
        var x = -1.2
        var a = Decimal.abs(x)
        var b = new Decimal(x).abs()
        Log(a.equals(b))                           // true  
    
        var y = 2.2
        var sum = Decimal.add(x, y)
        Log(sum.equals(new Decimal(x).plus(y)))

もっと