<pss_extension min_pss_version="7.3" name="Position Sizing Calculator" version="1.0.2">The Position Sizing Calculator helps you figure out how money to put into a single trade, and what your potential profit and loss would be.
<author email="support@dtlink.com" name="DTLink Software" url="http://www.dtlink.com">
<![CDATA[
' Position Sizing Calculator extension for Personal Stock Streamer
' Copyright © 2006 by DTLink Software, All rights reserved.
' http://www.dtlink.com
' written by Anatoly Ivasyuk
]]>
</author>
<help>
<![CDATA[
<p>The Position Sizing Calculator adds a menu item under the Tools<br>
menu. You can use this command to display the calculator window.
]]>
</help>
<resource name="positionsizing_form1">
<![CDATA[
<body bgcolor=white>
<form name=form1 method=post target="x">
<table width="100%" cellspacing=0 cellpadding=2 border=0>
<tr><td width=20 align=middle>Entry Price:</td><td width=10><input type=text size=10 name=price value="{price}"></td><td width=20px></td><td width=20 align=middle>Account Size:</td><td width=10><input type=text size=10 name=accountsize value="{account_size}"></td></tr>
<tr><td align=middle>Target:</td><td><input type=text size=10 name=target value="{target}"></td><td width=20px></td><td align=middle>% Risk:</td><td><input type=text size=10 name=pctrisk value="{pct_risk}"></td></tr>
<tr><td align=middle>Stop:</td><td><input type=text size=10 name=stop value="{stop_price}"></td><td width=20px></td><td align=middle>$ Risk:</td><td><input type=text size=10 name=dollarrisk value="{dollar_risk}"></td></tr>
</table>
<p align=center><input type=submit value="Calculate"> <input type=submit value="Close">
</form>
<hr>
<table width="100%" cellspacing=0 cellpadding=2 border=0>
<tr><td><b>Position size (# of shares):</b></td><td align="right"><b>{position_size}</b></td></tr>
<tr><td><b>Total cost:</b></td><td align="right"><b>{total_cost}</b></td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Potential gain per share:</td><td align="right">{gainpershare}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Potential loss per share:</td><td align="right">{losspershare}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Reward/risk ratio:</td><td align="right">{risk_reward}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Percent risk of account:</td><td align="right">{pct_risk}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Dollar risk of account:</td><td align="right">{dollar_risk}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Potential gain for this trade:</td><td align="right">{gainpertrade}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Potential percent gain for trade:</td><td align="right">{pctgainpertrade}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Potential percent loss for trade:</td><td align="right">{pctlosspertrade}</td></tr>
<tr><td colspan=2><hr></td></tr>
<tr><td>Potential percent gain for account:</td><td align="right">{gainperaccount}</td></tr>
</table>
</body>
]]>
</resource>
<script language="VBScript">
<![CDATA[
' ================================================
' Position Sizing Calculator extension for Personal Stock Streamer
' Copyright © 2006 by DTLink Software, All rights reserved.
' http://www.dtlink.com
' written by Anatoly Ivasyuk
' ================================================
class PositionSizeHandler
' menu event handler
public Function OnMenuItemSelected ( id )
'Application.DebugTrace "PositionSizeHandler::OnMenuItemSelected(" + CStr(id) + ")"
' make sure this is our menu item
If (id = menuIdCalculator) Then
'Application.DebugTrace "PositionSizeHandler::OnMenuItemSelected() selected menuIdCalculator"
Set selectedTickers = Application.ActiveDocument.Selection.Tickers
price_default = ""
account_default = ""
pct_risk_default = "1"
' we can only work with one ticker at a time
If (selectedTickers.Count = 1) Then
Set ticker = selectedTickers.Item(0)
price_default = FormatNumber(ticker.GetProperty("Price"), 2)
' if there is an account total in this folder get it
Set total = ticker.ParentFolder.FolderTotal
' Application.DebugTrace "PositionSizeHandler::OnMenuItemSelected() total is " + TypeName(total)
If (Not total Is Nothing) Then
account_default = FormatNumber(total.GetProperty("Total Value"), 2)
End If
End If
' create the window
Set wndManager = Application.GetObject("WindowManager")
Set wndBrowser = wndManager.CreateBrowserWindow(400, 400, me)
' create the HTML form for the dialog
form_text = Script.GetResource("positionsizing_form1")
UpdateForm False
wndBrowser.SetHTML(window_text)
wndBrowser.Title = "Position Sizing Calculator"
' set return value to indicate that menu selection was processed
OnMenuItemSelected = True
End If
end Function
' form submission handler
public Function OnFormSubmitted ( form )
'Application.DebugTrace "PositionSizeHandler::OnFormSubmitted() pct=" + form.Value("pct") + " act=" + form.Value("act")
If (form.Value("submit") = "Calculate") Then
On Error Resume Next
' read the form fields and recalculate
price = CDbl(form.Value("price"))
target = CDbl(form.Value("target"))
stop_price = CDbl(form.Value("stop"))
account_size = CDbl(form.Value("accountsize"))
If Len(form.Value("accountsize")) = 0 Then
pct_risk = 0
Else
pct_risk = CDbl(form.Value("pctrisk"))
End If
dollar_risk = CDbl(form.Value("dollarrisk"))
On Error Goto 0
UpdateForm True
wndBrowser.SetHTML(window_text)
End If
' release the form window
If (form.Value("submit") = "Close") Then
Set wndBrowser = Nothing
End If
OnFormSubmitted = true
end Function
' form update handler
public Function UpdateForm ( recalc )
window_text = form_text
If Recalc Then
On Error Resume Next
' recalculate the form values
gainpershare = target - price
losspershare = price - stop_price
If (pct_risk > 0) Then
dollar_risk = account_size * pct_risk / 100
End If
position_size = Round(dollar_risk / losspershare)
gainpertrade = gainpershare * position_size
total_cost = position_size * price
' fill in the form text
window_text = Replace(window_text, "{price}", FormatNumber(price, 2))
window_text = Replace(window_text, "{target}", FormatNumber(target, 2))
window_text = Replace(window_text, "{stop_price}", FormatNumber(stop_price, 2))
window_text = Replace(window_text, "{account_size}", FormatNumber(account_size, 2))
window_text = Replace(window_text, "{pct_risk}", FormatNumber(pct_risk, 2))
window_text = Replace(window_text, "{dollar_risk}", FormatNumber(dollar_risk, 2))
window_text = Replace(window_text, "{gainpershare}", FormatNumber(gainpershare, 2))
window_text = Replace(window_text, "{losspershare}", FormatNumber(losspershare, 2))
window_text = Replace(window_text, "{pct_risk}", FormatNumber(pct_risk, 2))
window_text = Replace(window_text, "{dollar_risk}", FormatNumber(dollar_risk, 2))
window_text = Replace(window_text, "{risk_reward}", FormatNumber(gainpershare/losspershare, 2))
window_text = Replace(window_text, "{position_size}", FormatNumber(position_size, 0))
window_text = Replace(window_text, "{total_cost}", FormatNumber(total_cost, 2))
window_text = Replace(window_text, "{gainpertrade}", FormatNumber(gainpertrade, 2))
window_text = Replace(window_text, "{pctgainpertrade}", FormatNumber(gainpershare * 100 / price, 2))
window_text = Replace(window_text, "{pctlosspertrade}", FormatNumber(losspershare * 100 / price, 2))
window_text = Replace(window_text, "{gainperaccount}", FormatNumber(gainpertrade * 100 / account_size, 2))
On Error Goto 0
Else
window_text = Replace(window_text, "{price}", price_default)
window_text = Replace(window_text, "{target}", "")
window_text = Replace(window_text, "{stop_price}", "")
window_text = Replace(window_text, "{account_size}", account_default)
window_text = Replace(window_text, "{pct_risk}", pct_risk_default)
window_text = Replace(window_text, "{dollar_risk}", "")
window_text = Replace(window_text, "{gainpershare}", "")
window_text = Replace(window_text, "{losspershare}", "")
window_text = Replace(window_text, "{pct_risk}", pct_risk_default)
window_text = Replace(window_text, "{dollar_risk}", "")
window_text = Replace(window_text, "{risk_reward}", "")
window_text = Replace(window_text, "{position_size}", "")
window_text = Replace(window_text, "{total_cost}", "")
window_text = Replace(window_text, "{gainpertrade}", "")
window_text = Replace(window_text, "{pctgainpertrade}", "")
window_text = Replace(window_text, "{pctlosspertrade}", "")
window_text = Replace(window_text, "{gainperaccount}", "")
End If
end Function
' our menu items
Dim menuIdCalculator
Dim wndBrowser
' temporary storage
Dim price
Dim target
Dim stop_price
Dim account_size
Dim pct_risk
Dim dollar_risk
Dim form_text
Dim window_text
Dim price_default
Dim account_default
Dim pct_risk_default
end Class
' ================================================
' initialization
Set EventManager = Application.GetObject("EventManager")
Set MenuManager = Application.GetObject("MenuManager")
Set Handler = new PositionSizeHandler
' create the custom menu commands
If Not MenuManager Is Nothing Then
Set MainMenu = MenuManager.MainMenu
nToolMenu = MainMenu.Find("Tools")
' create the Tools top-level menu if it doesn't exist
If (nToolMenu = -1) Then
nHelpMenu = MainMenu.Find("Help")
Set ToolMenu = MainMenu.InsertMenu(nHelpMenu, "Tools")
Else
Set ToolMenu = MainMenu.GetSubMenu(nToolMenu)
End If
' actually create the menu commands and save the ids for later
If Not ToolMenu Is Nothing Then
ToolMenu.InsertSeparator ToolMenu.ItemCount
Handler.menuIdCalculator = ToolMenu.InsertItem(ToolMenu.ItemCount, "Position Sizing Calculator")
End If
End If
' register our event handlers
If Not EventManager Is Nothing Then
EventManager.RegisterHandlerMethod Handler, "OnMenuItemSelected"
Else
'Application.DebugTrace "Could not get EventManager object"
End If
]]>
</script>
</pss_extension>