Нужно сконвертировать код из tradingview в мт5

MQL5 Conversión

Trabajo finalizado

Plazo de ejecución 7 días

Tarea técnica

Нужно сконвертировать код из tradingview в мт5.

 study("Double Top/Bottom - Ultimate (OS)", shorttitle="W/M - Ultimate(OS)", overlay=true, max_lines_count=500, max_labels_count=500, max_bars_back=1000)

length = input(10, step=5, minval=5)

showZigzag = input(false)

showPivots = input(true)

showStats = input(true)

bullishColor = input(color.green)

bullTrapColor = input(color.orange)

bearishColor = input(color.red)

bearTrapColor = input(color.lime)

textColor = input(color.black)


MaxRiskPerReward = input(30, step=5, minval=5, maxval=100)

DisplayRiskPerReward = input(true)

var zigzagvalues = array.new_float(0)

var zigzagindexes = array.new_int(0)

var zigzagdir = array.new_int(0)


var doubleTopBottomValues = array.new_float(3)

var doubleTopBottomIndexes = array.new_int(3)

var doubleTopBottomDir = array.new_int(3)


int max_array_size = 10

max_bars_back(high, 1000)

max_bars_back(low, 1000)


var lineArray = array.new_line(0)

var labelArray = array.new_label(0)

pivots(length)=>

    float ph = highestbars(high, length) == 0 ? high : na

    float pl = lowestbars(low, length) == 0 ? low : na

    dir = 0

    dir := iff(ph and na(pl), 1, iff(pl and na(ph), -1, dir[1]))

    [dir, ph, pl]


add_to_array(value, index, dir)=>

    mult = array.size(zigzagvalues) < 2? 1 : 

                 (dir*value > dir*array.get(zigzagvalues,1))? 2 : 1

    array.unshift(zigzagindexes, index)

    array.unshift(zigzagvalues, value)

    array.unshift(zigzagdir, dir*mult)

    if array.size(zigzagindexes) > max_array_size

        array.pop(zigzagindexes)

        array.pop(zigzagvalues)

        array.pop(zigzagdir)


add_to_zigzag(dir, dirchanged, ph, pl, index)=>

    value = (dir == 1? ph : pl)

    if array.size(zigzagvalues) == 0 or dirchanged

        add_to_array(value, index, dir)

    else if(dir == 1 and value > array.get(zigzagvalues, 0)) or (dir == -1 and value < array.get(zigzagvalues, 0))

        array.shift(zigzagvalues)

        array.shift(zigzagindexes)

        array.shift(zigzagdir)

        add_to_array(value, index, dir)


zigzag(length)=>

    [dir, ph, pl] = pivots(length)

    dirchanged = change(dir)

    if(ph or pl)

        add_to_zigzag(dir, dirchanged, ph, pl, bar_index)


calculate_double_pattern()=>

    doubleTop = false

    doubleTopConfirmation = 0

    doubleBottom = false

    doubleBottomConfirmation = 0

    if(array.size(zigzagvalues) >= 4) 

        index = array.get(zigzagindexes, 1)

        value = array.get(zigzagvalues, 1)

        highLow = array.get(zigzagdir, 1)

        

        lindex = array.get(zigzagindexes, 2)

        lvalue = array.get(zigzagvalues, 2)

        lhighLow = array.get(zigzagdir, 2)

        

        llindex = array.get(zigzagindexes, 3)

        llvalue = array.get(zigzagvalues, 3)

        llhighLow = array.get(zigzagdir, 3)

        risk = abs(value-llvalue)

        reward = abs(value-lvalue)

        riskPerReward = risk*100/(risk+reward)

        

        if(highLow == 1 and llhighLow == 2 and lhighLow < 0  and riskPerReward < MaxRiskPerReward)

            doubleTop := true

        if(highLow == -1 and llhighLow == -2 and lhighLow > 0 and riskPerReward < MaxRiskPerReward)

            doubleBottom := true


        if(doubleTop or doubleBottom)

            array.set(doubleTopBottomValues, 0, value)

            array.set(doubleTopBottomValues, 1, lvalue)

            array.set(doubleTopBottomValues, 2, llvalue)

            

            array.set(doubleTopBottomIndexes, 0, index)

            array.set(doubleTopBottomIndexes, 1, lindex)

            array.set(doubleTopBottomIndexes, 2, llindex)

            

            array.set(doubleTopBottomDir, 0, highLow)

            array.set(doubleTopBottomDir, 1, lhighLow)

            array.set(doubleTopBottomDir, 2, llhighLow)

    

    [doubleTop, doubleBottom]


