indiquer bougie contraire aux volumes et ou se trouva la plupart des achats et v

Forums ProRealTime forum Français Support ProBuilder indiquer bougie contraire aux volumes et ou se trouva la plupart des achats et v

Viewing 6 posts - 1 through 6 (of 6 total)
  • #241338

    Bonjour, j’ai le cumulative delta avec le volume achat et vente sous forme d’histogramme séparé. J’aimerais un indicateur qui me montre les bougies vertes dont le volume de vente et supérieur au volume d’achat et les bougies rouges dont le volume d’achats sont supérieur au volume de ventes.

    J’ai également l’indicateur cluster mais j’aimerais avoir une indication automatique en couleur par exemple sur les niveaux de prix qui possèdent une certaine quantité de volume d’achat mais également de vente (ne pas confondre le pourcentage de volume total car je souhaite séparer l’information). En effet plus il y a de volume sur les mèches plus il y a une résistance et support donc gros pièges. Je vous joints une image j’ai entouré ce qui me semble pertinent que l’indicateur montre.

    Cordialement.

    #241348

    Bonjour. Malheureusement nous n'avons pas la possibilité de pouvoir encoder le volume bid&ask. Il n'est pas différencié ce qui rend votre demande impossible. Vous pourriez être intéressé par ces articles/post :

    #241355

    Bonjour, j’ai le cumulative delta avec le volume achat et vente sous forme d’histogramme séparé. J’aimerais un indicateur qui me montre les bougies vertes dont le volume de vente et supérieur au volume d’achat et les bougies rouges dont le volume d’achats sont supérieur au volume de ventes.

    Le Volume est forcément à somme nulle, on ne peut Acheter 10 que si 10 sont à Vendre ! Il n’y aura donc jamais plus de volume Acheteurs que de volume Vendeurs et inversement… Lorsque l’on s’intéresse au CVD, on recherche 2 informations. La première est-ce que le flux du Volume suit l’évolution du Cours(Prix), la deuxième y a t-il une divergence entre l’évolution du Volume(CVD) et le Cours(Prix), si oui on va apprécier deux types de divergences. 1-Absorption = Les Acteurs agressifs(Ordres au Marché) n’arrive plus à pousser les cours, ils sont systématiquement absorbés par les Acteurs passifs(Ordres Limites). 2-Epuisement = La pression exercée par les Acteurs agressifs sur les Acteurs passifs, diminue… Dans les deux cas cela peut signifier un retournement du cours dans la direction opposée!

    #241357

    Sauf qu’on observe ce que je dis les volumes achat et vente se contredise par rapport à la couleur final de la bougie car les ordres passifs ne sont pas enregistrer sur le cluster. Et lorsque il y a bcp de volume dans le sens de la tendance mais au bout de mèche ça pue…

    #241392

    Voici encore un screen qui illustre mes propos….

    #241396

    J’ai trouvé ce code sur trading view mais il faudrait que ce soit validé avec prorealtime…

     

    // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

    // © nico-von

    //@version=5

    indicator(“OrderFlow Absorption Indicator”, shorttitle = “Absorption”, overlay = true,

    max_labels_count = 500, max_boxes_count = 500)

    //<constants>

    const int UP_DIRECTION = 1

    const int NT_DIRECTION = 0

    const int DOWN_DIRECTION = -1

    const string PHDT_TT = “Plot historical absorption occurrences. Using historical data alone cannot accurately replicate real-time absorption, so detections may differ.”

    const string HDT_TT = “Timeframe for calculating historical absorption: A smaller timeframe results in more accurate detections but in a slower indicator, potentially hindering real-time absorption detection.”

    const string TL_TT = “Limit detections to consider only traded volume that is greater than or equal the selected volume filter value within the chosen time limit, in seconds. Real-time only.”

    const string VLMT_TT = “Traded volume greater than or equal this value will be marked as absorbed. The larger value, the fewer detections.”

    const string VLMT_AUTO_TT = “Automatically set the minimum size according to the standard deviation of traded volume for the last selected minutes.”

    const string HIST_GP = “Historical/ Backfill Settings”

    const string MINS_ERROR = “SD Interval must be greater than 0”

    const string DATA_GP = “Tick Settings”

    const string AB_GP = “Time Limit Settings”

    const string AVLMT_GP = “Volume Filter Settings”

    const string OTHER_GP = “Other Settings”

    const string CHAR_TO_USE = “×”

    const string CHAR_TO_USE_POINTER = “■”

    const string STYLE_GROUP = “Style Settings”

    const string IN_DELTA = “Delta Colour Settings”

    const int DEF_SD_MULT = 10

    //<input>

    bool useLtfInput = input.bool(false, “Plot Historical Absorption”, tooltip = PHDT_TT,

    confirm = true, group = HIST_GP, display = display.none)

    string ltfInput = input.timeframe(“1”, “Historical Data Timeframe”, tooltip = HDT_TT,

    confirm = true, group = HIST_GP, display = display.none)

    float tickSizeInput = input.float(5, “Desired Tick Size”, confirm = true, group = DATA_GP)

    bool enableTimeLimitInput = input.bool(false, “Enable time limit (realtime only)”, confirm = true,

    tooltip = TL_TT, group = AB_GP, display = display.none)

    float timeLimitInput = input.float(0.5, “Time limit (seconds)”, confirm = true, group = AB_GP,

    display = display.none)

    float volumeLimitInput = input.float(5, “Volume Filter”, tooltip = VLMT_TT, confirm = true,

    group = AVLMT_GP, display = display.none)

    bool autoVolumeLimitInput = input.bool(true, “Use Auto Mode”, tooltip = VLMT_AUTO_TT, confirm = true,

    group = AVLMT_GP, display = display.none)

    int autoVolMinsInput = input.int(30, “SD Interval (minutes)”, confirm = true, group = AVLMT_GP,

    display = display.none)

    int autoSdMultInput = input.int(DEF_SD_MULT, “SD Multiplier”, confirm = true, group = AVLMT_GP,

    display = display.none)

    bool deltaModeInput = input.bool(true, “Enable Delta Mode”, confirm = true, group = OTHER_GP,

    display = display.none)

    color neutralColourInput = input.color(color.yellow, “Regular”, group = STYLE_GROUP,

    display = display.none)

    color askColourInput = input.color(color.red, “Ask Delta”, group = STYLE_GROUP, inline = IN_DELTA,

    display = display.none)

    color bidColourInput = input.color(color.green, “Bid Delta”, group = STYLE_GROUP, inline = IN_DELTA,

    display = display.none)

    //<interface>

    type absorptionObj

    varip float movePrice

    varip float nextPriceInQueue

    varip int moveDirection

    varip float volumeAbsorbed

    varip float volumeAccumulator

    varip bool absorbed

    varip float absorbingPrice

    varip bool isBuy

    varip int startingTime

    varip int nextTimeInQueue

    type absorptionDisplayObj

    varip float sellVolAbsorbed

    varip float buyVolAbsorbed

    varip float deltaValue

    varip bool isrealtime

    varip float volumeLimit

    //<function>

    calculateTick(float price, float tickSize) =>

    float multiplier = math.round(price / tickSize)

    multiplier * tickSize

    convertSecstoMs(float seconds) =>

    math.round(seconds * 1000)

    checkAbsorption(int currDirection, int moveDirection, bool metTimeLimit = true) =>

    absorbed = (currDirection != moveDirection) and metTimeLimit

    absorbed

    getDirection(float movePrice, float nextPrice, int upDirection, int ntDirection, int downDirection) =>

    if movePrice == nextPrice

    ntDirection

    else if movePrice > nextPrice

    downDirection

    else if movePrice < nextPrice

    upDirection

    getVolumeChange(float newVolume, float prevVolume) =>

    newVolume – prevVolume

    checkPriceChange(float currPrice, float newPrice) =>

    currPrice != newPrice

    updateAbsorptionObj(absorptionObj object, float priceTick, float volumeChange,

    float volumeLimit, int timeNow = na, int timeLimit = na) =>

    bool priceChanged = checkPriceChange(object.movePrice, priceTick)

    int currDirection = getDirection(object.movePrice, priceTick, UP_DIRECTION, NT_DIRECTION, DOWN_DIRECTION)

    object.absorbingPrice := na

    object.absorbed := false

    if na(object.movePrice)

    object.movePrice := priceTick

    if na(object.startingTime) and not na(timeNow)

    object.startingTime := timeNow

    if priceChanged and object.moveDirection == NT_DIRECTION

    object.moveDirection := currDirection

    object.nextPriceInQueue := priceTick

    object.nextTimeInQueue := timeNow

    if priceChanged and object.moveDirection != NT_DIRECTION

    bool metTimeLimit = true

    if not na(timeLimit) and not na(timeNow)

    int expectedTime = object.startingTime + timeLimit

    metTimeLimit := timeNow <= expectedTime

    bool absorbed = checkAbsorption(currDirection, object.moveDirection, metTimeLimit)

    object.absorbingPrice := object.movePrice

    object.absorbed := absorbed and (object.volumeAccumulator >= volumeLimit)

    object.volumeAbsorbed := object.absorbed ? object.volumeAccumulator : 0

    object.isBuy := object.moveDirection == DOWN_DIRECTION

    object.startingTime := object.nextTimeInQueue

    object.nextTimeInQueue := timeNow

    object.movePrice := object.nextPriceInQueue

    object.nextPriceInQueue := priceTick

    object.moveDirection := currDirection

    object.volumeAccumulator := volumeChange

    else if not priceChanged

    object.volumeAccumulator += volumeChange

    object.isBuy := na

    // return

    object

    includeToAbsorbingMap(map<float, absorptionDisplayObj> absorbingPrices,

    absorptionObj mainObject, bool isDelta, float volumeLimit, bool isRealTime = false) =>

    if mainObject.absorbed

    absorptionDisplayObj absorptionDisplay = absorbingPrices.keys().includes(mainObject.absorbingPrice) ?

    absorbingPrices.get(mainObject.absorbingPrice) :

    absorptionDisplayObj.new(0, 0)

    if mainObject.isBuy

    absorptionDisplay.buyVolAbsorbed += mainObject.volumeAbsorbed

    else

    absorptionDisplay.sellVolAbsorbed += mainObject.volumeAbsorbed

    absorptionDisplay.deltaValue := absorptionDisplay.buyVolAbsorbed – absorptionDisplay.sellVolAbsorbed

    absorptionDisplay.volumeLimit := volumeLimit

    absorptionDisplay.isrealtime := isRealTime

    if isDelta and math.abs(absorptionDisplay.deltaValue) < absorptionDisplay.volumeLimit

    absorbingPrices.remove(mainObject.absorbingPrice)

    else

    absorbingPrices.put(mainObject.absorbingPrice, absorptionDisplay)

    absorbingPrices

    getHistoricalData() =>

    [calculateTick(close, tickSizeInput), volume]

    getAutoVolumeLimit(int len) =>

    ta.stdev(volume, len)

    //<calculation>

    var simple string ltfDisabler = timeframe.from_seconds(timeframe.in_seconds(timeframe.period) * 2)

    float closeTick = calculateTick(close, tickSizeInput)

    var int timeLimit = enableTimeLimitInput ? convertSecstoMs(timeLimitInput) : na

    varip absorptionObj mainObject = absorptionObj.new(na, na, NT_DIRECTION, 0, 0, na, na, na)

    varip float prevVolume = volume

    varip bool isBarConfirmed = false

    varip map<float, absorptionDisplayObj> absorbingPrices = map.new<float, absorptionDisplayObj>()

    // reset

    if isBarConfirmed and barstate.isnew

    isBarConfirmed := false

    absorbingPrices := map.new<float, absorptionDisplayObj>()

    float volumeChange = getVolumeChange(volume, prevVolume)

    // historical

    [priceTick, volChangeLTF] = request.security_lower_tf(syminfo.tickerid, useLtfInput ? ltfInput : ltfDisabler,

    getHistoricalData(), true, ignore_invalid_timeframe = true)

    // volume limit (filter)

    if autoVolMinsInput <= 0

    log.error(MINS_ERROR)

    autoVolumeLimitVal = request.security(syminfo.tickerid, “1”, getAutoVolumeLimit(autoVolMinsInput)

    , ignore_invalid_symbol = true, calc_bars_count = autoVolMinsInput)

    float volumeLimit = if autoVolumeLimitInput and not na(autoVolumeLimitVal)

    autoVolumeLimitVal * autoSdMultInput

    else

    volumeLimitInput

    priceTick := barstate.ishistory ? priceTick : na

    if not na(priceTick)

    for i = 0 to priceTick.size() – 1

    if priceTick.size() == 0

    break

    mainObject := updateAbsorptionObj(mainObject, priceTick.get(i), volChangeLTF.get(i), volumeLimit)

    absorbingPrices := includeToAbsorbingMap(absorbingPrices, mainObject, deltaModeInput, volumeLimit)

    // live

    if barstate.isrealtime

    mainObject := updateAbsorptionObj(mainObject, closeTick, volumeChange, volumeLimit, timenow, timeLimit)

    absorbingPrices := includeToAbsorbingMap(absorbingPrices, mainObject, deltaModeInput, volumeLimit, true)

    // prep values for next bar

    prevVolume := volume

    if barstate.isconfirmed

    prevVolume := 0

    isBarConfirmed := true

    // <display>

    for key in absorbingPrices.keys()

    chart.point xy = chart.point.new(time, na, key)

    absorptionDisplayObj absorptionDisplay = absorbingPrices.get(key)

    string labelText = deltaModeInput ?

    str.format(“{0} {1}”, CHAR_TO_USE_POINTER, absorptionDisplay.deltaValue) :

    str.format(“{0} ▲ {1} {2} ▼ {3}”, CHAR_TO_USE_POINTER,

    str.tostring(absorptionDisplay.buyVolAbsorbed, “#.###”),

    CHAR_TO_USE, str.tostring(absorptionDisplay.sellVolAbsorbed, “#.###”))

    color textColour = deltaModeInput ?

    absorptionDisplay.deltaValue >= 0 ? bidColourInput : askColourInput :

    neutralColourInput

    string tooltip = str.format(“{0} \nVol Absorbed by Bids: {1} \nVol Absorbed by Asks: {2} \nVol Filter Value: {3} \nRealtime Data: {4}”,

    key, absorptionDisplay.buyVolAbsorbed, absorptionDisplay.sellVolAbsorbed,

    absorptionDisplay.volumeLimit, absorptionDisplay.isrealtime ? “Yes” : “No”)

    label.new(xy, labelText, xloc = xloc.bar_time, yloc = yloc.price, color = color.new(color.white, 100),

    style = label.style_label_left, textcolor = textColour, tooltip = tooltip)

    // recommendations table

    string recommendedTickSize = str.format(“Recommended Tick Size: {0}”,

    str.tostring(request.security(syminfo.tickerid, “1”, ta.atr(14)), “#.###”))

    string recommendedFilterArg = not na(autoVolumeLimitVal) ?

    str.tostring(autoVolumeLimitVal * DEF_SD_MULT, “#.###”) : “Cannot be determined.”

    string recommendedFilterSize = str.format(“Recommended Volume Filter: {0}”, recommendedFilterArg)

    table recommendationTable = table.new(position.top_right, 1, 2, bgcolor = color.new(color.black,50))

    recommendationTable.cell(0, 0, recommendedTickSize, text_color = color.white, text_halign = text.align_left)

    recommendationTable.cell(0, 1, recommendedFilterSize, text_color = color.white, text_halign = text.align_left)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Viewing 6 posts - 1 through 6 (of 6 total)

Create your free account now and post your request to benefit from the help of the community
Register or Login