指定

// This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International  
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// © UAlgo

//@version=6
indicator("Rejection Blocks [UAlgo]", overlay=true, max_boxes_count=500, max_labels_count=500, max_lines_count=500)

// -----------------------------------------------------------------------------
// Settings
// -----------------------------------------------------------------------------
type Settings
    int swingLeft
    int swingRight
    int confirmWindow
    string sweepType
    int minSweepTicks
    bool useShapeFilter
    float minWickToBody
    float minDomWickPct
    float maxOppWickPct
    float maxBodyPct
    string closeFilter
    string rbZoneMode
    string strengthModel
    float innerMaxPctOfOuter
    int innerMinBars
    int rightOffsetBars
    int maxBlocks
    int maxPending
    string mitigationMode
    bool stopOnMitigation
    bool deleteOnMitigation
    string invalidationMode
    bool deleteOnInvalid
    int maxAgeBars
    bool showBull
    bool showBear
    bool showStructure
    int structLineLenBars
    int maxStructLines
    color colOuterFill
    color colOuterBorder
    color colOuterMitFill
    color colOuterMitBorder
    color colOuterInvFill
    color colOuterInvBorder
    color colBuyFill
    color colBuyBorder
    color colSellFill
    color colSellBorder

// -----------------------------------------------------------------------------
// Types
// -----------------------------------------------------------------------------
type CandleParts
    float rng
    float body
    float upperWick
    float lowerWick
    float bodyTop
    float bodyBot

method rngAdj(CandleParts self) =>
    math.max(self.rng, syminfo.mintick)

method bodyAdj(CandleParts self) =>
    math.max(self.body, syminfo.mintick)

type Candidate
    int leftT
    float top
    float bottom
    int dir
    float buyStrength
    float sellStrength
    float confirmLevel

type BlockVisuals
    box outer
    box buyBox
    box sellBox
    line capLine

type Block
    int leftT
    int rightT
    float top
    float bottom
    int dir
    bool mitigated
    bool invalidated
    int stopRightT
    float buyStrength
    float sellStrength
    BlockVisuals vis

type StructLine
    line id
    label lbl

// -----------------------------------------------------------------------------
// Methods & Helpers
// -----------------------------------------------------------------------------
f_clamp(float v, float lo, float hi) =>
    math.min(math.max(v, lo), hi)

f_clampInt(int v, int lo, int hi) =>
    v < lo ? lo : v > hi ? hi : v

f_hidden(color c) =>
    color.new(c, 100)

method delete(BlockVisuals self) =>
    if not na(self.outer)
        box.delete(self.outer)
    if not na(self.buyBox)
        box.delete(self.buyBox)
    if not na(self.sellBox)
        box.delete(self.sellBox)
    if not na(self.capLine)
        line.delete(self.capLine)

method delete(Block self) =>
    self.vis.delete()

method delete(StructLine self) =>
    if not na(self.id)
        line.delete(self.id)
    if not na(self.lbl)
        label.delete(self.lbl)

type RBManager
    Settings cfg
    array<Candidate> pending
    array<Block> blocks
    array<StructLine> structLines
    float lastSwingHigh
    int lastSwingHighT
    float lastSwingLow
    int lastSwingLowT
    int lastBrokenHighT
    int lastBrokenLowT
    int trendDir

f_getParts() =>
    float bTop = math.max(open, close)
    float bBot = math.min(open, close)
    float uW = high - bTop
    float lW = bBot - low
    float rng = high - low
    float body = bTop - bBot
    CandleParts.new(rng, body, uW, lW, bTop, bBot)

method isRBCandle(RBManager self, int dir, float level) =>
    if na(level)
        false
    else
        CandleParts p = f_getParts()
        float rngAdj = p.rngAdj()
        float bodyAdj = p.bodyAdj()

        float domW = dir == 1 ? p.lowerWick : p.upperWick
        float oppW = dir == 1 ? p.upperWick : p.lowerWick
        float domPct = domW / rngAdj
        float oppPct = oppW / rngAdj
        float bodyPct = p.body / rngAdj

        bool shapeOk = not self.cfg.useShapeFilter ? true :
             rngAdj > syminfo.mintick and
             domW >= bodyAdj * self.cfg.minWickToBody and
             domPct >= self.cfg.minDomWickPct and
             oppPct <= self.cfg.maxOppWickPct and
             bodyPct <= self.cfg.maxBodyPct

        float sweepMargin = self.cfg.minSweepTicks * syminfo.mintick
        bool sweepOk = dir == 1 ?
             (low < level - sweepMargin and close > level) :
             (high > level + sweepMargin and close < level)

        bool wickSweepOk = self.cfg.sweepType == "Wick sweep (open+close inside)" ? (dir == 1 ? open > level : open < level) : true

        float mid = (high + low) * 0.5
        bool closeOk = switch self.cfg.closeFilter
            "None" => true
            "Close in favorable half" => dir == 1 ? close >= mid : close <= mid
            "Close beyond open" => dir == 1 ? close > open : close < open
            => true

        sweepOk and wickSweepOk and shapeOk and closeOk

