Skip to content

Instantly share code, notes, and snippets.

@AJolly
Forked from QuantBits/script.js
Last active September 12, 2019 01:51
Show Gist options
  • Save AJolly/b45e8f97ef04b11124b2971bcb685c4a to your computer and use it in GitHub Desktop.
Save AJolly/b45e8f97ef04b11124b2971bcb685c4a to your computer and use it in GitHub Desktop.
BitMex USD Converter - For TemperMonkey
// ==UserScript==
// @name BitMex USD Converter
// @namespace https://bitmex.com/
// @version 0.13
// @description Get some sanity into your gambling.
// @author koinkraft, modified by @Jolly - https://www.twitter.com/Jolly
// @grant none
// @include https://bitmex.com/*
// @include https://www.bitmex.com/*
// @require https://code.jquery.com/jquery-2.1.4.min.js
// @downloadURL https://gist.github.com/AJolly/b45e8f97ef04b11124b2971bcb685c4a/raw/bitmexusd.user.js
// @updateURL https://gist.github.com/AJolly/b45e8f97ef04b11124b2971bcb685c4a/raw/bitmexusd.user.js
// ==/UserScript==
//0.13 = Adds Margin Balance
//Updated to show BTC and USD prices in more locations.
// USD profit/loss does not taken into account the change in value of your BTC.
// ex - if you do a 1x btc short for 10kusd worth of btc, and BTC goes from 11k to 15k, bitmex will say you lost .19btc. my script will say you lost -2.7k USD. but your actual USD net p&l is 0. )
(function() {
'use strict';
// Script vars
let indexPrice = 0;
let currentBalance = {total: 0, avail: 0, margin:0};
// Extract BitMex price
const updateIndexPrice = () => {
$('.instrument').each(function() {
let obj = this;
if($(obj).children('.symbol').length > 0 && $(obj).children('.symbol').html() == '.BXBT') {
indexPrice = $(obj).children('.price').html();
}
});
setTimeout(function() {
updateIndexPrice();
}, 1000);
};
// Extract Wallet Balance
const extractWalletBalance = (callback) => {
let balances = currentBalance;
$('#content > div > span > div.content.container > div > div > div.resizesensor-wrapper > div.react-grid-layout.gridLayout > div.react-grid-item.widget-container.marginDisplayWrapper.react-draggable.cssTransforms.react-resizable > section > div > div > div.rows > div:nth-child(3) > div > div > span').each(function() {
let balanceMargin = formatXBTString($(this).html());
if(balanceMargin !== false) balances.margin = balanceMargin;
});
$('a[href="/app/wallet"] > span > table > tbody > tr').each(function() {
let currentLabel = '';
let balanceTotal = formatXBTString($(this).html());
});
$('a[href="/app/wallet"] > span > table > tbody > tr').each(function() {
let currentLabel = '';
$(this).children('td').each(function() {
if($(this).html() == 'Total' || $(this).html() == 'Avail') {
currentLabel = $(this).html();
} else {
if(currentLabel == 'Total') {
let balanceTotal = formatXBTString($(this).html());
if(balanceTotal !== false) balances.total = balanceTotal;
} else if(currentLabel == 'Avail') {
let balanceAvail = formatXBTString($(this).html());
if(balanceAvail !== false) balances.avail = balanceAvail;
}
}
});
});
currentBalance = balances;
callback(balances);
};
// Set USD Wallet Balance
const setWalletBalance = (updatedBalances) => {
if(updatedBalances.total + ' USD | Margin:$' + updatedBalances.margin != $('.balance-usd-total').html()) $('.balance-usd-total').html(updatedBalances.total + ' USD | Margin:$' + updatedBalances.margin);
if(updatedBalances.avail + ' USD' != $('.balance-usd-avail').html()) $('.balance-usd-avail').html(updatedBalances.avail + ' USD');
};
// Convert XBT String
const formatXBTString = (string) => {
let parts = string.split(" ");
if(parts.length == 2) {
if(parts[1] == 'XBT') {
return parts[0].replace(",",".");
} else if(parts[1] == 'mXBT') {
return parts[0].replace(",",".")*0.001;
} else if(parts[1] == 'XBt') {
return parts[0].replace(".","")*0.00001;
} else if(parts[1] == 'μXBT') {
return parts[0].replace(".","").replace(",",".")*0.000001;
}
}
return false;
};
// Update Wallet Balances
const updateWalletBalances = () => {
setTimeout(function() {
if(indexPrice != 0) {
extractWalletBalance(function(balances) {
let updatedBalances = {total: (balances.total*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}), avail: (balances.avail*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}),margin: (balances.margin*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})};
setWalletBalance(updatedBalances);
});
}
updateWalletBalances();
}, 1000);
};
// Update PNLs
const updatePNLs = (setTimeoutCycle) => {
if(indexPrice != 0) {
// Unrealized PNL
$('td.unrealisedPnl').each(function() {
let obj = this;
let content;
let isSpan = false;
if($(this).children('div:first-child').children('span').length > 0) {
content = $(this).children('div:first-child').children('span:first-child').html();
isSpan = true;
} else {
content = $(this).children('div:first-child').html();
}
let parts = content.split(" ");
if(parts[1] == 'XBT' || parts[1] == 'mXBT' || parts[1] == 'XBt' || parts[1] == 'μXBT') {
let formatUnrealizedPNL = formatXBTString(parts[0] + ' ' + parts[1]);
let unrealizedPNLUSD = (formatUnrealizedPNL*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
let newDivContent;
if(!isSpan) {
newDivContent = unrealizedPNLUSD + ' USD | ' + ' BTC ' + formatUnrealizedPNL + ' ' + parts[2];
} else {
newDivContent = '<span style="background:rgba(86,188,118,0.25);" class="' + ( formatUnrealizedPNL*indexPrice < 0 ? 'neg' : 'pos' ) + ' tooltipWrapper hovered">' + unrealizedPNLUSD + ' USD | ' + ' BTC ' + formatUnrealizedPNL + ' ' + parts[2] + '</span>';
}
if(newDivContent != $(obj).children('div.unrealizedPnlUSD').html()) {
$(obj).children('div.unrealizedPnlUSD').html(newDivContent);
if(formatUnrealizedPNL*indexPrice < 0) {
if(!$(obj).children('div.unrealizedPnlUSD').hasClass('neg')) {
$(obj).children('div.unrealizedPnlUSD').addClass('neg').removeClass('pos');
}
} else {
if(!$(obj).children('div.unrealizedPnlUSD').hasClass('pos')) {
$(obj).children('div.unrealizedPnlUSD').addClass('pos').removeClass('neg');
}
}
}
}
});
// Realized PNL
$('td.combinedRealisedPnl').each(function() {
let obj = this;
let realizedPNLhover = formatXBTString($(obj).children('.hoverContainer:first-child').children('.hoverVisible').children('.tooltipWrapper').children('span').html());
let realizedPNL = formatXBTString($(obj).children('.hoverContainer:first-child').children('.hoverHidden').children('span').html());
let realizedPNLUSDhoverContent = (realizedPNLhover*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' USD | BTC ' + realizedPNLhover ;
let realizedPNLUSDContent = (realizedPNL*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' USD | BTC ' + realizedPNL;
if($(obj).children('.realizedPNLContainer').children('.hoverVisible').children('.tooltipWrapper').children('span').html() != realizedPNLUSDhoverContent) {
$(obj).children('.realizedPNLContainer').children('.hoverVisible').children('.tooltipWrapper').children('span').html(realizedPNLUSDhoverContent);
if(realizedPNLhover*indexPrice < 0) {
if(!$(obj).children('.realizedPNLContainer').children('.hoverVisible').children('.tooltipWrapper').children('span').hasClass('neg')) {
$(obj).children('.realizedPNLContainer').children('.hoverVisible').children('.tooltipWrapper').children('span').addClass('neg').removeClass('pos');
}
} else {
if(!$(obj).children('.realizedPNLContainer').children('.hoverVisible').children('.tooltipWrapper').children('span').hasClass('pos')) {
$(obj).children('.realizedPNLContainer').children('.hoverVisible').children('.tooltipWrapper').children('span').addClass('pos').removeClass('neg');
}
}
}
if($(obj).children('.realizedPNLContainer').children('.hoverHidden').children('span').html() != realizedPNLUSDContent) {
$(obj).children('.realizedPNLContainer').children('.hoverHidden').children('span').html(realizedPNLUSDContent);
if(realizedPNL*indexPrice < 0) {
if(!$(obj).children('.realizedPNLContainer').children('.hoverHidden').children('span').hasClass('neg')) {
$(obj).children('.realizedPNLContainer').children('.hoverHidden').children('span').addClass('neg').removeClass('pos');
}
} else {
if(!$(obj).children('.realizedPNLContainer').children('.hoverHidden').children('span').hasClass('pos')) {
$(obj).children('.realizedPNLContainer').children('.hoverHidden').children('span').addClass('pos').removeClass('neg');
}
}
}
});
}
if(setTimeoutCycle) {
setTimeout(function() {
updatePNLs(true);
}, 50);
}
};
// Initialize PNL wrapper
const initPNLWrapper = (setTimeoutCycle) => {
if($('td.unrealisedPnl').length > 0 && $('.unrealizedPnlUSD').length == 0) {
// Unrealized PNL
$('td.unrealisedPnl').css('position', 'relative');
$('td.unrealisedPnl > div').css('opacity', '0').css('position','absolute').css('left','0').css('top','0').css('right','0').css('bottom','0');
$('td.unrealisedPnl > div').after('<div class="unrealizedPnl unrealizedPnlUSD">0.00 USD (0.00%)</div>');
// Realized PNL
$('td.combinedRealisedPnl > .hoverContainer').hide();
$('td.combinedRealisedPnl > .hoverContainer').after('<span class="hoverContainer realizedPNLContainer"><span class="hoverVisible"><span class="tooltipWrapper"><span>0.00 USD</span></span></span><span class="hoverHidden"><span>0.00 USD</span></span></span>');
}
if(setTimeoutCycle) {
setTimeout(function() {
initPNLWrapper(true);
}, 100);
}
};
// Wait for window to load
$(window).load(function() {
// Hide BTC balance box
$('._1mNCXSUh:first').hide();
$('._2UCMYPbC > ._2wx45MYS:first').hide();
// Init PNL Wrapper
initPNLWrapper(true);
$(window).resize(function() {
initPNLWrapper(false);
});
// Insert USD Balance div
$('.announcementsDropdown').before('<a class="_1mNCXSUh usdBalance noHover" href="/app/wallet"><span class="noBorder tooltipWrapper"><table class="visible-lg visible-md"><tbody><tr><td class="_39qDSUxb">Total</td><td class="balance-usd-total">0.00 USD</td></tr><tr><td class="_39qDSUxb">Avail</td><td class="balance-usd-avail">0.00 USD</td></tr></tbody></table></span></a><span class="_2wx45MYS visible-lg visible-md"></span>');
console.log('Updating....');
updateIndexPrice();
updateWalletBalances();
updatePNLs(true);
$('td.unrealisedPnl > div').hover(function() {
updatePNLs(false);
});
// Update Functions
setInterval(() => {
console.log('Updating....');
updateIndexPrice();
updateWalletBalances();
updatePNLs(true);
$('td.unrealisedPnl > div').hover(function() {
updatePNLs(false);
});
}, 45000);
});
})();
@sojusnik
Copy link

Thanks for your work!

Would be nice, if the format of the margin balance could be consistent though:

grafik

TOTAL: 619.21 USD | Margin: 587.95 USD
AVAIL: 11.09 USD

Or ideally just put the USD amount after |, like already in the PNL:

grafik

TOTAL: 0,0614 XBT | 619.21 USD
AVAIL: 0,0011 XBT | 11.09 USD

In this case "Margin" could be omitted, for the sake of consistency.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment