Files
strategies/Utility-Logger.md
T

543 lines
17 KiB
Markdown
Raw Normal View History

2021-12-07 00:45:45 +08:00
2023-07-14 18:39:48 +08:00
> Name
2021-12-07 00:45:45 +08:00
2023-04-18 23:12:35 +08:00
Utility-Logger
2021-12-07 00:45:45 +08:00
2023-07-14 18:39:48 +08:00
> Author
2021-12-07 00:45:45 +08:00
btcvegas
2023-07-14 18:39:48 +08:00
> Strategy Description
2021-12-07 00:45:45 +08:00
设置不同的level,控制日志输出等级
2023-07-14 18:39:48 +08:00
> Strategy Arguments
2021-12-07 00:45:45 +08:00
2023-07-14 18:39:48 +08:00
|Argument|Default|Description|
2021-12-07 00:45:45 +08:00
|----|----|----|
|level|0|Logging Level: DEBUG|INFO|WARNING|ERROR|
|routeFilter|0|Route Filter: All|route1|route2|route3|route4|
2023-07-14 18:39:48 +08:00
> Source (javascript)
2021-12-07 00:45:45 +08:00
``` javascript
2023-04-18 23:12:35 +08:00
2021-12-07 00:45:45 +08:00
//var COLOR_ERROR = "#FF0000"
//var COLOR_WARN = "#FF0000"
//var COLOR_INFO = "#0000FF"
//var COLOR_DEBUG = "#000000"
var LEVER_PATTERN = {
DEBUG: 0,
INFO: 1,
WARNING: 2,
ERROR: 3
}
2023-02-07 22:05:02 +08:00
$.changeLoggerLever = function (val) {
2021-12-07 00:45:45 +08:00
level = val
}
//var loggerLever = [LEVER_PATTERN.DEBUG, LEVER_PATTERN.INFO, LEVER_PATTERN.WARNING, LEVER_PATTERN.ERROR][level]
2023-02-07 22:05:02 +08:00
$.Error = function (msg, obj, route = 'route') {
if (level == 0 || "route" + routeFilter == route) {
2021-12-07 00:45:45 +08:00
Log('[ERR] ', "[" + route.toUpperCase() + "]", msg, obj, '#0000FF')
}
2023-02-07 22:05:02 +08:00
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
$.Warn = function (msg, obj, route = 'route') {
if (routeFilter == 0 || "route" + routeFilter == route) {
2021-12-07 00:45:45 +08:00
if (level <= LEVER_PATTERN.WARNING) {
Log('[WAR] ', "[" + route.toUpperCase() + "]", msg, obj, '#0000FF')
}
}
}
2023-02-07 22:05:02 +08:00
$.Info = function (msg, obj, route = 'route') {
if (routeFilter == 0 || "route" + routeFilter == route) {
2021-12-07 00:45:45 +08:00
if (level <= LEVER_PATTERN.INFO) {
2023-02-07 22:05:02 +08:00
Log('[INF] ', "[" + route.toUpperCase() + "]", msg, obj, '#0000FF')
2021-12-07 00:45:45 +08:00
}
}
}
2023-02-07 22:05:02 +08:00
$.Debug = function (msg, obj, route = 'route') {
if (routeFilter == 0 || "route" + routeFilter == route) {
2021-12-07 00:45:45 +08:00
if (level <= LEVER_PATTERN.DEBUG) {
Log('[DBG] ', "[" + route.toUpperCase() + "]", msg, obj, '#0000FF')
}
}
}
2022-03-09 16:09:19 +08:00
var executedBlocksCross = []
var executedBlocksCrossIds = []
2023-02-07 22:05:02 +08:00
var takerExecutionSummary = []
2021-12-07 00:45:45 +08:00
var executedTrades = []
var blocksLatency = []
var blocksLatencyV2 = []
var executedTradesTriangular = []
var positionHistory = []
var volumeHistory = []
var currentStatus = []
2023-04-18 23:12:35 +08:00
var blocksTimestamps = []
2021-12-07 00:45:45 +08:00
var tradesTable = {
type: 'table',
title: 'Executed Trades',
cols: ['Timestamp', 'Label-Id', 'Contract', 'Exch-Id', 'Exchange', 'Side', 'Px', 'Amt', 'Fees'],
rows: executedTrades
}
2023-04-18 23:12:35 +08:00
var timestampsTable = {
2021-12-07 00:45:45 +08:00
type: 'table',
title: 'Timestamps',
2023-04-18 23:12:35 +08:00
cols: ['Label-Id', 'Exch-Mkr', 'Start', 'End', 'Mkr-Live', 'Cancel-Mkr', 'Cancel-Exec', 'Creating-Tkr', 'Tkr-Live', 'Complete'],
rows: blocksTimestamps
}
var latencyTable = {
type: 'table',
title: 'Latency',
2023-02-07 22:05:02 +08:00
cols: ['Label-Id', 'Exch-Mkr', 'Start', 'End', 'Book-T', 'Book-M', 'Mkr-Live', 'Cancel-Mkr', 'Cancel-Exec', 'Creating-Tkr', 'Tkr-Live', 'Complete'],
2021-12-07 00:45:45 +08:00
rows: blocksLatencyV2
}
var posTable = {
type: 'table',
title: 'Position History',
cols: ['Timestamp', 'Exch1', 'Exch2', 'Exch1-Pos', 'Exch2-Pos', 'Exposure'],
rows: positionHistory
}
var volumeTable = {
type: 'table',
title: 'Volume Traded',
cols: ['Date', 'Exch1', 'Exch2', 'Exch1-Trade Amt', 'Exch2-Trade Amt', 'Exch1-Total Volume', 'Exch2-Total Volume'],
rows: volumeHistory
}
2022-03-09 16:09:19 +08:00
var blocksTableIds = {
type: 'table',
title: 'Executed Blocks - Ids',
cols: ['Date', 'Label-Id', 'Exch-B', 'Exch-S', 'MkrId', 'TkrId', 'Route'],
rows: executedBlocksCrossIds
}
var blocksTable = {
2021-12-07 00:45:45 +08:00
type: 'table',
title: 'Executed Blocks',
2022-03-09 16:09:19 +08:00
cols: ['Date', 'Label-Id', 'Exch-B', 'Sprd-%', 'Slip-%', 'Sprd-$', 'Val', 'B-Px', 'S-Px', 'B-Amt', 'S-Amt', 'Lc', 'Lat', 'Tries'],
rows: executedBlocksCross
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
var blocksTakerSummary = {
type: 'table',
title: 'Taker Exec',
cols: ['Label-Id', 'Exch-B', 'Slip-%', 'Book-T', 'Book-M', 'Taker-Liq', 'Taker-Px-Init', 'Taker-Px-Sent'],
rows: takerExecutionSummary
}
2021-12-07 00:45:45 +08:00
var tradesTable_triangular = {
type: 'table',
title: 'Executed Blocks',
cols: ['Timestamp', 'Label-Id', 'Exc Sprd', 'Buy-Px', 'Sell-Px', 'Con-Px', 'Buy-Amt', 'Sell-Amt', 'Con-Amt', 'Mkr-Id', 'Tkr-Id', 'Con-Id', 'Loc', 'Lat-Exch', 'Lat-React'],
rows: executedTradesTriangular
}
var currentStatusTable = {
type: 'table',
title: 'Current Status',
cols: ['Timestamp', 'Variable Name', 'Route 1', 'Route 2', 'Route 3', 'Route 4'],
rows: currentStatus
}
/*
Logs the current status of the bot per route. Variables that it tracks:
- Bot State
- Taker Book
- Maker Book
*/
2023-02-07 22:05:02 +08:00
$.logBotStatus = function () {
2021-12-07 00:45:45 +08:00
currentStatus.push(
[
new Date().toLocaleString("da-DK"), // Timestamp
"botState",
_G("botStateroute1"),
_G("botStateroute2"),
_G("botStateroute3"),
_G("botStateroute4")
]
)
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
/* LOC, represents the part of the code that triggered the liquidation.
0- Order creation -> order executed as taker.
1- Order Status -> normal check via websocket.
2- Order Cancellation -> order was executed while the bot was trying to cancel it.
3- REST Update -> bot had to check status via rest.
*/
2023-02-07 22:05:02 +08:00
$.logArbProfit = function (makerTrade, takerTrade, conversionPrice, route, conversionTrade = null) {
if (makerTrade.side == 0 || makerTrade.side == "Buy") {
2021-12-07 00:45:45 +08:00
buyTrade = makerTrade
sellTrade = takerTrade
}
2023-02-07 22:05:02 +08:00
else if (makerTrade.side == 1 || makerTrade.side == "Sell") {
2021-12-07 00:45:45 +08:00
buyTrade = takerTrade
sellTrade = makerTrade
}
2023-02-07 22:05:02 +08:00
else if (takerTrade.side == 0 || takerTrade.side == "Buy") {
2021-12-07 00:45:45 +08:00
buyTrade = takerTrade
sellTrade = makerTrade
}
2023-02-07 22:05:02 +08:00
else if (takerTrade.side == 1 || takerTrade.side == "Sell") {
2021-12-07 00:45:45 +08:00
buyTrade = makerTrade
sellTrade = takerTrade
}
tradeSpread = 0
2023-02-07 22:05:02 +08:00
if (conversionTrade) {
2021-12-07 00:45:45 +08:00
tradeSpread = tradeSpreadTriangular(makerTrade, takerTrade, conversionTrade)
}
else {
tradeSpread = tradeSpreadCross(buyTrade, sellTrade, route)
}
2023-02-07 22:05:02 +08:00
if (tradeSpread > -50 && tradeSpread < 200) {
2021-12-07 00:45:45 +08:00
LogProfit(tradeSpread)
2023-02-07 22:05:02 +08:00
}
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
$.logBlockTrades = function (makerTrade, takerTrade, conversionTrade, labelId, loc, route, lat_mkr, lat_trk, lat_mkr_cancel, lat_cyc, tries, premiumTarget, discountTarget) {
2023-04-18 23:12:35 +08:00
if (takerTrade && makerTrade) {
2023-01-11 17:10:25 +08:00
logTradesCross(makerTrade, takerTrade, labelId, loc, route, lat_trk, lat_cyc, tries, premiumTarget, discountTarget)
$.logLatency(labelId, makerTrade.exchange, lat_mkr, lat_trk, lat_mkr_cancel, lat_cyc)
2023-02-07 22:05:02 +08:00
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
else {
2023-01-11 17:10:25 +08:00
$.Warn("[Utility Logger] Cannot Log Trade", takerTrade)
2021-12-07 00:45:45 +08:00
}
}
2023-02-07 22:05:02 +08:00
$.logExecutions = function (trade, exchange) {
2021-12-07 00:45:45 +08:00
var date = Date.now().toLocaleString()
2023-02-07 22:05:02 +08:00
if (trade.DealAmount > 0) {
// insert to executed Trades
executedTrades.splice(0, 0,
2021-12-07 00:45:45 +08:00
[
date.substring(0, date.length - 3),
trade.label,
trade.contract,
trade.Id,
exchange,
trade.Type,
trade.AvgPrice,
trade.DealAmount,
trade.fees
]
)
2023-02-07 22:05:02 +08:00
// updates executed Blocks Cross if order found
for (block of executedBlocksCross) {
if (trade.label == block[1] && trade.label != null) {
if (trade.Type == "Buy") {
block[7] = trade.AvgPrice // Price
block[9] = trade.DealAmount // Amount
block[5] = _N(block[8] - trade.AvgPrice, 4) // Spread Nominal
block[3] = _N(((block[8] / trade.AvgPrice - 1) * 100), 3) // Spread %
block[6] = _N((block[8] * block[10]) - (trade.AvgPrice * trade.DealAmount), 2) // Value
}
else if (trade.Type == "Sell") {
block[8] = trade.AvgPrice
block[10] = trade.DealAmount
block[5] = _N(trade.AvgPrice - block[7], 4) // Spread Nominal
block[3] = _N(((trade.AvgPrice / block[7] - 1) * 100), 3) // Spread %
block[6] = _N((trade.AvgPrice * trade.DealAmount) - (block[7] * block[9]), 2)
}
}
}
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
$.logPosition = function (exch1, exch2, exh1pos, exch2pos) {
positionHistory.splice(0, 0,
2021-12-07 00:45:45 +08:00
[
new Date().toLocaleString("da-DK"),
2023-02-07 22:05:02 +08:00
exch1,
2021-12-07 00:45:45 +08:00
exch2,
exh1pos,
2023-02-07 22:05:02 +08:00
exch2pos,
2021-12-07 00:45:45 +08:00
_N(exh1pos + exch2pos, 3)
]
)
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
$.logTakerExecutionSummary = function (labelId, exchange, orderbook_latency_taker, orderbook_latency_maker, taker_liquidity, taker_price_init, taker_price_sent) {
takerExecutionSummary.splice(0, 0,
[
labelId,
exchange.GetName(),
0,
orderbook_latency_taker,
orderbook_latency_maker,
taker_liquidity,
taker_price_init,
taker_price_sent
]
)
2021-12-07 00:45:45 +08:00
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2023-02-07 22:05:02 +08:00
}
2021-12-07 00:45:45 +08:00
2023-02-07 22:05:02 +08:00
$.logVolume = function (exch1, exch2, amt1, amt2) {
var volExchange1 = _G("accumulatedVolume" + exch1) + amt1
var volExchange2 = _G("accumulatedVolume" + exch2) + amt2
volumeHistory.splice(0, 0,
2021-12-07 00:45:45 +08:00
[
new Date().toLocaleString("da-DK"),
2023-02-07 22:05:02 +08:00
exch1,
2021-12-07 00:45:45 +08:00
exch2,
2023-02-07 22:05:02 +08:00
_N(amt1, 2),
2021-12-07 00:45:45 +08:00
_N(amt2, 2),
_N(volExchange1, 2),
_N(volExchange2, 2)
]
)
2023-02-07 22:05:02 +08:00
_G("accumulatedVolume" + exch1, volExchange1),
_G("accumulatedVolume" + exch2, volExchange2)
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
/* Latencies measured.
Send Maker Latency -> latency from sending the order to the maker exchange. Status CREATING_MAKER to RECEIVING_MAKER
Cancel Maker Latency -> latency from trying to cancel the order at the maker exchange. Status SENDING_CANCEL to RECEIVING_CANCEL
Execution Report Latency -> order was executed while the bot was trying to cancel it. Status CANCELLED_EXECUTION to CREATING_TAKER
Sending Taker Latency -> latencry from sending the liquidation order to taker exchange. Status CREATING_TAKER to TAKER_LIVE
Reaction Latency -> Composite latency from moment of transaction notification to sending taker. CANCELLED_EXECUTION to TAKER_LIVE
Full Cycle Latency -> Composite latency from moment of transaction notification to full taker liquidation. CANCELLED_EXECUTION to START.
*/
2023-02-07 22:05:02 +08:00
$.logLatency = function (labelId, exchange, lat_mkr, lat_tkr, lat_mkr_cancel, lat_cyc, lat_er = 0, lat_react = 0) {
blocksLatency.splice(0, 0,
2021-12-07 00:45:45 +08:00
[
2023-02-07 22:05:02 +08:00
labelId,
exchange.GetName(),
lat_mkr,
2021-12-07 00:45:45 +08:00
lat_mkr_cancel,
2023-02-07 22:05:02 +08:00
lat_er,
2021-12-07 00:45:45 +08:00
lat_tkr,
lat_react,
lat_cyc
]
)
2023-04-18 23:12:35 +08:00
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
$.logTimestamps = function (labelId, exchange, loc, start, creating_maker, maker_live, cancelling_maker, cancelled_execution, creating_taker, taker_live, process_execution, orderbook_latency_taker, orderbook_latency_maker) {
2021-12-07 00:45:45 +08:00
// If order is executed before the bot tries to cancel these status are irrelevante
2023-02-07 22:05:02 +08:00
if (loc < 2) {
2021-12-07 00:45:45 +08:00
cancelling_maker = maker_live
cancelled_execution = maker_live
}
2023-02-07 22:05:02 +08:00
blocksLatencyV2.splice(0, 0,
2021-12-07 00:45:45 +08:00
[
2023-02-07 22:05:02 +08:00
labelId,
2021-12-07 00:45:45 +08:00
exchange.GetName(),
2023-01-11 17:10:25 +08:00
start,
process_execution,
2023-02-07 22:05:02 +08:00
orderbook_latency_taker,
orderbook_latency_maker,
2021-12-07 00:45:45 +08:00
maker_live - creating_maker,
cancelling_maker - maker_live,
cancelled_execution - cancelling_maker,
creating_taker - cancelled_execution,
taker_live - creating_taker,
2023-02-07 22:05:02 +08:00
process_execution - taker_live,
2021-12-07 00:45:45 +08:00
]
)
2023-04-18 23:12:35 +08:00
blocksTimestamps.splice(0, 0,
[
labelId,
exchange.GetName(),
start,
process_execution,
maker_live,
cancelling_maker,
cancelled_execution,
creating_taker,
taker_live,
process_execution,
]
)
LogStatus('`' + JSON.stringify([blocksTable, blocksTableIds, tradesTable, posTable, volumeTable, latencyTable, timestampsTable, currentStatusTable, blocksTakerSummary]) + '`')
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
function logTradesCross(makerTrade, takerTrade, labelId, loc, route, lat_tkr, lat_cyc, tries, premiumTarget, discountTarget) {
2021-12-07 00:45:45 +08:00
2023-02-07 22:05:02 +08:00
if (makerTrade.side == 0 || makerTrade.side == "Buy") {
2021-12-07 00:45:45 +08:00
buyTrade = makerTrade
sellTrade = takerTrade
buyExchange = makerTrade.exchange.GetName()
2022-03-09 16:09:19 +08:00
sellExchange = takerTrade.exchange.GetName()
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
else if (makerTrade.side == 1 || makerTrade.side == "Sell") {
2021-12-07 00:45:45 +08:00
buyTrade = takerTrade
sellTrade = makerTrade
buyExchange = takerTrade.exchange.GetName()
2022-03-09 16:09:19 +08:00
sellExchange = makerTrade.exchange.GetName()
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
else if (takerTrade.side == 0 || takerTrade.side == "Buy") {
2021-12-07 00:45:45 +08:00
buyTrade = takerTrade
sellTrade = makerTrade
buyExchange = makerTrade.exchange.GetName()
2022-03-09 16:09:19 +08:00
sellExchange = takerTrade.exchange.GetName()
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
else if (takerTrade.side == 1 || takerTrade.side == "Sell") {
2021-12-07 00:45:45 +08:00
buyTrade = makerTrade
sellTrade = takerTrade
buyExchange = takerTrade.exchange.GetName()
2022-03-09 16:09:19 +08:00
sellExchange = makerTrade.exchange.GetName()
2021-12-07 00:45:45 +08:00
}
2022-03-09 16:09:19 +08:00
2023-02-07 22:05:02 +08:00
if (route == "route1" || route == "route2") {
2022-03-09 16:09:19 +08:00
targetSpread = premiumTarget
}
2023-02-07 22:05:02 +08:00
else if (route == "route3" || route == "route4") {
2022-03-09 16:09:19 +08:00
targetSpread = discountTarget
}
else {
targetSpread = 0
}
var executedSpread = tradeSpreadCross(buyTrade, sellTrade)
2023-02-07 22:05:02 +08:00
var cur_date = new Date()
2021-12-07 00:45:45 +08:00
//cur_date.setHours(d.getHours() - 4)
2022-03-09 16:09:19 +08:00
2023-01-11 17:10:25 +08:00
var blockData = [
cur_date.toLocaleString("ja-JP"), // Date
labelId, // Label Id
buyExchange, // Buy exchange
executedSpread, // Spread %
tradeSlippage(executedSpread, targetSpread), // Slippage
2023-02-07 22:05:02 +08:00
_N(sellTrade.price - buyTrade.price, 5), // Spread $
2023-01-11 17:10:25 +08:00
tradeValueCross(buyTrade, sellTrade), // Value $
2023-02-07 22:05:02 +08:00
_N(buyTrade.price, 5), // Buy Price
_N(sellTrade.price, 5), // Sell Price
2023-01-11 17:10:25 +08:00
buyTrade.size, // Buy Size
sellTrade.size, // Sell Size
loc, // Location of liquidation initiation
lat_cyc, // Total Cycle duration
tries // Number of tries to liquidate
]
Log("blockData", blockData)
var blockIds = [
cur_date.toLocaleString("da-DK", { timeZone: 'America/New_York' }),
labelId,
buyExchange,
sellExchange,
makerTrade.id,
takerTrade.id,
route
]
2023-02-07 22:05:02 +08:00
2023-01-11 17:10:25 +08:00
Log("blockIds", blockIds)
2023-02-07 22:05:02 +08:00
executedBlocksCross.splice(0, 0, blockData)
executedBlocksCrossIds.splice(0, 0, blockIds)
2021-12-07 00:45:45 +08:00
}
function tradeSpreadCross(buyTrade, sellTrade) {
2023-01-11 17:10:25 +08:00
return _N(((sellTrade.price / buyTrade.price - 1) * 100), 3)
2021-12-07 00:45:45 +08:00
}
2023-02-07 22:05:02 +08:00
function tradeValueCross(buyTrade, sellTrade) {
2021-12-07 00:45:45 +08:00
return _N((sellTrade.price * sellTrade.size) - (buyTrade.price * buyTrade.size), 2)
}
2023-02-07 22:05:02 +08:00
function tradeSlippage(executedSpread, targetSpread) {
2022-03-09 16:09:19 +08:00
var result = executedSpread - targetSpread
return _N(result, 2)
}
2023-02-07 22:05:02 +08:00
function logTradesTriangular(makerTrade, takerTrade, conversionTrade, labelId, loc, lat) {
2021-12-07 00:45:45 +08:00
conversionPrice = _N(conversionTrade.price, 6)
conversionSize = conversionTrade.size
conversionId = conversionTrade.id
executedTradesTriangular.push(
[Date.now(),
labelId,
2023-02-07 22:05:02 +08:00
(makerTrade.side == 0 || makerTrade.side == "Sell" || makerTrade.side == "sell") ? "Buy" : "Sell",
tradeSpreadTriangular(makerTrade, takerTrade, conversionTrade),
makerTrade.price,
takerTrade.price,
2021-12-07 00:45:45 +08:00
conversionPrice,
2023-02-07 22:05:02 +08:00
makerTrade.size,
takerTrade.size,
2021-12-07 00:45:45 +08:00
conversionSize,
2023-02-07 22:05:02 +08:00
makerTrade.id,
takerTrade.id,
conversionTrade.id,
2021-12-07 00:45:45 +08:00
loc,
lat
]
)
}
2023-02-07 22:05:02 +08:00
function tradeSpreadTriangular(makerTrade, takerTrade, conversionTrade) {
2021-12-07 00:45:45 +08:00
var result = 0
// if it is a triangular arbitrage trade
if (conversionTrade && makerTrade && takerTrade) {
if ((makerTrade.side == 1 || makerTrade.side == "Sell" || makerTrade.side == "sell")) {
result = _N(((makerTrade.price / (takerTrade.price * conversionTrade.price) - 1) * 100), 2)
2023-02-07 22:05:02 +08:00
}
2021-12-07 00:45:45 +08:00
else {
result = _N((((takerTrade.price * conversionTrade.price) / makerTrade.price - 1) * 100), 2)
}
}
}
2023-04-18 23:12:35 +08:00
2021-12-07 00:45:45 +08:00
```
2023-07-14 18:39:48 +08:00
> Detail
2021-12-07 00:45:45 +08:00
https://www.fmz.com/strategy/209236
2023-07-14 18:39:48 +08:00
> Last Modified
2021-12-07 00:45:45 +08:00
2023-04-18 23:12:35 +08:00
2023-02-28 05:26:51