method getZone(RBManager self, int dir) =>
    float bodyTop = math.max(open, close)
    float bodyBot = math.min(open, close)
    float top = na
    float bottom = na
    switch self.cfg.rbZoneMode
        "Wick-to-Body" =>
            if dir == 1
                top := bodyBot
                bottom := low
            else
                top := high
                bottom := bodyTop
        "Open-to-Extreme" =>
            if dir == 1
                top := open
                bottom := low
            else
                top := high
                bottom := open
        "Full Candle" =>
            top := high
            bottom := low
        "Body" =>
            top := bodyTop
            bottom := bodyBot
        =>
            top := high
            bottom := low
    [top, bottom]

method getStrength(RBManager self, int dir) =>
    CandleParts p = f_getParts()
    float rngAdj = p.rngAdj()
    float closeLoc = f_clamp((close - low) / rngAdj, 0.0, 1.0)
    float buy = closeLoc
    if self.cfg.strengthModel == "Close + Wick"
        float domWickPct = (dir == 1 ? p.lowerWick : p.upperWick) / rngAdj
        float wickSignal = dir == 1 ? domWickPct : (1.0 - domWickPct)
        buy := f_clamp(closeLoc * 0.7 + wickSignal * 0.3, 0.0, 1.0)
    float sell = 1.0 - buy
    [buy, sell]

method createBlock(RBManager self, Candidate c, int rightNowT, int barMs) =>
    float mid = (c.top + c.bottom) * 0.5
    int minRightT = c.leftT + barMs
    int r = math.max(rightNowT, minRightT)

    box outer = box.new(left=c.leftT, top=c.top, right=r, bottom=c.bottom, xloc=xloc.bar_time, extend=extend.none)
    box buyBox = box.new(left=c.leftT, top=mid, right=r, bottom=c.bottom, xloc=xloc.bar_time, extend=extend.none, bgcolor=color.new(color.lime, 90), border_color=color.new(color.lime, 80))
    box sellBox = box.new(left=c.leftT, top=c.top, right=r, bottom=mid, xloc=xloc.bar_time, extend=extend.none, bgcolor=color.new(color.red, 90), border_color=color.new(color.red, 80))

    int width = math.max(1, r - c.leftT)
    int capX = c.leftT + int(math.round(width * self.cfg.innerMaxPctOfOuter))
    capX := math.min(r, capX)
    line capLine = line.new(x1=capX, y1=c.bottom, x2=capX, y2=c.top, xloc=xloc.bar_time, extend=extend.none, color=self.cfg.colOuterBorder, style=line.style_dashed, width=1)
    
    BlockVisuals vis = BlockVisuals.new(outer, buyBox, sellBox, capLine)
    Block b = Block.new(c.leftT, r, c.top, c.bottom, c.dir, false, false, na, c.buyStrength, c.sellStrength, vis)
    b

method setVisuals(RBManager self, Block b, bool visible) =>
    color fill = b.invalidated ? self.cfg.colOuterInvFill : b.mitigated ? self.cfg.colOuterMitFill : self.cfg.colOuterFill
    color border = b.invalidated ? self.cfg.colOuterInvBorder : b.mitigated ? self.cfg.colOuterMitBorder : self.cfg.colOuterBorder
    
    box.set_bgcolor(b.vis.outer, visible ? fill : f_hidden(fill))
    box.set_border_width(b.vis.outer, 0)
    box.set_border_color(b.vis.outer, f_hidden(border))

    box.set_bgcolor(b.vis.buyBox, visible ? self.cfg.colBuyFill : f_hidden(self.cfg.colBuyFill))
    box.set_border_color(b.vis.buyBox, visible ? self.cfg.colBuyBorder : f_hidden(self.cfg.colBuyBorder))
    box.set_bgcolor(b.vis.sellBox, visible ? self.cfg.colSellFill : f_hidden(self.cfg.colSellFill))
    box.set_border_color(b.vis.sellBox, visible ? self.cfg.colSellBorder : f_hidden(self.cfg.colSellBorder))
    
    color capCol = b.invalidated ? self.cfg.colOuterInvBorder : b.mitigated ? self.cfg.colOuterMitBorder : self.cfg.colOuterBorder
    if not na(b.vis.capLine)
        line.set_color(b.vis.capLine, visible ? capCol : f_hidden(capCol))

