Metatrader 5 EA: Решение графического мерцания объектов при динамическом обновлении зон сопротивления/поддержки в стратеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Metatrader 5 EA: Решение графического мерцания объектов при динамическом обновлении зон сопротивления/поддержки в страте

Сообщение Anonymous »

Я разрабатываю сложного консультанта эксперта по торговле. My EA использует эти зоны для определения потенциальных возможностей для отката на рынках Forex. Тем не менее, я испытываю значительное визуальное сглаживание /мерцание при обновлении этих зон, даже несмотря на то, что логика технического обнаружения работает правильно. Это происходит, даже когда я внедряю логику для ограничения обновлений в зависимости от интервалов времени или значительных изменений цен. Мерцание затрудняет использование EA для фактического торгового анализа, поскольку он визуально отвлекает и влияет на общую удобство использования.// From OnTick() function
datetime currentTime = TimeCurrent();

// Track price changes to determine when to update zones
static double lastResistancePrice = 0;
static datetime lastZoneUpdateTime = 0;

// Find current highest price in recent price action
double currentHighest = 0;
for(int i = 0; i < 20; i++) {
double high = iHigh(_Symbol, inpTimeframe, i);
if(high > currentHighest) currentHighest = high;
}

// Limit updates to when price moves significantly (0.1%) or 15+ seconds pass
bool priceChanged = (lastResistancePrice > 0) ?
(MathAbs(currentHighest - lastResistancePrice) / lastResistancePrice > 0.001) :
true; // First run always updates
bool timeForUpdate = currentTime - lastZoneUpdateTime >= 15;

// Only update when not in structure detection process and conditions are met
if((!bullishstructureDetectionInProgress) && (ObjectFind(0, resLine) >= 0) && (priceChanged || timeForUpdate)) {
ObjectDelete(0, resLine);
string labelName = resLine + "_label";
if(ObjectFind(0, labelName) >= 0) {
ObjectDelete(0, labelName);
}
lastResistancePrice = currentHighest;
lastZoneUpdateTime = currentTime;
}
< /code>
  • Затем в моей функции обнаружения сопротивления я идентифицирую новые зоны и нарисую их: < /li>
    < /ol>
    void DetectResistanceZone() {
    // Check if we should process this tick
    int currBars = iBars(_Symbol, inpTimeframe);
    static int prevBars = currBars;
    if(prevBars == currBars) return;
    prevBars = currBars;

    // Skip if in structure detection mode (when analyzing a potential trade setup)
    if(bullishstructureDetectionInProgress) {
    Print("Structure detection in progress - Resistance zone locked");
    return;
    }

    // Analyze price action to find significant swing high
    int visibleBars = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
    bool zoneDetected = false;

    // Get recent price data
    double highPrices[];
    ArrayResize(highPrices, visibleBars);
    for(int i = 0; i < visibleBars; i++) {
    highPrices = iHigh(_Symbol, inpTimeframe, i);
    }

    // Find significant swing high
    double bestHighPrice = 0;
    int bestHighBar = 0;
    datetime bestHighTime = 0;

    // Search for swing highs in recent bars
    int barsToAnalyze = MathMin(50, visibleBars);
    for(int i = 5; i < barsToAnalyze; i++) {
    double currentHigh = highPrices;

    // Check if this is a swing high
    bool isSwingHigh = true;
    for(int j = 1; j = 0 && highPrices[i-j] > currentHigh) {
    isSwingHigh = false;
    break;
    }
    if(i+j < barsToAnalyze && highPrices[i+j] > currentHigh) {
    isSwingHigh = false;
    break;
    }
    }

    if(isSwingHigh) {
    if(bestHighPrice == 0 || currentHigh > bestHighPrice * 1.005) {
    bestHighPrice = currentHigh;
    bestHighBar = i;
    bestHighTime = iTime(_Symbol, inpTimeframe, i);
    zoneDetected = true;
    }
    }
    }

    // Draw the zone if detected
    if(zoneDetected) {
    // Store and draw resistance zone
    resistanceLevels[0] = bestHighPrice;
    resistanceLevels[1] = bestHighPrice;
    draw_resistance_level(bestHighPrice, colorRes, 5);
    draw_resistance_point(bestHighPrice, bestHighTime, 217, 1, colorRes, 90);
    validResistanceZone = true;
    }
    }
    < /code>

    И вот функция, которая фактически рисует зону сопротивления: < /li>
    < /ol>
    void draw_resistance_level(double price, color clr, int width) {
    // Calculate zone boundaries
    datetime timeLeft = iTime(_Symbol, inpTimeframe, 0) - PeriodSeconds(inpTimeframe) * 300;
    datetime timeRight = iTime(_Symbol, inpTimeframe, 0) + PeriodSeconds(inpTimeframe) * 50;

    double upperPrice = price + 0.0001;
    double lowerPrice = price - 0.0001;

    // Create rectangle for zone
    bool created = ObjectCreate(0, resLine, OBJ_RECTANGLE, 0, timeLeft, lowerPrice, timeRight, upperPrice);
    ObjectSetInteger(0, resLine, OBJPROP_COLOR, clr);
    ObjectSetInteger(0, resLine, OBJPROP_WIDTH, width);
    ObjectSetInteger(0, resLine, OBJPROP_STYLE, STYLE_SOLID);
    ObjectSetInteger(0, resLine, OBJPROP_FILL, true);
    ObjectSetInteger(0, resLine, OBJPROP_BACK, true);
    ObjectSetInteger(0, resLine, OBJPROP_HIDDEN, false);
    ObjectSetInteger(0, resLine, OBJPROP_SELECTABLE, true);

    // Add text label
    string labelName = resLine + "_label";
    ObjectCreate(0, labelName, OBJ_TEXT, 0, timeRight, price);
    ObjectSetString(0, labelName, OBJPROP_TEXT, "R-ZONE");
    ObjectSetInteger(0, labelName, OBJPROP_COLOR, clr);
    ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 10);
    ObjectSetInteger(0, labelName, OBJPROP_BACK, false);

    ChartRedraw(0);
    }
    < /code>
    Что я попробовал < /strong>: < /p>

    На основе времени на основе времени: ограничение обновлений, которые встречаются только каждые x секунд (проверенные значения от 5 до 30 секунд) < /li>
    Обнаружение цены>
    < /li> < /li> Подходы: Использование критериев как времени, так и цены вместе < /li>
    Селективное перераспределение: только удаление и перераспределение объектов при необходимости, а не на каждом клещете < /li>
    Различные типы объектов: тестируют различные типы объектов MT5 (obj_rectangle, obj_rectangle_label, и т. Д.) Chartredraw (0) Размещение и частота
  • Принудительное обновление объекта: использование объекта metsetInteger () с различными изменениями свойства, чтобы избежать удаления/отдыха

Независимо от того, что я пытаюсь, я все еще испытываю визуальное мерцание, которое затрудняет использование EA для анализа торговли. Зоны правильно идентифицируют правильные уровни цен, но постоянно мигают или мерцают. < /P>
Вопросы < /p>
  • Какова наилучшая практика для обновления графических объектов в MT5, чтобы предотвратить мерцание? Конкретные методы оптимизации MT5 для управления объектами, которые часто обновляются? Это последнее препятствие в разработке моей системы торговли откат.


Подробнее здесь: https://stackoverflow.com/questions/795 ... updating-r
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»