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