method updateBoxCoords(RBManager self, Block b, int rightNowT, int barMs) =>
    int r = rightNowT
    box.set_right(b.vis.outer, r)

    int width = math.max(1, r - b.leftT)
    float buyPct = self.cfg.innerMaxPctOfOuter * f_clamp(b.buyStrength, 0.0, 1.0)
    float sellPct = self.cfg.innerMaxPctOfOuter * f_clamp(b.sellStrength, 0.0, 1.0)

    int minW = self.cfg.innerMinBars * barMs
    int buyW = f_clampInt(int(math.round(width * buyPct)), minW, width)
    int sellW = f_clampInt(int(math.round(width * sellPct)), minW, width)

    box.set_right(b.vis.buyBox, math.min(r, b.leftT + buyW))
    box.set_right(b.vis.sellBox, math.min(r, b.leftT + sellW))

    int capX = b.leftT + int(math.round(width * self.cfg.innerMaxPctOfOuter))
    capX := math.min(r, capX)
    if not na(b.vis.capLine)
        line.set_xy1(b.vis.capLine, capX, b.bottom)
        line.set_xy2(b.vis.capLine, capX, b.top)

method pushLine(RBManager self, int x1, int x2, float y, color col, string sty, int limit, string txt, color txtCol) =>
    if array.size(self.structLines) >= limit
        StructLine old = array.shift(self.structLines)
        old.delete()
    
    line l = line.new(x1=x1, y1=y, x2=x2, y2=y, xloc=xloc.bar_time, extend=extend.none, color=col, style=sty, width=1)
    
    int midT = int((x1 + x2) / 2)
    label lbl = label.new(x=midT, y=y, text=txt, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.white, 100), textcolor=txtCol, style=label.style_label_center, size=size.tiny)
    
    array.push(self.structLines, StructLine.new(l, lbl))

method addBlock(RBManager self, Candidate c, int rightOffsetMs, int barMs) =>
    while array.size(self.blocks) >= self.cfg.maxBlocks
        Block old = array.shift(self.blocks)
        old.delete()
    int rightNowT = time_close + rightOffsetMs
    Block b = self.createBlock(c, rightNowT, barMs)
    self.setVisuals(b, true)
    self.updateBoxCoords(b, rightNowT, barMs)
    array.push(self.blocks, b)

