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

 
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);
  }
//+------------------------------------------------------------------+
 
fxsaber #:

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

Я только на MT4 встречал подобное, но с запретом модификации стоп уровней, а тут запрет на закрытие позиции. Мне кажется, что это какой то бред - надо у ЦБ уточнить.

А код ошибки (10016) почему такой странный - по смыслу же не подходит.

 
Aleksandr Slavskii #:

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

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

Это "Уровень стопов" в спецификации для обеих ситуаций?

 
Aleksey Vyazmikin #:

Это "Уровень стопов" в спецификации для обеих ситуаций?

Сори. Напутал, стоп уровни тут вообще ни при чём. 

Просто не удалялся у меня стоп ордер из за близкой цены, вот в голове и засели стоп уровни, а они только при установке ордеров значимы, при удалении значимы уровни заморозки.