FMZ手机APP交易终端,赋能你的量化交易体验

Author: 小小梦, Created: 2023-10-27 16:06:15, Updated: 2023-10-30 15:43:08

[TOC]

img

在量化交易领域,简单易用的量化交易工具一直是实现财富增长和风险管理的关键之一。然而,随着市场的竞争愈加激烈,传统的交易工具已不再足以应对快速变化的市场需求。为了广大量化交易者在这个不断演进的数字资产世界中保持竞争优势,FMZ手机APP上新增了一项重大功能:交易终端。这一功能不仅将提高您的交易效率,还将赋能您通过自定义插件程序来辅助交易,为您的交易生涯注入新的活力。

交易终端入门指南:

什么是FMZ手机APP交易终端?

在FMZ量化交易平台,手机APP下载页面可以下载FMZ量化手机APP。下载安装之后打开FMZ手机APP,登录FMZ账号。

img

需要注意FMZ量化分为FMZ.COM国际站、FMZ.CN国内站(支持的市场不同),在此登录时需要选择对应的站点,不同的站点账户是独立的,并不通用。

FMZ量化交易平台手机APP交易终端,是一个把各大交易所API封装集中后的量化交易工具。可以在各个交易所快速切换,依托于FMZ平台的各种功能可以实现数据抓取分析,实时数据监控,程序化辅助交易,半自动、手动交易等操作。


如何访问和启用交易终端功能?

FMZ量化手机APP登录以后,可以看到主界面上的「交易终端」功能,点击即可进入交易终端界面。

在FMZ推出手机APP交易终端之前,FMZ的web端很早就上线了交易终端这个功能,不论是web端的交易终端,还是手机APP端的交易终端,都必须至少部署一个托管者程序。 因为所有实际发送到交易所的交互请求都是从托管者上执行的,并不是在手机APP上,更加安全。并且也避免了API KEY绑定IP地址,手机IP变动就无法使用的痛点。

img


交易终端界面详解

1、交易终端主界面:

打开交易终端之后,可以看到交易终端的主要界面,点击红框区域可以打开「托管者」、「交易所」、「交易对」配置界面。

  • 托管者:在当前FMZ账号部署的所有托管者程序都会在列表中,可以选择具体的托管者使用。
  • 交易所:在当前FMZ账号中配置创建的交易所对象(配置API KEY等信息)也会出现在对应列表中,可以选择所要操作的具体交易所(账号)。
  • 交易对:设置当前交易终端所要操作的交易对,合约。交易对输入框控件中会根据输入的信息匹配显示可选择的交易对、合约。

img


2、交易区:

交易区域显示市场深度数据; 交易控件可以设置下单价格、下单数量、下单方向、杠杆等设置。

img

主界面底部分标签显示「订单」、「持仓」、「资产」等信息,使您的资金、仓位、订单一目了然。


3、K线图表:

如果在下单操作的时候还希望看一下K线图表,这里很贴心的设计了一个折叠展示控件,用来展开当前品种的迷你K线图表。

img


如果希望有更大的区域显示K线图表,显示市场成交记录、深度等信息,可以点击这个K线图标跳转到专业K线图表页面。

img


专业K线图表界面:

img


专业K线图表界面还可以横屏展示:

img


交易插件

交易终端插件可以做什么?

  • 实时市场数据计算和展示。
  • 下单和订单管理。
  • 实现风险管理。
  • 半自动辅助交易策略。

使用哪些编程语言和工具来开发插件?

  • python
  • javascript
  • c++

可以GET到什么?

  • 将您的插件分享到社区与开发者共同学习。
  • 从其他开发者那里学习并获取灵感。
  • 与其他量化交易爱好者互动。

以实际应用场景来举个例子

在FMZ社区,用户提出了一个这样的需求:

使用js遍历币安交易所所有的U合约币种,并且每个币种都开仓10u(开多),请问这个代码怎么写。

