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言語の組み込み文字列サポート)ascii
そしてutf-16
暗号化できない文字列に出くわしたとき,ArrayBuffer
文字列パラメータを通過できるすべての API インターフェースは,ArrayBuffer
type.
複数のスレッド機能がサポートされています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")])))
}
について__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)
}
}
について__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)
}
について__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
}
について__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(threadId, key)
, この関数はスレッド間で共有される変数にアクセスするために使用されます.スレッドが実行していない場合にデータが有効です.__threadJoin
機能 (成功した出口を待っている) を実行していない__threadTerminate
パラメータは,この関数で,threadId
線 ID とパラメータkey
保存されたキーネームです.key-value
返却値: に対応するキー値を返します.key
についてkey-value
pair.
threadId
0 は主糸を表示します (つまり,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"))
}
__threadSetData(threadId, key, value)
このパラメータは,スレッド環境の変数を保存するために使用されます.threadId
線 ID,パラメータkey
保存されたキーネームです.key-value
パラメーターvalue
この関数には返される値はありません.
threadId
0 は主糸を表示します (つまり,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()
パラメータなしで,現在のスレッドの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(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(module, opt)
モデルインスタンスを作成します.module
パラメータは wasm モデルで,opt
パラメータは, wasm インスタンスのプログラムに割り当てられたスタックスペースを設定するために使用される構成情報です. 返却値: wasm モデルインスタンスを返します.
opt
パラメータ設定例:
{
stack_size: 65*1024*1024,
}
callFunction(funcName, param1, ...)
, これは wasm モデルインスタンスの方法であり, wasm モデルインスタンスの関数を実行するために使用されます.funcName
パラメータは実行される関数の名前で,param1
パラメータは,関数を実行するときに渡されたパラメータです (パラメータによって指定されます)funcName
).
FMZ Quant Trading プラットフォームは,公式にアクセス可能で,web3
ネットワークの契約defi
簡単に交換できます
戦略コードを書いて,Ethereumチェーン上でスマートコントラクトのメソッドコールを実装します.exchange.IO
FMZ Quant Trading プラットフォームのアクセスノードを設定します. アクセスノードは自己構築のノードまたは第三者のサービスを使用することができます.infura
.
このページではWeb3
設定するRpc Address
(アクセスノードのサービスアドレス)Private Key
(プライベートキー) プライベートキーの局所的な展開をサポートします.鍵 の 安全].
標準的な契約を呼び出すERC20
標準契約以外の方法を呼び出すには,ABI コンテンツを登録する必要があります:exchange.IO("abi", tokenAddress, abiContent)
契約の ABI コンテンツを取得するには,結果フィールドのみを取って,次の URL を使用できます.
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
標準値の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
公開されているプラットフォームを参照できます.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.IO
にencode
:
tuple
:{
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}
送信されたパラメータは,また,構造とタイプのtuple
定義されているようにtypes
パラメータ:tuple(a uint256, b uint8, c address)
.
bytes
:"0011"
配列や配列を含むタイプの配列コードをサポートする:
function main() {
var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"] // ETH address, USDT address
var ret = exchange.IO("encode", "address[]", path)
Log("encode: ", ret)
}
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.IO
function は呼び出すスマートコントラクトのアドレスです
呼び出す方法が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
: ウォレットアドレスは例の文字列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
: 許可された契約の住所,例は文字列で置き換えられます 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
方法の呼び出しは,一般の参照してください
偽コードは,いくつかの詳細を記述するために使用されます:
exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data)
ContractV3SwapRouterV2
: Uniswap V3 のルーター v2 アドレスvalue
ETHの金額を 0 に設定します.tokenIn
取引のトークンはETHではありません.deadline
: 設定できます(new Date().getTime() / 1000) + 3600
1時間有効です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
システムデフォルトの値をすべて使います
この例では,stateMutability
中multicall(uint256,bytes[])
方法としてpayable
そして,value
パラメータを入力する必要があります.stateMutability":"payable"
視界から見ることができますABI
.....exchange.IO
要求されるパラメータを決定します.stateMutability
の属性ABI
登録されている場合stateMutability
属性はnonpayable
,パラメータvalue
送信する必要はありません.
function main() {
Log(exchange.IO("address")) // Print the wallet address of the private key configured on the exchange object.
}
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
FMZ Quant トレーディングプラットフォームの指標ライブラリは,一般的に使用される指標アルゴリズムを最適化して,JavaScript
, Python
そしてcpp
オープンソースのTAライブラリコード.
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]);
}
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]);
}
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);
}
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);
}
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);
}
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);
}
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);
}
}
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]
.
TA.CMF(data, period)
; CMF ((data, period) はチャイキンマネーフロー指標で,デフォルトの期間のパラメータは20で,一次元配列を返します.
TA.Highest(data, period, attribute)
, 最新期間の最大値 (現在のバーを除く) を返します.TA.Highest(records, 30, 'High')
. もしperiod
B が 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
図書館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)))