Помогите разобраться в чём логическая ошибка с буферными массивами индикатора по отдельности всё работает, как объединяю, работает только зигзаг. Всё что отмечено жёлтым, относится к зигзагу.
Вот код:
Я, обычно, в подобных ситуациях, делаю "пошагово" и становится ясно на каких изменениях "ломается".
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
//+------------------------------------------------------------------+//| Скрипт для навигации по сделкам в тестере стратегий |//+------------------------------------------------------------------+#property strict#include <stdlib.mqh> // Библиотека для удобства работы с объектамиint currentTradeIndex = 0; // Индекс текущей сделкиdatetime tradeTimes[]; // Массив времени открытия сделок//+------------------------------------------------------------------+//| Инициализация скрипта |//+------------------------------------------------------------------+voidOnStart()
{
GetTradeHistory(); // Собираем историю сделок
CreateButtons(); // Создаем кнопки на графике
}
//+------------------------------------------------------------------+//| Получаем историю сделок |//+------------------------------------------------------------------+void GetTradeHistory()
{
int total = OrdersHistoryTotal();
ArrayResize(tradeTimes, total);
for (int i = 0; i < total; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
tradeTimes[i] = OrderOpenTime();
}
}
}
//+------------------------------------------------------------------+//| Создание кнопок |//+------------------------------------------------------------------+void CreateButtons()
{
CreateButton("PrevTrade", "⬅ Пред. сделка", 10, 30);
CreateButton("NextTrade", "След. сделка ➡", 150, 30);
}
// Функция для создания кнопкиvoid CreateButton(string name, string text, int x, int y)
{
ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XSIZE, 120);
ObjectSetInteger(0, name, OBJPROP_YSIZE, 25);
ObjectSetInteger(0, name, OBJPROP_CORNER, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetString(0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrGold);
}
//+------------------------------------------------------------------+//| Обработка нажатий кнопок |//+------------------------------------------------------------------+voidOnChartEvent(constint id, constlong &lparam, constdouble &dparam, conststring &sparam)
{
if (id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == "PrevTrade") MoveToTrade(-1);
if (sparam == "NextTrade") MoveToTrade(1);
}
}
//+------------------------------------------------------------------+//| Перемещение графика к сделке |//+------------------------------------------------------------------+void MoveToTrade(int step)
{
int totalTrades = ArraySize(tradeTimes);
if (totalTrades == 0) return;
currentTradeIndex += step;
if (currentTradeIndex < 0) currentTradeIndex = 0;
if (currentTradeIndex >= totalTrades) currentTradeIndex = totalTrades - 1;
datetime moveToTime = tradeTimes[currentTradeIndex];
// Преобразуем время в индекс бараint barIndex = iBarShift(Symbol(), 0, moveToTime, false);
// Проверяем, что бар найденif (barIndex != -1)
{
// Перемещаем график на найденный барChartSetInteger(0, CHART_FIRST_VISIBLE_BAR, barIndex);
// Добавляем команду для обновления графика
RefreshRates(); // Обновляем данные на графике
}
else
{
Print("Ошибка: не найден бар для времени ", TimeToString(moveToTime));
}
}
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Вы делаете скрипт. Он создал кнопки и удалился с графика т.к за время его выполнения вы не совершили никаких событий по нажатию объектов. Для того, чтобы он работал по вашей логике, используйте индикаторы, а не скрипты
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Для перемещения графика используйте ChartNavigate()
Вы делаете скрипт. Он создал кнопки и удалился с графика т.к за время его выполнения вы не совершили никаких событий по нажатию объектов. Для того, чтобы он работал по вашей логике, используйте индикаторы, а не скрипты
Большое спасибо за подсказку- попробую через индикатор это организовать.
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Всем добрый день. Продолжаю пробовать реализовать код для перемещения графика к местам открытия ордеров после теста в тестере. Переписал скрипт в индикатор, вот его код.
//+------------------------------------------------------------------+//| Индикатор для навигации по сделкам в тестере стратегий |//+------------------------------------------------------------------+#property strict#property indicator_chart_window#include <stdlib.mqh> // Библиотека для удобства работы с объектамиint currentTradeIndex = 0; // Индекс текущей сделкиdatetime tradeTimes[]; // Массив времени открытия сделок//+------------------------------------------------------------------+//| Инициализация индикатора |//+------------------------------------------------------------------+intOnInit()
{
GetTradeHistory(); // Собираем историю сделок
CreateButtons(); // Создаем кнопки на графикеEventSetTimer(1); // Устанавливаем таймер на 1 секундуreturnINIT_SUCCEEDED;
}
//+------------------------------------------------------------------+//| Деинициализация индикатора |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
EventKillTimer(); // Останавливаем таймер при удалении индикатора
DeleteButtons(); // Удаляем кнопки
}
//+------------------------------------------------------------------+//| Получаем историю сделок |//+------------------------------------------------------------------+void GetTradeHistory()
{
int total = OrdersHistoryTotal();
ArrayResize(tradeTimes, total);
for (int i = 0; i < total; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
tradeTimes[i] = OrderOpenTime();
}
}
}
//+------------------------------------------------------------------+//| Создание кнопок |//+------------------------------------------------------------------+void CreateButtons()
{
CreateButton("PrevTrade", "⬅ Пред. сделка", 10, 30);
CreateButton("NextTrade", "След. сделка ➡", 150, 30);
}
//+------------------------------------------------------------------+//| Функция для создания кнопки |//+------------------------------------------------------------------+void CreateButton(string name, string text, int x, int y)
{
if (!ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0))
return;
ObjectSetInteger(0, name, OBJPROP_XSIZE, 120);
ObjectSetInteger(0, name, OBJPROP_YSIZE, 25);
ObjectSetInteger(0, name, OBJPROP_CORNER, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetString(0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrGold);
}
//+------------------------------------------------------------------+//| Удаление кнопок |//+------------------------------------------------------------------+void DeleteButtons()
{
ObjectDelete("PrevTrade");
ObjectDelete("NextTrade");
}
//+------------------------------------------------------------------+//| Обработка нажатий кнопок |//+------------------------------------------------------------------+voidOnChartEvent(constint id, constlong &lparam, constdouble &dparam, conststring &sparam)
{
if (id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == "PrevTrade") MoveToTrade(-1);
if (sparam == "NextTrade") MoveToTrade(1);
}
}
//+------------------------------------------------------------------+//| Перемещение графика к сделке |//+------------------------------------------------------------------+void MoveToTrade(int step)
{
int totalTrades = ArraySize(tradeTimes);
if (totalTrades == 0) return;
currentTradeIndex += step;
if (currentTradeIndex < 0) currentTradeIndex = 0;
if (currentTradeIndex >= totalTrades) currentTradeIndex = totalTrades - 1;
datetime moveToTime = tradeTimes[currentTradeIndex];
// Преобразуем время в индекс бараint barIndex = iBarShift(Symbol(), 0, moveToTime, false);
// Проверяем, что бар найденif (barIndex != -1)
{
// Перемещаем график на найденный барChartSetInteger(0, CHART_FIRST_VISIBLE_BAR, barIndex);
RefreshRates(); // Обновляем данные на графике
}
else
{
Print("Ошибка: не найден бар для времени ", TimeToString(moveToTime));
}
}
//+------------------------------------------------------------------+//| Таймер (для устойчивости работы) |//+------------------------------------------------------------------+voidOnTimer()
{
// Здесь можно добавить доп. функционал
}
//+------------------------------------------------------------------+//| Обязательная функция для индикатора |//+------------------------------------------------------------------+intOnCalculate(constint rates_total, // КОЛИЧЕСТВО БАРОВconstint prev_calculated, // ПРЕДЫДУЩИЕ РАСЧЁТЫconstdatetime &time[], // МАССИВ ВРЕМЕНИconstdouble &open[], // МАССИВ ЦЕН ОТКРЫТИЯconstdouble &high[], // МАССИВ МАКСИМАЛЬНЫХ ЦЕНconstdouble &low[], // МАССИВ МИНИМАЛЬНЫХ ЦЕНconstdouble &close[], // МАССИВ ЦЕН ЗАКРЫТИЯconstlong &tick_volume[], // ОБЪЁМЫconstlong &volume[], // ОБЪЁМЫconstint &spread[]) // СПРЭДЫ
{
return rates_total; // Просто возвращаем количество баров
}
Кнопки появились, но по их нажатию нужное место на графике не показывается.
Что я делаю не так и как поправить код, чтобы при нажатии кнопок мне на графике отображалось место открытия ордеров от которого рисуется трендовая линия до закрытия ордера?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Помогите разобраться в чём логическая ошибка с буферными массивами индикатора по отдельности всё работает, как объединяю, работает только зигзаг. Всё что отмечено жёлтым, относится к зигзагу.
Вот код:
Я, обычно, в подобных ситуациях, делаю "пошагово" и становится ясно на каких изменениях "ломается".
не отслеживал в каком конкретно билде, но есть ощущение что
СМОГЛИ ! Поломали "Moving Average"
он теперь весь инкрементный (то есть и SMA тоже инкрементно рассчитывается) это хорошо, НО не учитываются особенности EMPTY_VALUE, а это ппц.
Точнее EMPTY_VALUE считается как обычное число и спокойно суммируется. В результате - переполнения.
По крайней мере при рассчёте от другого индикатора так
PS/ наверное это в "Ошибки,баги" надо было запостить..чуть-чуть темой промахнулся, перенесите
PLOT_DRAW_BEGIN не указан в Abs, скорее всего. Из-за этого MA вычисляется и на пустых значениях тоже.
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Вы делаете скрипт. Он создал кнопки и удалился с графика т.к за время его выполнения вы не совершили никаких событий по нажатию объектов. Для того, чтобы он работал по вашей логике, используйте индикаторы, а не скрипты
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Для перемещения графика используйте ChartNavigate()
Вы делаете скрипт. Он создал кнопки и удалился с графика т.к за время его выполнения вы не совершили никаких событий по нажатию объектов. Для того, чтобы он работал по вашей логике, используйте индикаторы, а не скрипты
Большое спасибо за подсказку- попробую через индикатор это организовать.
Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?
Кнопки появились, но по их нажатию нужное место на графике не показывается.
Что я делаю не так и как поправить код, чтобы при нажатии кнопок мне на графике отображалось место открытия ордеров от которого рисуется трендовая линия до закрытия ордера?
Я целую статью на эту тему писал тут.
Что я делаю не так
OrdersHistoryTotal() - учитывает ордера тестера, только во время теста.
Для перемещения по по сделкам после теста надо использовать объекты