method process(RBManager self) =>
    int barMs = int(time_close - time)
    barMs := barMs <= 0 ? 1 : barMs
    int rightOffsetMs = self.cfg.rightOffsetBars * barMs

    float ph = ta.pivothigh(high, self.cfg.swingLeft, self.cfg.swingRight)
    float pl = ta.pivotlow(low, self.cfg.swingLeft, self.cfg.swingRight)

    float srcUp = close
    float srcDn = close
    
    bool canBullBreak = not na(self.lastSwingHigh) and not na(self.lastSwingHighT) and time_close > self.lastSwingHighT and self.lastSwingHighT != self.lastBrokenHighT
    bool canBearBreak = not na(self.lastSwingLow) and not na(self.lastSwingLowT) and time_close > self.lastSwingLowT and self.lastSwingLowT != self.lastBrokenLowT
    
    bool bullBreak = canBullBreak and srcUp > self.lastSwingHigh and srcUp[1] <= self.lastSwingHigh
    bool bearBreak = canBearBreak and srcDn < self.lastSwingLow and srcDn[1] >= self.lastSwingLow

    if not na(ph)
        self.lastSwingHigh := ph
        self.lastSwingHighT := time[self.cfg.swingRight]
    if not na(pl)
        self.lastSwingLow := pl
        self.lastSwingLowT := time[self.cfg.swingRight]

    int prevTrendDir = self.trendDir
    
    bool bearRBCandle = self.cfg.showBear and self.isRBCandle(-1, self.lastSwingHigh)
    bool bullRBCandle = self.cfg.showBull and self.isRBCandle(1, self.lastSwingLow)

    bool bullBOS = bullBreak and prevTrendDir != -1
    bool bullCHOCH = bullBreak and prevTrendDir == -1
    bool bearBOS = bearBreak and prevTrendDir != 1
    bool bearCHOCH = bearBreak and prevTrendDir == 1

    if barstate.isconfirmed
        if bullBreak or bearBreak
            self.trendDir := bullBreak ? 1 : -1
            if bullBreak
                self.lastBrokenHighT := self.lastSwingHighT
            if bearBreak
                self.lastBrokenLowT := self.lastSwingLowT

    if barstate.isconfirmed and self.cfg.showStructure
        int budget = 500 - self.cfg.maxBlocks
        budget := budget < 0 ? 0 : budget
        int limit = self.cfg.maxStructLines < budget ? self.cfg.maxStructLines : budget
        
        if limit > 0
            int x1 = time
            int x2 = time + self.cfg.structLineLenBars * barMs
            
            if bullRBCandle
                self.pushLine(self.lastSwingHighT, time, self.lastSwingLow, color.new(color.gray, 25), line.style_dotted, limit, "SW", color.gray)
            if bearRBCandle
                self.pushLine(self.lastSwingLowT, time, self.lastSwingHigh, color.new(color.gray, 25), line.style_dotted, limit, "SW", color.gray)
            
            if bullBOS
                self.pushLine(self.lastSwingHighT, time, self.lastSwingHigh, color.new(color.lime, 0), line.style_dashed, limit, "BOS", color.lime)
            if bullCHOCH
                self.pushLine(self.lastSwingHighT, time, self.lastSwingHigh, color.new(color.teal, 0), line.style_dashed, limit, "CH", color.teal)
            if bearBOS
                self.pushLine(self.lastSwingLowT, time, self.lastSwingLow, color.new(color.red, 0), line.style_dashed, limit, "BOS", color.red)
            if bearCHOCH
                self.pushLine(self.lastSwingLowT, time, self.lastSwingLow, color.new(color.orange, 0), line.style_dashed, limit, "CH", color.orange)

    if barstate.isconfirmed
        if bearRBCandle
            float confirmLvl = self.lastSwingLow
            if not na(confirmLvl)
                [top, bottom] = self.getZone(-1)
                if not na(top) and not na(bottom) and top > bottom + syminfo.mintick
                    [buyStr, sellStr] = self.getStrength(-1)
                    Candidate c = Candidate.new(time, top, bottom, -1, buyStr, sellStr, confirmLvl)
                    array.push(self.pending, c)

        if bullRBCandle
            float confirmLvl = self.lastSwingHigh
            if not na(confirmLvl)
                [top, bottom] = self.getZone(1)
                if not na(top) and not na(bottom) and top > bottom + syminfo.mintick
                    [buyStr, sellStr] = self.getStrength(1)
                    Candidate c = Candidate.new(time, top, bottom, 1, buyStr, sellStr, confirmLvl)
                    array.push(self.pending, c)

        while array.size(self.pending) > self.cfg.maxPending
            array.shift(self.pending)
        
        int pn = array.size(self.pending)
        if pn > 0
            for i = pn - 1 to 0
                Candidate c = array.get(self.pending, i)
                bool expired = self.cfg.confirmWindow > 0 and (time_close - c.leftT) >= (self.cfg.confirmWindow * barMs)
                bool confirmed = false
                
                if not expired and not na(c.confirmLevel) and time > c.leftT
                    bool broke = c.dir == 1 ?
                         (srcUp > c.confirmLevel and srcUp[1] <= c.confirmLevel) :
                         (srcDn < c.confirmLevel and srcDn[1] >= c.confirmLevel)
                    confirmed := broke
                
                if expired
                    array.remove(self.pending, i)
                else if confirmed
                    self.addBlock(c, rightOffsetMs, barMs)
                    array.remove(self.pending, i)

        while array.size(self.blocks) > self.cfg.maxBlocks
            Block old = array.shift(self.blocks)
            old.delete()
        
        int bn = array.size(self.blocks)
        if bn > 0
            for i = bn - 1 to 0
                Block b = array.get(self.blocks, i)
                bool visible = b.dir == 1 ? self.cfg.showBull : self.cfg.showBear
                bool doDelete = false
                
                if not doDelete and self.cfg.maxAgeBars > 0 and (time_close - b.leftT) >= (self.cfg.maxAgeBars * barMs)
                    doDelete := true
                    true
                else
                    false
                
                if not doDelete and not b.invalidated and self.cfg.invalidationMode != "None"
                    bool inv = switch b.dir
                        1 => self.cfg.invalidationMode == "Close" ? close < b.bottom : low < b.bottom
                        -1 => self.cfg.invalidationMode == "Close" ? close > b.top : high > b.top
                        => false
                    
                    if inv
                        b.invalidated := true
                        self.setVisuals(b, visible) 
                        if self.cfg.deleteOnInvalid
                            doDelete := true
                        true
                    else
                        false
                
                if not doDelete and not b.mitigated
                    bool closeInside = close <= b.top and close >= b.bottom
                    bool intersect = high >= b.bottom and low <= b.top
                    bool hit = self.cfg.mitigationMode == "Close Inside" ? closeInside : intersect
                    if hit and time_close > b.leftT
                        b.mitigated := true
                        b.stopRightT := time_close + rightOffsetMs
                        if self.cfg.deleteOnMitigation
                            doDelete := true
                        true
                    else
                        false
                
                self.setVisuals(b, visible)
                
                int rightNowT = time_close + rightOffsetMs
                if self.cfg.stopOnMitigation and b.mitigated and not na(b.stopRightT)
                    rightNowT := b.stopRightT
                
                int minRightT = b.leftT + barMs
                rightNowT := math.max(rightNowT, minRightT)
                b.rightT := rightNowT
                
                self.updateBoxCoords(b, rightNowT, barMs)
                
                if doDelete
                    b.delete()
                    array.remove(self.blocks, i)
                    true
                else
                    array.set(self.blocks, i, b)
                    false

