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

MQL5 전환

작업 종료됨

실행 시간 7 일

명시

Нужно сконвертировать код из 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")

응답함

1
개발자 1
등급
(236)
프로젝트
440
26%
중재
125
21% / 57%
기한 초과
96
22%
작업중

프로젝트 정보

예산
50+ USD
개발자에게
45 USD