get_crossover_info(doubleTop, doubleBottom)=>

    index = array.get(doubleTopBottomIndexes, 0)

    value = array.get(doubleTopBottomValues, 0)

    highLow = array.get(doubleTopBottomDir, 0)

    

    lindex = array.get(doubleTopBottomIndexes, 1)

    lvalue = array.get(doubleTopBottomValues, 1)

    lhighLow = array.get(doubleTopBottomDir, 1)

    

    llindex = array.get(doubleTopBottomIndexes, 2)

    llvalue = array.get(doubleTopBottomValues, 2)

    llhighLow = array.get(doubleTopBottomDir, 2)

    

    latestDoubleTop = false

    latestDoubleBottom = false

    latestDoubleTop := doubleTop ? true : doubleBottom? false : latestDoubleTop[1]

    latestDoubleBottom := doubleBottom? true : doubleTop? false : latestDoubleBottom[1]

    

    doubleTopConfirmation = 0

    doubleBottomConfirmation = 0

    doubleTopConfirmation := latestDoubleTop? (crossunder(low, lvalue) ? 1 : crossover(high, llvalue) ? -1 : 0) : 0

    doubleBottomConfirmation := latestDoubleBottom? (crossover(high, lvalue) ? 1 : crossunder(low, llvalue) ? -1 : 0) : 0

    [doubleTopConfirmation, doubleBottomConfirmation]


draw_double_pattern(doubleTop,doubleBottom,doubleTopConfirmation,doubleBottomConfirmation)=>

    index = array.get(doubleTopBottomIndexes, 0)

    value = array.get(doubleTopBottomValues, 0)

    highLow = array.get(doubleTopBottomDir, 0)

    

    lindex = array.get(doubleTopBottomIndexes, 1)

    lvalue = array.get(doubleTopBottomValues, 1)

    lhighLow = array.get(doubleTopBottomDir, 1)

    

    llindex = array.get(doubleTopBottomIndexes, 2)

    llvalue = array.get(doubleTopBottomValues, 2)

    llhighLow = array.get(doubleTopBottomDir, 2)

    

    isBullish = true

    isBullish := (doubleTop or doubleBottom)? doubleTop : isBullish[1]

    

    risk = abs(value-llvalue)

    reward = abs(value-lvalue)

    riskPerReward = risk*100/(risk+reward)

    

    base = line.new(x1=index, y1=value, 

                 x2 = llindex, y2=llvalue,

                 color=doubleTop? bearishColor : bullishColor, width=2, style=line.style_solid)

    l1 = line.new(x1=index, y1=value, 

                 x2 = lindex, y2=lvalue,

                 color=doubleTop? bearishColor : bullishColor, width=2, style=line.style_dotted)

    l2 = line.new(x1=lindex, y1=lvalue, 

                 x2 = llindex, y2=llvalue,

                 color=doubleTop? bearishColor : bullishColor, width=2, style=line.style_dotted)

    labelText = (doubleTop? "Double Top" : "Double Bottom") + (DisplayRiskPerReward ? " RR - "+tostring(riskPerReward) : "")

    

    baseLabel = label.new(x=index, y=value, text=labelText, yloc=doubleTop?yloc.abovebar:yloc.belowbar,

                             color=doubleTop?bearishColor:bullishColor, 

                             style=doubleTop?label.style_label_down:label.style_label_up,

                             textcolor=textColor, size=size.normal)

    

    if not (doubleTop or doubleBottom) 

        line.delete(base)

        line.delete(l1)

        line.delete(l2)

        label.delete(baseLabel)

        

    var doubleTopCount = 0

    var doubleBottomCount = 0

    doubleTopCount := doubleTop? nz(doubleTopCount[1],0) + 1 : nz(doubleTopCount[1],0)

    doubleBottomCount := doubleBottom? nz(doubleBottomCount[1],0) + 1 : nz(doubleBottomCount[1],0)

        

    if(line.get_x2(base) == line.get_x2(base[1]))

        line.delete(base[1])

        line.delete(l1[1])

        line.delete(l2[1])

        label.delete(baseLabel[1])

        doubleTopCount := doubleTop? doubleTopCount -1 : doubleTopCount

        doubleBottomCount := doubleBottom? doubleBottomCount -1 : doubleBottomCount

    

    

    if(barstate.islast)

        lres = line.new(x1=bar_index, y1=lvalue, 

                     x2 = lindex, y2=lvalue,

                     color=isBullish? bearishColor : bullishColor, width=2, style=line.style_dashed, extend=extend.left)

        lsup = line.new(x1=bar_index, y1=llvalue, 

                     x2 = llindex, y2=llvalue,

                     color=isBullish? bullishColor : bearishColor , width=2, style=line.style_dashed, extend=extend.left)


    

    doubleTopConfirmationCount = doubleTopConfirmation>0? 1 : 0

    doubleBottomConfirmationCount = doubleBottomConfirmation>0? 1:0

    doubleTopInvalidationCount = doubleTopConfirmation<0? 1 : 0

    doubleBottomInvalidationCount = doubleBottomConfirmation<0? 1:0

    

    if(doubleTopConfirmation != 0 or doubleBottomConfirmation !=0)

        if(doubleTopConfirmation>0 or doubleBottomConfirmation > 0)

            lresbreak = line.new(x1=lindex, y1=lvalue, 

                     x2 = bar_index, y2=lvalue,

                     color=isBullish? bearishColor : bullishColor, width=2, style=line.style_dashed)

            if(line.get_x1(lresbreak[1]) == line.get_x1(lresbreak))

                doubleTopConfirmationCount := 0

                doubleBottomConfirmationCount := 0

                doubleTopInvalidationCount := 0

                doubleBottomInvalidationCount := 0

                line.delete(lresbreak)

                lresbreak := lresbreak[1]

        else if(doubleTopConfirmation<0 or doubleBottomConfirmation < 0)

            lsupbreak = line.new(x1=llindex, y1=llvalue, 

                     x2 = bar_index, y2=llvalue,

                     color=isBullish? bullishColor : bearishColor , width=2, style=line.style_dashed)

            if(line.get_x1(lsupbreak[1]) == line.get_x1(lsupbreak))

                doubleTopInvalidationCount := 0

                doubleBottomInvalidationCount := 0

                doubleTopConfirmationCount := 0

                doubleBottomConfirmationCount := 0

                line.delete(lsupbreak)

                lsupbreak := lsupbreak[1]

    doubleTopConfirmationCount := nz(doubleTopConfirmationCount[1],0)+doubleTopConfirmationCount

    doubleBottomConfirmationCount := nz(doubleBottomConfirmationCount[1],0)+doubleBottomConfirmationCount

    doubleTopInvalidationCount := nz(doubleTopInvalidationCount[1],0)+doubleTopInvalidationCount

    doubleBottomInvalidationCount := nz(doubleBottomInvalidationCount[1],0)+doubleBottomInvalidationCount

    [doubleTopCount, doubleBottomCount, doubleTopConfirmationCount, doubleBottomConfirmationCount, doubleTopInvalidationCount, doubleBottomInvalidationCount]