// -----------------------------------------------------------------------------
// Initialization & Main Execution
// -----------------------------------------------------------------------------
groupStructure = "Market Structure"
swingLeft = input.int(5, "Swing left bars", minval=5, group=groupStructure)
swingRight = input.int(5, "Swing right bars", minval=5, group=groupStructure)

groupRB = "Rejection Block (RB) Detection"
sweepType = input.string("Any sweep (close inside)", "Sweep type", options=["Wick sweep (open+close inside)","Any sweep (close inside)"], group=groupRB)
minSweepTicks = input.int(0, "Min sweep distance (ticks)", minval=0, maxval=5000, group=groupRB)
useShapeFilter = input.bool(true, "Use rejection candle shape filter", group=groupRB)
minWickToBody = input.float(2.0, "Min wick/body ratio", minval=0.5, step=0.1, group=groupRB)
minDomWickPct = input.float(55.0, "Min dominant wick (% of range)", minval=5.0, maxval=100.0, step=1.0, group=groupRB) / 100.0
maxOppWickPct = input.float(30.0, "Max opposite wick (% of range)", minval=0.0, maxval=100.0, step=1.0, group=groupRB) / 100.0
maxBodyPct = input.float(60.0, "Max body (% of range)", minval=0.0, maxval=100.0, step=1.0, group=groupRB) / 100.0
closeFilter = input.string("Close in favorable half", "Close filter", options=["None","Close in favorable half","Close beyond open"], group=groupRB)
rbZoneMode = input.string("Wick-to-Body", "RB zone model", options=["Wick-to-Body","Open-to-Extreme","Full Candle","Body"], group=groupRB)

groupStrength = "Inner Buy/Sell Strength"
strengthModel = input.string("Close location", "Strength model", options=["Close location","Close + Wick"], group=groupStrength, tooltip="Approximation only. Strength is fixed at RB formation.")
innerMaxPctOfOuter = input.float(50.0, "Max inner width (% of outer, <= 50)", minval=1.0, maxval=50.0, step=1.0, group=groupStrength) / 100.0
innerMinBars = input.int(1, "Min inner width (bars)", minval=1, maxval=50, group=groupStrength)
rightOffsetBars = input.int(0, "Right offset (bars)", minval=0, maxval=200, group=groupStrength)

