Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2580

 
Igor Nagorniuk #:

Помогите разобраться в чём логическая ошибка с буферными массивами индикатора по отдельности всё работает, как объединяю, работает только зигзаг. Всё что отмечено жёлтым, относится к зигзагу.

Вот код:

Я, обычно, в подобных ситуациях, делаю "пошагово" и становится ясно на каких изменениях "ломается".

 
Maxim Kuznetsov #:

не отслеживал в каком конкретно билде, но есть ощущение что 

СМОГЛИ ! Поломали "Moving Average"

он теперь весь инкрементный (то есть и SMA тоже инкрементно рассчитывается) это хорошо, НО не учитываются особенности EMPTY_VALUE, а это ппц.

Точнее EMPTY_VALUE считается как обычное число и спокойно суммируется. В результате - переполнения. 

По крайней мере при рассчёте от другого индикатора так

PS/ наверное это в "Ошибки,баги" надо было запостить..чуть-чуть темой промахнулся, перенесите 

PLOT_DRAW_BEGIN не указан в Abs, скорее всего. Из-за этого MA вычисляется и на пустых значениях тоже. 

 

Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.

//+------------------------------------------------------------------+
//| Скрипт для навигации по сделкам в тестере стратегий             |
//+------------------------------------------------------------------+
#property strict

#include <stdlib.mqh> // Библиотека для удобства работы с объектами

int currentTradeIndex = 0; // Индекс текущей сделки
datetime tradeTimes[];      // Массив времени открытия сделок

//+------------------------------------------------------------------+
//| Инициализация скрипта                                           |
//+------------------------------------------------------------------+
void OnStart()
{
    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);
}

//+------------------------------------------------------------------+
//| Обработка нажатий кнопок                                        |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &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));
    }
}

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

 
DanilaMactep #:

Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Вы делаете скрипт. Он создал кнопки и удалился с графика т.к за время его выполнения вы не совершили никаких событий по нажатию объектов. Для того, чтобы он работал по вашей логике, используйте индикаторы, а не скрипты 

 
DanilaMactep #:

Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Для перемещения графика используйте ChartNavigate()

 
Sergei Gurov #:

Вы делаете скрипт. Он создал кнопки и удалился с графика т.к за время его выполнения вы не совершили никаких событий по нажатию объектов. Для того, чтобы он работал по вашей логике, используйте индикаторы, а не скрипты

Большое спасибо за подсказку- попробую через индикатор это организовать.

 
DanilaMactep #:

Всем добрый день. Я пытаюсь написать скрипт который на графике после проведённого теста советника отрисует мне 2 кнопки по нажатию на которые график будет перематываться к след и пред сделке начиная с 1. Вот код скрипта.

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Кнопки отрисовываются, но по нажатию график никуда не перематывается и ничего не происходит. Подскажите пожалуйста, что я делаю не так и как завести кнопки, чтобы они перемещали по открытым сделкам ?

Я целую статью на эту тему писал тут. 
 
Всем добрый день. Продолжаю пробовать реализовать код для перемещения графика к местам открытия ордеров после теста в тестере. Переписал скрипт в индикатор, вот его код.
//+------------------------------------------------------------------+
//| Индикатор для навигации по сделкам в тестере стратегий          |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window

#include <stdlib.mqh> // Библиотека для удобства работы с объектами

int currentTradeIndex = 0; // Индекс текущей сделки
datetime tradeTimes[];      // Массив времени открытия сделок

//+------------------------------------------------------------------+
//| Инициализация индикатора                                        |
//+------------------------------------------------------------------+
int OnInit()
{
    GetTradeHistory();  // Собираем историю сделок
    CreateButtons();    // Создаем кнопки на графике

    EventSetTimer(1);   // Устанавливаем таймер на 1 секунду

    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| Деинициализация индикатора                                      |
//+------------------------------------------------------------------+
void OnDeinit(const int 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");
}

//+------------------------------------------------------------------+
//| Обработка нажатий кнопок                                        |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &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));
    }
}

//+------------------------------------------------------------------+
//| Таймер (для устойчивости работы)                                |
//+------------------------------------------------------------------+
void OnTimer()
{
    // Здесь можно добавить доп. функционал
}

//+------------------------------------------------------------------+
//| Обязательная функция для индикатора                             |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,       // КОЛИЧЕСТВО БАРОВ
                const int prev_calculated,   // ПРЕДЫДУЩИЕ РАСЧЁТЫ
                const datetime &time[],      // МАССИВ ВРЕМЕНИ
                const double &open[],        // МАССИВ ЦЕН ОТКРЫТИЯ
                const double &high[],        // МАССИВ МАКСИМАЛЬНЫХ ЦЕН
                const double &low[],         // МАССИВ МИНИМАЛЬНЫХ ЦЕН
                const double &close[],       // МАССИВ ЦЕН ЗАКРЫТИЯ
                const long &tick_volume[],   // ОБЪЁМЫ
                const long &volume[],        // ОБЪЁМЫ
                const int &spread[])         // СПРЭДЫ

{
    return rates_total; // Просто возвращаем количество баров
}

Кнопки появились, но по их нажатию нужное место на графике не показывается.

Что я делаю не так и как поправить код, чтобы при нажатии кнопок мне на графике отображалось место открытия ордеров от которого рисуется трендовая линия до закрытия ордера?

 
Artyom Trishkin #:
Я целую статью на эту тему писал тут. 
где тут-то? ссылку не прикрепил(((
 
DanilaMactep #:
Что я делаю не так


OrdersHistoryTotal() - учитывает ордера тестера, только во время теста.

Для перемещения по по сделкам после теста надо использовать объекты