zigzag(length)


[doubleTop, doubleBottom] = calculate_double_pattern()

[doubleTopConfirmation, doubleBottomConfirmation] = get_crossover_info(doubleTop, doubleBottom)

[doubleTopCount, doubleBottomCount, 

                 doubleTopConfirmationCount, doubleBottomConfirmationCount,

                 doubleTopInvalidationCount, doubleBottomInvalidationCount] = draw_double_pattern(doubleTop,doubleBottom,doubleTopConfirmation,doubleBottomConfirmation)


var stats = table.new(position = position.top_right, columns = 5, rows = 5, border_width = 1)

if(barstate.islast and showStats)

    colorWorst = color.rgb(255, 153, 51)

    colorBest = color.rgb(51, 204, 51)

    colorBad = color.rgb(255, 204, 153)

    colorGood = color.rgb(204, 255, 204)

    colorNeutral = color.rgb(255, 255, 204)

    

    dtConfirmationPercent = doubleTopConfirmationCount+doubleTopInvalidationCount == 0? 0.5 : doubleTopConfirmationCount/(doubleTopConfirmationCount+doubleTopInvalidationCount)

    dbConfirmationPercent = (doubleBottomConfirmationCount+doubleBottomInvalidationCount) == 0? 0.5 : doubleBottomConfirmationCount/(doubleBottomConfirmationCount+doubleBottomInvalidationCount)

    

    dtColor = dtConfirmationPercent >= 0.8? colorBest :

                 dtConfirmationPercent >= 0.6? colorGood :

                 dtConfirmationPercent >= 0.4? colorNeutral :

                 dtConfirmationPercent >= 0.2? colorBad : colorWorst

    dbColor = dbConfirmationPercent >= 0.8? colorBest :

                 dbConfirmationPercent >= 0.6? colorGood :

                 dbConfirmationPercent >= 0.4? colorNeutral :

                 dbConfirmationPercent >= 0.2? colorBad : colorWorst

    table.cell(table_id = stats, column = 0, row = 0 , text = "", bgcolor=color.black, text_color=color.white)

    table.cell(table_id = stats, column = 0, row = 1 , text = "Double Top", bgcolor=color.black, text_color=color.white)

    table.cell(table_id = stats, column = 0, row = 2 , text = "Double Bottom", bgcolor=color.black, text_color=color.white)

    

    table.cell(table_id = stats, column = 1, row = 0 , text = "Count", bgcolor=color.black, text_color=color.white)

    table.cell(table_id = stats, column = 2, row = 0 , text = "Confirmation", bgcolor=color.black, text_color=color.white)

    table.cell(table_id = stats, column = 3, row = 0 , text = "Invalidation", bgcolor=color.black, text_color=color.white)

    

    table.cell(table_id = stats, column = 1, row = 1, text = tostring(doubleTopCount), bgcolor=dtColor)

    table.cell(table_id = stats, column = 1, row = 2, text = tostring(doubleBottomCount), bgcolor=dbColor)

    

    table.cell(table_id = stats, column = 2, row = 1, text = tostring(doubleTopConfirmationCount), bgcolor=dtColor)

    table.cell(table_id = stats, column = 3, row = 1, text = tostring(doubleTopInvalidationCount), bgcolor=dtColor)

    

    table.cell(table_id = stats, column = 2, row = 2, text = tostring(doubleBottomConfirmationCount), bgcolor=dbColor)

    table.cell(table_id = stats, column = 3, row = 2, text = tostring(doubleBottomInvalidationCount), bgcolor=dbColor)