groupLifecycle = "Lifecycle"
maxBlocks = input.int(25, "Max blocks", minval=1, maxval=150, group=groupLifecycle)
mitigationMode = input.string("Touch", "Mitigation mode", options=["Touch","Close Inside"], group=groupLifecycle)
stopOnMitigation = input.bool(false, "Stop extending on mitigation", group=groupLifecycle)
deleteOnMitigation = input.bool(false, "Delete on mitigation", group=groupLifecycle)
invalidationMode = input.string("Close", "Invalidation mode", options=["None","Wick","Close"], group=groupLifecycle)
deleteOnInvalid = input.bool(true, "Delete on invalidation", group=groupLifecycle)
maxAgeBars = input.int(0, "Max age (bars, 0=off)", minval=0, maxval=20000, group=groupLifecycle)

groupDisplay = "Display"
showBull = input.bool(true, "Show bullish blocks", group=groupDisplay)
showBear = input.bool(true, "Show bearish blocks", group=groupDisplay)
showStructure = input.bool(true, "Show sweep/BOS/CHOCH", group=groupDisplay)
structLineLenBars = input.int(40, "Structure line length (bars, 0=off)", minval=0, maxval=2000, group=groupDisplay)
maxStructLines = input.int(120, "Max structure lines", minval=0, maxval=500, group=groupDisplay)

colOuterFill = input.color(color.new(color.gray, 82), "Outer fill", group=groupDisplay)
colOuterBorder = input.color(color.new(color.gray, 35), "Outer border", group=groupDisplay)
colOuterMitFill = input.color(color.new(color.teal, 85), "Mitigated fill", group=groupDisplay)
colOuterMitBorder = input.color(color.new(color.teal, 35), "Mitigated border", group=groupDisplay)
colOuterInvFill = input.color(color.new(color.maroon, 85), "Invalidated fill", group=groupDisplay)
colOuterInvBorder = input.color(color.new(color.maroon, 35), "Invalidated border", group=groupDisplay)

colBuyFill = input.color(color.new(color.lime, 55), "Buy fill", group=groupDisplay)
colBuyBorder = input.color(color.new(color.lime, 0), "Buy border", group=groupDisplay)
colSellFill = input.color(color.new(color.red, 55), "Sell fill", group=groupDisplay)
colSellBorder = input.color(color.new(color.red, 0), "Sell border", group=groupDisplay)

// Init Settings
Settings cfg = Settings.new(swingLeft, swingRight, 50, sweepType, minSweepTicks, useShapeFilter, minWickToBody, minDomWickPct, maxOppWickPct, maxBodyPct, closeFilter, rbZoneMode, strengthModel, innerMaxPctOfOuter, innerMinBars, rightOffsetBars, maxBlocks, 50, mitigationMode, stopOnMitigation, deleteOnMitigation, invalidationMode, deleteOnInvalid, maxAgeBars, showBull, showBear, showStructure, structLineLenBars, maxStructLines, colOuterFill, colOuterBorder, colOuterMitFill, colOuterMitBorder, colOuterInvFill, colOuterInvBorder, colBuyFill, colBuyBorder, colSellFill, colSellBorder)

// Init Manager
var RBManager mgr = RBManager.new(cfg, array.new<Candidate>(), array.new<Block>(), array.new<StructLine>(), na, na, na, na, 0, 0, 0)

// Execute
mgr.process().. 
Open trades using 5% of account deposit.
Open trades at every CHOCH and BOS base on trend direction.
Close half of opened trades at every BOS and open new trade with 5% of account size.
Close all trades if an opposite CHOCH is given and open new trades in the direction of the trend and applying the same open and closing roles.
Lock profit with trailing stop after every new BOS is given. Move all trailing stop to every previous BOS.

応答済み