这个需求场景其实完全就可以用交易终端插件实现,并且交易终端运行插件策略是不计费的,相对于长期运行的实盘策略交易终端插件辅助交易无疑是一个很好的选择。

我们来看如何设计实现用户提出的这一需求。

首先需要创建一个交易终端插件,给这个插件策略添加3个参数:

img

然后开始编写插件程序:

function main() {
    let exName = exchange.GetName()
    if (exName != "Futures_Binance") {
        return "not support!"
    }

    let apiBase = "https://fapi.binance.com"
    if (isSimulate) {
        apiBase = "https://testnet.binancefuture.com"        
        Log("切换基地址:", apiBase)
    }
    exchange.SetBase(apiBase)
    
    try {
        var obj = JSON.parse(HttpQuery(apiBase + "/fapi/v1/exchangeInfo"))
    } catch (e) {
        Log(e)
    }
    
    let pairs = []
    for (var i in obj.symbols) {
        if (obj.symbols[i]["status"] !== "TRADING" || obj.symbols[i]["quoteAsset"] !== "USDT") {
            continue
        }
        let = pair = obj.symbols[i]["baseAsset"] + "_" + obj.symbols[i]["quoteAsset"]
        pairs.push(pair)
    }
    
    let markets = _C(exchange.GetMarkets)
    for (var i in pairs) {
        // /*
        // 这里为了测试,只开仓10个品种,如果要全品种,这段注释内容可以删除
        if (i >= 9) {
            break
        }
        // */

        let pair = pairs[i]
        exchange.SetCurrency(pair)
        exchange.SetContractType("swap")
        let ticker = exchange.GetTicker()
        if (!ticker) {
            continue 
        }
        
        let = amountPrecision = markets[pair + ".swap"]["AmountPrecision"]
        exchange.SetDirection("buy")
        let amount = _N(qty / ticker.Last, amountPrecision)
        if (amount > 0) {
            exchange.Buy(-1, amount)
        }

        Sleep(100)
    }

    // 获取所有持仓
    let pos = exchange.IO("api", "GET", "/fapi/v2/positionRisk")
    if (!pos) {
        return 
    }
    
    // 查看持仓
    return pos.filter(item => Number(item.positionAmt) != 0)
}

交易终端插件编写完成之后,就可以测试了:

在手机APP的交易终端里,点击「…」按钮即可打开交易终端插件列表,在当前FMZ账号策略库中的交易终端插件都会显示在这个列表里,选择就可以使用。

img

在手机APP上操作完成后,我们使用以下代码查询一下币安模拟盘的持仓:

function main() {
    let apiBase = "https://testnet.binancefuture.com"
    exchange.SetBase(apiBase)

    let pos = exchange.IO("api", "GET", "/fapi/v2/positionRisk")
    if (!pos) {
        return 
    }

    // 查看持仓
    return pos.filter(item => Number(item.positionAmt) != 0)
}

查询到数据:

