Fixed Ratio Calculator (Beta Version)
var names = new Array('ticker', 'price', 'dd', 'shares', 'part', 'lots');
var is_init = 0;
function set_cookie(name, value){ expires = new Date(); expires.setTime(expires.getTime() + (1000 * 86400 * 365)); document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() + "; path=/"; } function get_cookie(name){ cookie_name = name + "="; cookie_length = document.cookie.length; cookie_begin = 0; while (cookie_begin < cookie_length){ value_begin = cookie_begin + cookie_name.length; if (document.cookie.substring(cookie_begin, value_begin) == cookie_name){ var value_end = document.cookie.indexOf (";", value_begin); if (value_end == -1) value_end = cookie_length; return unescape(document.cookie.substring(value_begin, value_end)); } cookie_begin = document.cookie.indexOf(" ", cookie_begin) + 1; if (cookie_begin == 0) break; } return null; } function delete_cookie(name) { if(get_cookie(name)) { expires = new Date(); expires.setTime(expires.getTime() - (10 * 86400 * 365)); document.cookie = name + "=; expires=" + expires.toGMTString() + "; path=/"; } }
function read(){ var b = parseFloat(get_cookie('base_money')); if (isNaN(b) || (b <= 0)) { reset(); is_init = 0; }else { document.getElementById('init_money').value = parseInt(get_cookie('init_money')); document.getElementById('leverage').value = Math.floor(100*parseFloat(get_cookie('leverage')))/100; document.getElementById('pdd').value = Math.floor(100*parseFloat(get_cookie('pdd')))/100; document.getElementById('base_money').value = parseInt(get_cookie('base_money')); document.getElementById('max_leverage').value = Math.floor(1000*parseFloat(get_cookie('max_leverage')))/1000; document.getElementById('money').value = ''; document.getElementById('current_leverage').value = ''; document.getElementById('money_limit').value = '';
is_init = 1; document.b.init.value = 'reset';
var rows = get_cookie('rows');
for(var j = 1; j < rows; j++) addNewRow();
for(var j = 0; j < rows; j++) { document.getElementById('ticker_' + j).value = get_cookie('ticker_'+j); document.getElementById('price_' + j).value = parseFloat(get_cookie('price_'+j)); document.getElementById('dd_' + j).value = parseFloat(get_cookie('dd_'+j)); document.getElementById('shares_' + j).value = parseFloat(get_cookie('shares_'+j)); document.getElementById('part_' + j).value = parseFloat(get_cookie('part_'+j)); document.getElementById('lots_' + j).value = 0; } } }
function reset(){ var theTable = document.getElementById('portfolio'); var rowsCount = theTable.tBodies[0].rows.length; for(var j = rowsCount - 1; j > 0 ; j--) { if (theTable.tBodies[0].rows[j]) theTable.tBodies[0].removeChild(theTable.tBodies[0].rows[j]); } delete_cookie('init_money'); delete_cookie('leverage'); delete_cookie('pdd'); delete_cookie('base_money'); delete_cookie('max_leverage'); document.getElementById('init_money').value = ''; document.getElementById('leverage').value = ''; document.getElementById('pdd').value = ''; document.getElementById('base_money').value = ''; document.getElementById('max_leverage').value = ''; document.getElementById('money').value = ''; document.getElementById('money_limit').value = ''; document.getElementById('current_leverage').value = ''; var b = document.getElementById('pdd').value; var rows = get_cookie('rows'); document.getElementById('ticker_0').value = ''; document.getElementById('price_0').value = ''; document.getElementById('dd_0').value = ''; document.getElementById('shares_0').value = ''; document.getElementById('part_0').value = ''; document.getElementById('lots_0').value = ''; for(var j = 0; j < rows; j++) { delete_cookie('ticker_'+j); delete_cookie('price_'+j); delete_cookie('dd_'+j); delete_cookie('shares_'+j); delete_cookie('part_'+j); } delete_cookie('rows'); }
function addRow() { if (confirm("Do you add new line?")) { addNewRow(); document.getElementById('base_money').value = ''; document.getElementById('max_leverage').value = ''; document.getElementById('money').value = ''; document.getElementById('money_limit').value = ''; document.getElementById('current_leverage').value = '';
document.b.init.value = 'initialize'; is_init = 0; } }
function addNewRow() { var theTable = document.getElementById('portfolio'); var rowsCount = theTable.tBodies[0].rows.length; theTable.tBodies[0].appendChild( theTable.tBodies[0].rows[rowsCount - 1].cloneNode(true) ) var inputs = theTable.tBodies[0].rows[rowsCount].getElementsByTagName('INPUT'); for (var j = 0; j < inputs.length; j++){ inputs[j].id = inputs[j].name = names[j] + '_' + rowsCount; inputs[j].value = ''; } }
function init() { var theTable = document.getElementById('portfolio'); var all_loss_percent = 0; var all_base_money=0; var all_part = 0; var leverage; var pdd; var init_money; var cur_lev; if (is_init == 0) { init_money = parseFloat(document.getElementById('init_money').value); leverage = parseFloat(document.getElementById('leverage').value); pdd = parseFloat(document.getElementById('pdd').value); if (isNaN(init_money) || (init_money <= 0)) { alert('Invalid "init money" in portfolio'); return; } if (isNaN(leverage) || (leverage <= 0) || (leverage > 100)) { alert('Invalid leverage in portfolio'); return; } if (isNaN(pdd) || (pdd <= 0) || (pdd > 100)) { alert('Invalid DD in portfolio'); return; }
for(j = 0; j < theTable.tBodies[0].rows.length; j++) { var ticker = document.getElementById('ticker_' + j).value; var price = parseFloat(document.getElementById('price_' + j).value); var dd = parseFloat(document.getElementById('dd_' + j).value); var shares = parseInt(document.getElementById('shares_' + j).value); var part = parseFloat(document.getElementById('part_' + j).value); if (ticker.length < 1){ alert('Tiker name in string ' + (j+1) + ' is empty'); return; } if (isNaN(price) || (price <= 0)) { alert('Invalid price at ticker ' + ticker); return; } if (isNaN(dd) || (dd <= 0)) { alert('Invalid drowdown at ticker ' + ticker); return; } if (isNaN(shares) || (shares <= 0)) { alert('Invalid shares at ticker ' + ticker); return; } if (isNaN(part) || (part <= 0)) { alert('Invalid part at ticker ' + ticker); return; } all_loss_percent += part*(dd/price); all_part += part; } if (all_part != 100){ alert('All part summary must be equal 100%'); return; } cur_lev = Math.min(pdd*Math.sqrt(theTable.tBodies[0].rows.length/20)/all_loss_percent, leverage);
for(j = 0; j < theTable.tBodies[0].rows.length; j++) { var price = parseFloat(document.getElementById('price_' + j).value); var dd = parseFloat(document.getElementById('dd_' + j).value); var shares = parseInt(document.getElementById('shares_' + j).value); var part = parseFloat(document.getElementById('part_' + j).value);
all_base_money += (price/dd + 1)*price*shares/(2*cur_lev)*(1+Math.sqrt(200*dd/(price*pdd)))/2; } if (init_money < all_base_money){ alert('Increase "init money" to ' + all_base_money); return; }
document.getElementById('base_money').value = Math.floor(100*all_base_money)/100; document.getElementById('max_leverage').value = Math.floor(1000*cur_lev)/1000;
set_cookie('init_money', init_money); set_cookie('leverage', leverage); set_cookie('pdd', pdd); set_cookie('base_money', all_base_money); set_cookie('max_leverage', cur_lev);
set_cookie('rows', theTable.tBodies[0].rows.length); for(j = 0; j < theTable.tBodies[0].rows.length; j++) { var ticker = document.getElementById('ticker_' + j).value; var price = parseFloat(document.getElementById('price_' + j).value); var dd = parseFloat(document.getElementById('dd_' + j).value); var shares = parseInt(document.getElementById('shares_' + j).value); var part = parseFloat(document.getElementById('part_' + j).value); set_cookie('ticker_'+j, ticker); set_cookie('price_'+j, price); set_cookie('dd_'+j, dd); set_cookie('shares_'+j, shares); set_cookie('part_'+j, part); }
document.b.init.value = 'reset'; is_init = 1; } else { if (confirm("Do you have create new portfolio?")) { reset(); document.b.init.value = 'initlize'; is_init = 0; } } }
function calc() { var theTable = document.getElementById('portfolio'); var all_loss_percent = 0; var all_base_money; var all_part = 0; var frac; var money; var calc_money; var leverage; var pdd; var init_money; var cur_lev; var leverage;
money = parseFloat(document.getElementById('money').value); init_money = parseFloat(document.getElementById('init_money').value); all_base_money = parseFloat(document.getElementById('base_money').value); leverage = parseFloat(document.getElementById('leverage').value); cur_lev = parseFloat(document.getElementById('max_leverage').value); pdd = parseFloat(document.getElementById('pdd').value);
if (isNaN(all_base_money) || (all_base_money <= 0)) { alert('Portfolio not initialized'); return; } if (isNaN(money) || (money <= 0)) { alert('Invalid value of money'); return; } frac = (1-pdd/100)*init_money/all_base_money; clac_money = money/frac - all_base_money;
document.getElementById('money_limit').value = 0; for(var j = 0; j < theTable.tBodies[0].rows.length; j++) { var ticker = document.getElementById('ticker_' + j).value; var price = parseFloat(document.getElementById('price_' + j).value); var shares = parseInt(document.getElementById('shares_' + j).value); var dd = parseFloat(document.getElementById('dd_' + j).value); var part = parseFloat(document.getElementById('part_' + j).value); var base_money = (price/dd + 1)*price*shares/(2*cur_lev)*(1+Math.sqrt(200*dd/(price*pdd)))/2; var constant = base_money/all_base_money; ajax( 'lots_' + j, ticker, frac, constant, part, clac_money, dd, shares, money, leverage, price, cur_lev); } }
function set_all(lots) { all_position += lots*shares*price; document.getElementById('money_limit').value = all_position; }
function ajax(id, ticker, sfrac, sconstant, spart, sclac_money, sdd, sshares, smoney, sleverage, sprice, scur_lev) { var req = new Subsys_JsHttpRequest_Js(); req.onreadystatechange = function() { if (req.readyState == 4) { if (req.responseJS) { document.getElementById(id).value = req.responseJS.lots; document.getElementById('money_limit').value = Math.floor(100*(parseFloat(document.getElementById('money_limit').value) + parseFloat(req.responseJS.lots)*sshares*sprice))/100; document.getElementById('current_leverage').value = Math.floor(100*parseFloat(document.getElementById('money_limit').value)/smoney)/100; } } } req.caching = true;
req.open('POST', 'http://www.pitbear.com/ajax/load.php', true);
req.send({ q: ticker, frac: sfrac, constant: sconstant, part: spart, clac_money: clac_money, dd: sdd, shares: sshares, money: smoney, leverage: sleverage, price: sprice, cur_lev: scur_lev});
}
function p_addRow(){ addRow(); } function p_init(){ init(); } function p_calc(){ calc(); }
| ticker | price | dd | shares | part | lots |
|---|---|---|---|---|---|
- init asset – the starting capital.
- leverage – the leverage of your broker.
- DD - admissible drawdown a portfolio, in percentage.
- asset – the current capital.
- base – the settlement value necessary for formation of the minimal portfolio.
- max leverage – the maximal limit of a leverage without DD%.
- limit – a limit on the open positions.
- current leverage – current used buy power.
- ticker - the ticker's name.
- price – the current price, in point.
- dd - the drawdown, in point.
- shares - quantity of papers on one contract or not devisible value.
- part – a share, in percentage, papers in a portfolio.
- lots – quantity of contracts.
Functionality:
- add line – adds a new line.
- init – initializes algorithm, in conformity with structure of a portfolio and a seed capital.
- reset – nulls all values.
- calculate – on the basis of the current capital calculates quantity of contracts.
Better use with FireFox.
Thanks to zukk.info.
Портфельный метод управления рисками Fixed Ratio - Описание
Portfolio method of risks management Fixed Ratio - Description