Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
BitMex USD Converter - For TemperMonkey
// ==UserScript==
// @name BitMex USD Converter
// @namespace https://bitmex.com/
// @version 0.11
// @description Get some sanity into your gambling.
// @author koinkraft
// @grant none
// @include https://bitmex.com/*
// @include https://www.bitmex.com/*
// @require https://code.jquery.com/jquery-2.1.4.min.js
// ==/UserScript==
(function() {
'use strict';
// Script vars
let indexPrice = 0;
let currentBalance = {total: 0, avail: 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;
$('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' != $('.balance-usd-total').html()) $('.balance-usd-total').html(updatedBalances.total + ' USD');
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})};
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 ' + parts[2];
} else {
newDivContent = '<span style="background:rgba(86,188,118,0.25);" class="' + ( formatUnrealizedPNL*indexPrice < 0 ? 'neg' : 'pos' ) + ' tooltipWrapper hovered">' + unrealizedPNLUSD + ' USD ' + 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';
let realizedPNLUSDContent = (realizedPNL*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' USD';
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>');
// Update Functions
setInterval(() => {
console.log('Updating....');
updateIndexPrice();
updateWalletBalances();
updatePNLs(true);
$('td.unrealisedPnl > div').hover(function() {
updatePNLs(false);
});
}, 30000);
});
})();
@sowhynot

This comment has been minimized.

Copy link

commented Apr 1, 2019

would it be possible for the plugin to add the USD PNL column next to the BTC ones rather than replacing it ?
Having both would be awesome

@BitcoinMolester

This comment has been minimized.

Copy link

commented Apr 7, 2019

@sowhynot this will show both USD and Bitcoin value formatted as

10.00 USD | BTC 0.0001 (10.00%)

// ==UserScript==
// @name         BitMex USD Converter
// @namespace    https://bitmex.com/
// @version      0.11
// @description  Get some sanity into your gambling.
// @author       koinkraft
// @grant        none
// @include      https://bitmex.com/*
// @include      https://www.bitmex.com/*
// @require      https://code.jquery.com/jquery-2.1.4.min.js
// ==/UserScript==

(function() {
    'use strict';

    // Script vars
    let indexPrice = 0;
    let currentBalance = {total: 0, avail: 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;
        $('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' != $('.balance-usd-total').html()) $('.balance-usd-total').html(updatedBalances.total + ' USD');
        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})};
                    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';
                let realizedPNLUSDContent = (realizedPNL*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' USD';
                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>');

        // Update Functions
        setInterval(() => {
            console.log('Updating....');
            updateIndexPrice();
            updateWalletBalances();
            updatePNLs(true);
            $('td.unrealisedPnl > div').hover(function() {
                updatePNLs(false);
            });
        }, 30000);
    });

})();
@cryptrader

This comment has been minimized.

Copy link

commented Apr 9, 2019

When I copy and past this code into Tampermonkey. I get a ('$' is not defined) on every line there is '$'.

Guys, I know next to nothing about programming. What do you think the issue is? Thanks!

@JayWiseFree

This comment has been minimized.

Copy link

commented Apr 20, 2019

Hey fantastic script mate! I have one major request: can you please also add this to convert 'Order Value' and 'Cost' for orders in USD as well? Cheers mate! Great work. :)

@Sapiensinfomatics

This comment has been minimized.

Copy link

commented May 14, 2019

Hey, is there any information how I can set this up please? I have zero knowledge of coding.

@ILoveMexKetchup

This comment has been minimized.

Copy link

commented May 15, 2019

Install Tampermonkey (available for Chrome, Microsoft Edge, Safari, Opera Next, and Firefox)

  1. go to https://www.tampermonkey.net
  2. click the download button, this will redirect you to the according addon page for your browser
  3. click the "add to your browsers name" button
  4. you will now see a new red icon in your browser.

Install the userscript

  1. click on the new red Tampermonkey icon, then click "Create a new script"
  2. replace the script template that opens with the bitmex usd script
  3. click on file, save
  4. refresh the bitmex.com page, wait 30 seconds to let the display updating, voila

you can always enable or disable any installed script by clicking on the red tampermonkey icon and then clicking the switch in the row of the according script.

@unclescroogeJR

This comment has been minimized.

Copy link

commented May 17, 2019

