Skip to content

Instantly share code, notes, and snippets.

@einSelbst
Forked from AJolly/bitmexusd.user.js
Created September 12, 2019 01:51
Show Gist options
  • Save einSelbst/7add97e0cebc5bfa449f4ebaaa7a22fe to your computer and use it in GitHub Desktop.
Save einSelbst/7add97e0cebc5bfa449f4ebaaa7a22fe 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);
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment