Ошибки, баги, вопросы - страница 3468

 
fxsaber #:

Вы просто не в курсе архитектурной особенности индикаторов - внутренний счетчик. Видимо, вам нужно прописать эту строку.

При чём тут это?

Очень интересный вариант получения хэндла самого себя, вместо iCustom.

Проблема в удалении этого хэндла. Как то же в памяти эти два индикатора сидят, а удаляется только один. 

Думаю это баг.

 
Aleksandr Slavskii #:

Очень интересный вариант получения хэндла самого себя.

К сожалению, этот способ не всегда будет работать. Есть более надежные.

Проблема в удалении этого хэндла.

Решение выше показано.

[Удален]  
Aleksandr Slavskii # : При чём тут это? Очень интересный вариант получения хэндла самого себя, вместо iCustom. Проблема в удалении этого хэндла. Как то же в памяти эти два индикатора сидят, а удаляется только один. Думаю это баг.

Я тоже согласен, но похоже, что мы в меньшинстве, боремся с большинством. Я не думаю, что MetaQuotes внесет в это какие-либо изменения. Нам придется жить с этой «забавной» ситуацией.

I also agree, but it seems we are in the minority fighting against the majority. I don't see MetaQuotes making any changes to this. We will have to live with this "bugged" situation.

 
fxsaber #:

Решение выше показано.

Это не решение.

А если я хочу использовать хэндл этого индикатора в этом же индикаторе?

Но при удалении индикатора удалится только один из них.

Хотя ладно. Такой вариант использования индикатора, чреват рекурсией, а это может вызвать кучу проблем.

в общем да, лучше получать хэндл другим способом.

 
Aleksandr Slavskii #:

А если я хочу использовать хэндл этого индикатора в этом же индикаторе?

Никаких проблем. Вам нужно немного въехать в архитектуру, тогда все станет просто сразу.

 
Aleksey Vyazmikin #:

Столкнулся с непонятной для меня ситуацией в плане логики, хотел уточнить, частое ли это явление.

Суть, у разных ДЦ код работы с ордерами работает корректно, и вот у одного (лицензия в РФ и название на F) непонятная ситуация, проявляется редко:

Я тут допустил ошибку - ДЦ не на "Ф", а на "Б".

Ответьте мне, пожалуйста по основному вопросу - это распространенная практика, или какая то ошибка/уникальность ДЦ?

 
Aleksey Vyazmikin #:

Ответьте мне, пожалуйста по основному вопросу - это распространенная практика, или какая то ошибка/уникальность ДЦ?

Stop/Freeze-уровни - древняя практика.

 
Aleksey Vyazmikin #:

Я тут допустил ошибку - ДЦ не на "Ф", а на "Б".

Ответьте мне, пожалуйста по основному вопросу - это распространенная практика, или какая то ошибка/уникальность ДЦ?

Просто нет кода ошибки для STOPS_LEVEL, а вероятнее всего используется один и тот же код ошибки как для FREEZE_LEVEL так и для  STOPS_LEVEL.

Было у меня  такое (у знакомого) , замораживались ордера, но не у Б, а у Ф. Код ошибки к сожалению не посмотрел.

 
Glory #:

This was done specifically more than 15 years ago to prevent the massive disappearance of indicators from charts.

The indicator remains on the chart, but it does not work because it does not receive the OnCalculate, OnTimer, OnChartEvent events

Я понимаю, и рассуждения, кажется, имеют абсолютный смысл.

Но в журнале должен быть отчет о возвращаемом значении OnInit в случае сбоя. Но ни о каких неудачах речи не идет.

Также проверьте этот код:

//+------------------------------------------------------------------+
//|                                                  Playground2.mq5 |
//|             Copyright 2024, Freie Netze UG (haftungsbeschraenkt) |
//|                                       https://www.freie-netze.de |
//+------------------------------------------------------------------+