[{
	"symbol": "ETCUSDT",
	"entryPrice": "16.17",
	"unRealizedProfit": "0.08567881",
	"positionSide": "LONG",
	"updateTime": 1698420908103,
	"isolated": false,
	"breakEvenPrice": "16.176468",
	"leverage": "20",
	"adlQuantile": 3,
	"positionAmt": "0.65",
	"markPrice": "16.30181356",
	"liquidationPrice": "0",
	"maxNotionalValue": "400000",
	"marginType": "cross",
	"notional": "10.59617881",
	"isolatedMargin": "0.00000000",
	"isAutoAddMargin": "false",
	"isolatedWallet": "0"
}, {
	"positionAmt": "105",
	"markPrice": "0.09371526",
	"liquidationPrice": "0",
	"leverage": "20",
	"maxNotionalValue": "90000",
	"positionSide": "LONG",
	"isolatedWallet": "0",
	"symbol": "TRXUSDT",
	"updateTime": 1698420906668,
	"breakEvenPrice": "0.094497784",
	"isolatedMargin": "0.00000000",
	"isolated": false,
	"entryPrice": "0.09446",
	"adlQuantile": 1,
	"unRealizedProfit": "-0.07819770",
	"isAutoAddMargin": "false",
	"notional": "9.84010230",
	"marginType": "cross"
}, {
	"unRealizedProfit": "-0.00974456",
	"isAutoAddMargin": "false",
	"notional": "9.97449543",
	"isolatedWallet": "0.50309216",
	"updateTime": 1698420905377,
	"markPrice": "67.85371047",
	"isolatedMargin": "0.49334760",
	"adlQuantile": 2,
	"symbol": "LTCUSDT",
	"entryPrice": "67.92",
	"liquidationPrice": "64.91958163",
	"maxNotionalValue": "250000",
	"positionSide": "LONG",
	"isolated": true,
	"positionAmt": "0.147",
	"breakEvenPrice": "67.947168",
	"leverage": "20",
	"marginType": "isolated"
}, {
	"liquidationPrice": "1613.23261508",
	"marginType": "isolated",
	"isolated": true,
	"symbol": "ETHUSDT",
	"entryPrice": "1784.27",
	"markPrice": "1783.35661952",
	"isAutoAddMargin": "false",
	"positionSide": "LONG",
	"notional": "8.91678309",
	"leverage": "10",
	"maxNotionalValue": "30000000",
	"isolatedWallet": "0.89551774",
	"adlQuantile": 1,
	"positionAmt": "0.005",
	"breakEvenPrice": "1784.983708",
	"unRealizedProfit": "-0.00456690",
	"isolatedMargin": "0.89095084",
	"updateTime": 1698420900362
}, {
	"positionAmt": "17.1",
	"marginType": "cross",
	"isolatedWallet": "0",
	"adlQuantile": 2,
	"liquidationPrice": "0",
	"maxNotionalValue": "250000",
	"positionSide": "LONG",
	"isolated": false,
	"symbol": "EOSUSDT",
	"breakEvenPrice": "0.6432572",
	"updateTime": 1698420904257,
	"isolatedMargin": "0.00000000",
	"isAutoAddMargin": "false",
	"notional": "10.34550000",
	"entryPrice": "0.643",
	"markPrice": "0.60500000",
	"unRealizedProfit": "-0.64980000",
	"leverage": "20"
}, {
	"isolated": false,
	"adlQuantile": 1,
	"liquidationPrice": "0",
	"maxNotionalValue": "10000000",
	"notional": "9.73993328",
	"leverage": "20",
	"updateTime": 1698420901638,
	"symbol": "BCHUSDT",
	"entryPrice": "250.0",
	"markPrice": "243.49833219",
	"isAutoAddMargin": "false",
	"positionSide": "LONG",
	"positionAmt": "0.040",
	"breakEvenPrice": "250.1",
	"isolatedMargin": "0.00000000",
	"unRealizedProfit": "-0.26006671",
	"marginType": "cross",
	"isolatedWallet": "0"
}]

可以看到开出了6个仓位,是因为实际下单时由于是模拟盘,很容易触发限价;另外由于是10U的金额下单很容易触发交易对的最小下单金额限制;所以有几个交易对没有下单成功。 如果实际使用需要考虑更多的实际情况,从而优化这个插件以便于更好的使用,这里这个代码仅用作教学交流。


其它有趣的FMZ内置插件

FMZ量化交易平台手机APP交易终端还有很多有趣的插件,快来一起探索吧!

/upload/asset/16b436307a4ce5c246c2.mp4


THE END

FMZ手机APP的新交易终端功能将成为您在数字资产市场中的得力助手,让您能够更灵活地应对市场波动和机会。不再局限于传统交易策略,通过自定义插件程序,您可以创造出更智能、更高效、更适应市场的交易策略。让我们一起开启这个令人兴奋的量化交易新篇章,提升您的交易技能和收益。


More

weix1ao 梦总nb,移动端真方便

小小梦 感谢支持,平台开发工程师都很厉害,后续还会增加更多实用功能,用户有需求可以尽管提。