if(barstate.islast and array.size(zigzagindexes) > 1)

    lastHigh = 0.0

    lastLow = 0.0

    for x = 0 to array.size(zigzagindexes)-1

        i = array.size(zigzagindexes)-1-x

        index = array.get(zigzagindexes, i)

        value = array.get(zigzagvalues, i)

        highLow = array.get(zigzagdir, i)

        index_offset = bar_index-index

        

        labelText = highLow ==2 ? "HH" : highLow == 1? "LH" : highLow == -1? "HL" : "LL"

        labelColor = highLow ==2 ? bullishColor : highLow == 1? bullTrapColor : highLow == -1? bearTrapColor : bearishColor

        labelStyle = highLow > 0? label.style_label_down : label.style_label_up

        // labelLocation = highLow > 0? yloc.abovebar : yloc.belowbar

        labelLocation = yloc.price

        if(showPivots)

            l = label.new(x=index, y = value, text=labelText, xloc=xloc.bar_index, yloc=labelLocation, style=labelStyle, size=size.tiny, 

                                 color=labelColor, textcolor=textColor)

            array.unshift(labelArray, l)

            if(array.size(labelArray) > 100)

                label.delete(array.pop(labelArray))

        if(i < array.size(zigzagindexes)-1 and showZigzag)

            indexLast = array.get(zigzagindexes, i+1)

            valueLast = array.get(zigzagvalues, i+1)

            l = line.new(x1=index, y1=value, 

                         x2 = indexLast, y2=valueLast,

                         color=labelColor, width=2, style=line.style_solid)

                         

            array.unshift(lineArray, l)

            if(array.size(lineArray) > 100)

                line.delete(array.pop(lineArray))

alertcondition(doubleBottom, "Double Bottom", "Probable double bottom observed for {{ticker}} on {{interval}} timeframe")

alertcondition(doubleBottomConfirmation > 0, "Double Bottom Confirmation", "Double bottom confirmation observed for {{ticker}} on {{interval}} timeframe")

alertcondition(doubleBottomConfirmation < 0, "Double Bottom Invalidation", "Double bottom invalidation observed for {{ticker}} on {{interval}} timeframe")

alertcondition(doubleTop, "Double Top", "Probable double top observed for {{ticker}} on {{interval}} timeframe")

alertcondition(doubleTopConfirmation > 0, "Double Top Confirmation", "Double top confirmation observed for {{ticker}} on {{interval}} timeframe")

alertcondition(doubleTopConfirmation < 0, "Double Top Invalidation", "Double top invalidation observed for {{ticker}} on {{interval}} timeframe")

Han respondido

1
Desarrollador 1
Evaluación
(236)
Proyectos
440
26%
Arbitraje
125
21% / 57%
Caducado
96
22%
Trabaja

Información sobre el proyecto

Presupuesto
50+ USD
Para el ejecutor
45 USD