Good money management is one of the fundamental pillars of successful trading. With this indicator, we propose a simple way to manage trading positions. This tool shows Profit & Loss (P&L), suggests position size given a certain risk, sets stop losses and take profit levels using fixed price value/percentage/ATR/Range, and can also determine entries from crosses with technical indicators which is particularly handy if you don't want to set an entry manually.
1. Settings
Position Type: Determines if the position should be a "Long" or "Short".
Account Size: Determines the total capital of the trading account.
Risk: The maximum risk amount for a trade. Can be set as a percentage of the account size or as a fixed amount.
Entry Price: Determines the entry price of the position.
Entry From Cross: When enabled, allows to set the entry price where a cross with an external source was produced.
1.1 Stop Loss/Take Profit
Take Profit: Determines the take profit level, which can be determined by a value or percentage.
Stop Loss: Determines the stop loss level, which can be determined by a value or percentage.
2. Usage
One of the main usages of position management tools is to determine the position size to allocate given a specific risk amount and stop-loss. 2% of your capital is often recommended as a risk amount.
Our tool allows setting stop losses and take profits with different methods.
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © LuxAlgo
//@version=4
study("Risk Management Tool [LUX]",overlay=true)
pos_type = input('Long','Position Type',options=['Long','Short'])
acc_size = input(1000.,'Account Size',minval=0)
risk = input(2.,'Risk ',minval=0,inline='risk')
risk_type = input('%','',options=['%','USD'],inline='risk')
entry_price = input(40000.,'Entry Price',confirm=true)
entry_cross = input(false,'Entry From Cross',inline='entry')
cross_src = input(open,"",inline='entry')
//----
tp = input(5.,'Take Profit',minval=0
,group='Take Profit/Stop Loss',inline='tp',confirm=true)
tp_type = input('%','',options=['ATR','%','Price','Range']
,group='Take Profit/Stop Loss',inline='tp',confirm=true)
//----
sl = input(5.,'Stop Loss ',minval=0
,group='Take Profit/Stop Loss',inline='sl',confirm=true)
sl_type = input('%','',options=['ATR','%','Price','Range']
,group='Take Profit/Stop Loss',inline='sl',confirm=true)
//----
profit_col = input(color.new(#009688,80),'Profit Color'
,group='Style',inline='col')
loss_col = input(color.new(#f44336,80),'Loss Color'
,group='Style',inline='col')
//------------------------------------------------------------------------------
tp_val = 0.
sl_val = 0.
entry = 0.
pos = pos_type == 'Long' ? 1 : -1
if entry_cross
entry := valuewhen(cross(close,cross_src)[1],open,0)
else
entry := entry_price
tp_range = highest(max(round(tp),1)) - lowest(max(round(tp),1))
sl_range = highest(max(round(sl),1)) - lowest(max(round(sl),1))
if tp_type == 'ATR'
tp_val := entry + atr(max(round(tp),1))*pos
else if tp_type == '%'
tp_val := entry + tp/100*entry*pos
else if tp_type == 'Price'
tp_val := tp
else if tp_type == 'Range'
tp_val := entry + (tp_range)*pos
if sl_type == 'ATR'
sl_val := entry - atr(max(round(sl),1))*pos
else if sl_type == '%'
sl_val := entry - sl/100*entry*pos
else if sl_type == 'Price'
sl_val := sl
else if sl_type == 'Range'
sl_val := entry - (sl_range)*pos
//------------------------------------------------------------------------------
open_pl = (close - entry)*pos
position_size = 0.
RR = abs((tp_val-entry)/(sl_val-entry))
if risk_type == '%'
position_size := risk/100*acc_size/((entry-sl_val)*pos)
else
position_size := risk/((entry-sl_val)*pos)
//------------------------------------------------------------------------------
n = bar_index
var tbl = table.new(position.bottom_right,2,3)
if barstate.islast
box.delete(box.new(n,tp_val,n+100,entry,bgcolor=profit_col,border_width=0)[1])
box.delete(box.new(n,entry,n+100,sl_val,bgcolor=loss_col,border_width=0)[1])
label.delete(label.new(n+100,entry
,str.format('P&L : {0} {1} ({2,number,percent})',open_pl,syminfo.currency,open_pl/entry)
,color=open_pl>0?profit_col:loss_col
,style=label.style_label_left,textcolor=color.gray,textalign=text.align_left)[1])
if tp
label.delete(label.new(n+100,tp_val
,str.format('TP : {0} ({1,number,percent})',tp_val,(tp_val-entry)/entry)
,color=profit_col
,style=label.style_label_left,textcolor=color.gray,textalign=text.align_left)[1])
if sl
label.delete(label.new(n+100,sl_val
,str.format('TSL : {0} ({1,number,percent})',sl_val,(entry-sl_val)/entry)
,color=loss_col
,style=label.style_label_left,textcolor=color.gray,textalign=text.align_left)[1])
table.cell(tbl,0,0,'Risk/Reward',text_color=color.gray,text_halign=text.align_center)
table.cell(tbl,1,0,tostring(RR,'#.####'),text_color=color.gray,text_halign=text.align_center)
table.cell(tbl,0,1,'Position Size',text_color=color.gray,text_halign=text.align_center)
table.cell(tbl,1,1,tostring(position_size,'#.####')+' '+syminfo.basecurrency
,text_color=color.gray,text_halign=text.align_center)
//------------------------------------------------------------------------------
Close = plot(close,editable=false,display=display.none)
Entry = plot(entry,editable=false,display=display.none)
fill(Close,Entry,color=open_pl>0?profit_col:loss_col)
plotchar(open_pl,'Rolling Open PL%','',location.abovebar,open_pl > 0 ? profit_col : loss_col)

