<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&nbsp;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&nbsp;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">&nbsp;&nbsp;<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>