Pine script - dolar cost average strategy

Viewed 654

I'm new to Pinescript and am trying to build a strategy that would place an initial order at a limit price and will DCA (dollar cost average) the position if the price drops by x percent. I've managed to get initial order placed with the code below, but cannot make the rest of it working. TradingView would place initial order and but would not DCA. I'm using a loop to place those subsequent orders. I'd appreciate your any insights you could provide into it.

//@version=4
strategy("DCA calculcator - version 2.0", shorttitle = 'DCA calculator', overlay = false)
base_order = input(title = 'Base order value', type = input.integer, defval = 100)
safe_order = input(title = 'Safe order value', type = input.integer, defval = 100)
take_profit = input(title = 'Take profit level', type = input.integer, defval = 2) / 100
price_deviation = input(1.5, type=input.float,  title="Price deviation to open safety order (%)", minval=0.0, step=0.1)/100
safe_order_step_scale   = input(1.0, type=input.float,  title="Safety Order Step Scale", step=0.1) 
max_safe_order = input(title = 'Max safe order', type = input.integer, defval = 4)
start_time = input(type = input.time, title = 'Trade start time', defval = timestamp("1 April 2021 06:00"), group = "Trade start and end time")
end_time = input(type = input.time, title = 'Trade end time', defval = timestamp("1 July 2021 06:00"),  group = "Trade start and end time")

//declarations
var bo_price = 0.0
var open_trades = 0
var deal_start_condition = false

//utility functions
within_window() => time >= start_time and time <= end_time
plot_color() => (within_window() and strategy.opentrades == 0) ? color.new(color.blue, 50) : color.new(color.red, 100)
so_qty(so_level) => safe_order / so_level

safety_order_deviation(index) => price_deviation * pow(safe_order_step_scale,  index - 1)
safety_order_price(index, last_safety_order_price) => last_safety_order_price * (1 - safety_order_deviation(index))


var so_level = 0.0
var last_so_level = 0.0

safe_order_gen(so_price) => so_price * 0.98

//placing base order
if within_window()
    bo_price := close   
    strategy.entry("BO placed", limit=bo_price, long=strategy.long, qty=base_order/bo_price)
    last_so_level :=  bo_price
    
    for index = 1 to 3
        so_price = last_so_level * 0.99
        strategy.entry('SO placed', long=strategy.long, limit=so_price, qty = safe_order / so_price)
        last_so_level := so_price
    
plot(bo_price, color = color.green)
plot(last_so_level, color = color.blue, title = 'SO price')
0 Answers
Related