1
開発者 1
評価
(15)
プロジェクト
19
16%
仲裁
5
40% / 40%
期限切れ
0
仕事中
2
開発者 2
評価
プロジェクト
0
0%
仲裁
0
期限切れ
0
3
開発者 3
評価
プロジェクト
0
0%
仲裁
0
期限切れ
0
4
開発者 4
評価
(12)
プロジェクト
15
33%
仲裁
5
40% / 20%
期限切れ
1
7%
仕事中
パブリッシュした人: 5 articles, 34 codes
5
開発者 5
評価
(3)
プロジェクト
3
33%
仲裁
0
期限切れ
0
6
開発者 6
評価
(548)
プロジェクト
833
62%
仲裁
33
27% / 45%
期限切れ
24
3%
パブリッシュした人: 1 code
7
開発者 7
評価
(28)
プロジェクト
34
35%
仲裁
0
期限切れ
2
6%
8
開発者 8
評価
プロジェクト
0
0%
仲裁
0
期限切れ
0
9
開発者 9
評価
プロジェクト
0
0%
仲裁
0
期限切れ
0
10
開発者 10
評価
プロジェクト
0
0%
仲裁
0
期限切れ
0
11
開発者 11
評価
プロジェクト
0
0%
仲裁
0
期限切れ
0
12
開発者 12
評価
(5)
プロジェクト
6
67%
仲裁
2
0% / 50%
期限切れ
0
類似した注文
*Need an MQL5 EA for MT5 to trade gold and forex automatically. Must include Stop Loss, Take Profit, and basic risk management. Budget is $30 to $50. Looking for clean, stable code that works on VPS.*
MT5 EA for XAUUSDm - Trend Grid with EMA+ATR+ADX (Non-Martingale) 【Strategy Summary】 - EMA(50) on H1 judges trend direction. 2 H1 closes to confirm crossover. - ADX(14) below 20 stops new orders. Existing orders still managed. - Parallel mode: 5 stop orders placed at once. Spacing = ATR(14)×1.5 (300-600 pts). - TP: 1 new order at furthest price + spacing. SL: no replacement. - Fixed SL 300pts. No fixed TP. Trailing
Description: I need an experienced MQL5 developer to build a professional MT5 Expert Advisor for XAU/USD based on my trading strategy. I require the full .mq5 source code and the compiled file. Trading Logic: Timeframes: H4 to determine overall direction, H1 for supply and demand zones, M15 for trade entries. Buy conditions: H4 trend is bullish, price reaches a valid H1 demand zone, liquidity sweep occurs below the
Standby Description . Prop Firm Environment . ( Monitor Execution and Handling Environment Changes as Required ) . Technical Issues . Delete extra lines of code (Clean Code , Folder) . Asset related translation , no need for Logic Alteration
MultiPair_PriceAction 30 - 200 USD
OANDA market watch clock and symbols (.sim) Multipair able so i can choose at least 6 of those more volatile forex pairs. Price Action setups instead of relay on lag indicators. But rsi for confirmation. Spread protection, position management, magic number editor, hours trading. Volatility protection Trailing Stop, Stop losses, take profit. Percentage and ATR scale instead of dollars or lot sizes. Funds management
Looking for an MT5 Expert Advisor developer with: Minimum 1 year of verified activity on the MetaTrader Market Positive, real user reviews Ability to build EAs without Bollinger Bands Fully configurable parameters (risk, filters, SL/TP, trading hours) Free test version available before any payment Clear communication and ongoing support If you meet these requirements, please send your MQL5 profile or portfolio
I want to create a EA based on an existing EA. I want to create a COPY of same EA. This is a Grid based EA and do averaging when market goes against it. While doing Averaging it keeps on taking trades and booking profits
Akram boushaba 30 - 500 USD
مرحبا كيف حالكم انا اكرم مهتم بالتداول احاول ان اصمم برنامج روبوت قادر على التداول من تلقاء نفسه من يمكنه ان يساعدني او يعلمني كيف استطيع فهل ذلك وسأكون ممتناً له وشكرا لكم
Looking for someone who is experienced in creating MT5 EA from scratch to go over 7 public youtube videos (total duration about 5 hours) and extract the strategy code taught in the videos to make a MT5 .mq5 source code file. Full code is explained in the 7 videos so it's just a matter of going over the videos and extracting the relevant parts that relate to the source code and compiling it into a working EA. The
EA Crafter 500+ USD
Act as a professional Quantitative Developer and Risk Manager. I want to build a systematic trading strategy rulebook that prioritizes capital preservation and statistical edge over raw performance. Please generate a structured trading strategy using the following framework: 1. ASSET CLASS & TIMEFRAME: - Asset: [e.g., Apple (AAPL), Bitcoin (BTC), or EUR/USD] - Timeframe: [e.g., 5-minute, 1-hour, Daily] 2. CORE

プロジェクト情報

予算
30 - 100 USD
締め切り
最低 1 最高 5 日

依頼者

出された注文1
裁定取引数0