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