This second script works on FIREFOX? String error on lines 112 114 on second script and with first to much lag.. What i need to do?

@cmer

This comment has been minimized.

Copy link

commented May 29, 2019

Is this script still working? It doesn't seem to do anything for me (macOS, Safari).

@fr4z3n

This comment has been minimized.

Copy link

commented Jun 17, 2019

thank you for this neat script. was searching for it a long time :)

@nateflanders

This comment has been minimized.

Copy link

commented Jun 25, 2019

It was working fine for weeks for me... now all the sudden displays no conversion data, can't seem to reset it back to working... any suggestions?

@Valev008

This comment has been minimized.

Copy link

commented Jun 25, 2019

I just tested this script on testnet.bitmex.com (you have to edit the script to include this site). When I entered the trade it didn't work, but now after 1 minute or so it works. Try hard refreshing the page and wait a minute or two.

@cataseven

This comment has been minimized.

Copy link

commented Jul 2, 2019

When I copy and past this code into Tampermonkey. I get a ('$' is not defined) on every line there is '$'.

Guys, I know next to nothing about programming. What do you think the issue is? Thanks!

Add the bold one to line 19
....
// Script vars
let currentBalance = {total: 0, avail: 0};
let indexPrice = 0;
var $ = window.jQuery;
...

@cmer

This comment has been minimized.

Copy link

commented Jul 2, 2019

Make sure jquery is present

@theodoroswhite

This comment has been minimized.

Copy link

commented Jul 2, 2019

Lines 112 and 114 both say "Unexpected String Concatenation of Literals"?

Both around ' + ' part of each line

@cataseven

This comment has been minimized.

Copy link

commented Jul 2, 2019

Lines 112 and 114 both say "Unexpected String Concatenation of Literals"?

Both around ' + ' part of each line

I have same errors but it is working.

Did you refresh Bitmex page after saving your code?
Did you wait for 45 seconds after refresh?

@theodoroswhite

This comment has been minimized.

Copy link

commented Jul 2, 2019

Ya I have. Still nothing. Are you using BitcoinMolester's code?

@cataseven

This comment has been minimized.

Copy link

commented Jul 2, 2019

// ==UserScript==
// @name BitMex USD Converter
// @namespace https://bitmex.com/
// @Version 0.11
// @description Get some sanity into your gambling.
// @author koinkraft
// @grant none
// @include https://bitmex.com/*
// @include https://www.bitmex.com/*
// @require https://code.jquery.com/jquery-2.1.4.min.js
// ==/UserScript==

(function() {
'use strict';

// Script vars
let indexPrice = 0;
let currentBalance = {total: 0, avail: 0};
var $ = window.jQuery;

// 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;
    $('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' != $('.balance-usd-total').html()) $('.balance-usd-total').html(updatedBalances.total + ' USD');
    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})};
                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';
            let realizedPNLUSDContent = (realizedPNL*indexPrice).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' USD';
            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>');

    // Update Functions
    setInterval(() => {
        console.log('Updating....');
        updateIndexPrice();
        updateWalletBalances();
        updatePNLs(true);
        $('td.unrealisedPnl > div').hover(function() {
            updatePNLs(false);
        });
    }, 30000);
});

})();

@cmer

This comment has been minimized.

Copy link

commented Jul 5, 2019

@pauloec

This comment has been minimized.

Copy link

commented Jul 8, 2019

Yeah it's not working on Safari. I guess some issue with parsing the HTML, i have no time to check though :D

@grant

This comment has been minimized.

Copy link

commented Jul 8, 2019

Hi there. Please don't @grant unless I can contribute to the conversation. :)

@bafferbox

This comment has been minimized.

Copy link

commented Jul 9, 2019

how to set realised pnl in both usd | btc ?

@cryptochuso

This comment has been minimized.

Copy link

commented Jul 18, 2019

Good job!

Would it be possible to add all these fields with the two values, usd and xbt?

That would be great!

image

@nateflanders

This comment has been minimized.

Copy link

commented Jul 19, 2019

This still isn't working for me. Using latest code, not getting any errors in the code, but never updates price on bitmex. I'm on chrome, have tried it all.

It used to work fine, now the UPNL field shows 0.00 USD (0.00%) no matter what, when the script is enabled, of course.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.