int     indicator_handle    = INVALID_HANDLE;
int     indicator_subwnd_id = -1;
string  indicator_shortname = NULL;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    printf("GetTickCount: %llu", GetTickCount());


    indicator_shortname = ::MQLInfoString(MQL_PROGRAM_NAME);
    const int wnd_count  = (int)ChartGetInteger(ChartID(), CHART_WINDOWS_TOTAL);        
    for(int wndptr = NULL; (wndptr < wnd_count) && (indicator_handle == INVALID_HANDLE); wndptr++)
    {
        for(int ind_cnt = ChartIndicatorsTotal(ChartID(), wndptr) - 1; (ind_cnt >= NULL) && (indicator_handle == INVALID_HANDLE); ind_cnt--)
        { indicator_handle = (ChartIndicatorName(ChartID(), wndptr, ind_cnt) == indicator_shortname) ? ChartIndicatorGet(ChartID(), wndptr, indicator_shortname) : indicator_handle; }
        indicator_subwnd_id = (indicator_handle != INVALID_HANDLE) ? wndptr : indicator_subwnd_id;
    }
    printf("Indicator handle: %i", indicator_handle);
    IndicatorRelease(indicator_handle);
    
    return((indicator_subwnd_id != -1) ? INIT_SUCCEEDED : INIT_FAILED);
}


void OnDeinit(int reason)
{
    ChartIndicatorDelete(ChartID(), indicator_subwnd_id, indicator_shortname);
    IndicatorRelease(indicator_handle);

    string text = "Another reason";
    switch(reason)
    {
        case REASON_ACCOUNT:        text="Account was changed";                         break;
        case REASON_CHARTCHANGE:    text="Symbol or timeframe was changed";             break;
        case REASON_CHARTCLOSE:     text="Chart was closed";                            break;
        case REASON_PARAMETERS:     text="Input-parameter was changed";                 break;
        case REASON_RECOMPILE:      text="Program "+__FILE__+" was recompiled";         break;
        case REASON_REMOVE:         text="Program "+__FILE__+" was removed from chart"; break;
        case REASON_TEMPLATE:       text="New template was applied to chart";           break;
    }
    printf("OnDeInit reason: %s; GetTickCount: %llu", text, GetTickCount());
}



//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
    printf("OnCalculate call: %s; GetTickCount: %llu", TimeToString(time[rates_total - 1]), GetTickCount());

    return(rates_total);
}
//+------------------------------------------------------------------+

Постоянно не удается вызвать OnDeinit при удалении.

@fxsaber : Пожалуйста, проверьте предоставленный мной код.

 
fxsaber #:

Вы просто не в курсе архитектурной особенности индикаторов - внутренний счетчик. Видимо, вам нужно прописать эту строку.

Нет, не работает ваша рекомендация вставить IndicatorRelease(indicator_handle);

Если выделенное раскомментировать, то хэндл как бы есть, но CopyBuffer возвращает только нули, а с закоменченным всё норм, возвращает текущую цену.

Значит в OnDeinit мы имеем баг и архитектура тут ни при чём.

#property indicator_chart_window
#property indicator_plots 0
#property indicator_buffers 1
int indicator_handle = INVALID_HANDLE;
double indBuff[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, indBuff, INDICATOR_DATA);
   printf("GetTickCount: %llu", GetTickCount());

   string indicator_shortname = ::MQLInfoString(MQL_PROGRAM_NAME);
   const int wnd_count  = (int)ChartGetInteger(ChartID(), CHART_WINDOWS_TOTAL);
   for(int wndptr = NULL; (wndptr < wnd_count) && (indicator_handle == INVALID_HANDLE); wndptr++)
      for(int ind_cnt = ChartIndicatorsTotal(ChartID(), wndptr) - 1; (ind_cnt >= NULL) && (indicator_handle == INVALID_HANDLE); ind_cnt--)
         indicator_handle = (ChartIndicatorName(ChartID(), wndptr, ind_cnt) == indicator_shortname) ? ChartIndicatorGet(ChartID(), wndptr, indicator_shortname) : indicator_handle;
   printf("Indicator handle: %i", indicator_handle);
   
   //IndicatorRelease(indicator_handle);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(indicator_handle);
   printf("OnDeInit reason: %i; GetTickCount: %llu", reason, GetTickCount());
  }
//+------------------------------------------------------------------+
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[])
  {
   double buff[];
   indBuff[rates_total - 1] = close[rates_total - 1];
   if(indicator_handle != INVALID_HANDLE)
     {
      CopyBuffer(indicator_handle, 0, 0, 1, buff);
      Print(buff[0]);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+