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

 
Fernando Carreiro #:

Это абсолютно смешно

Допустим, пользователь настроил свой график с индикатором, где индикатор работает только на определенном счете.
#property indicator_chart_window
#property indicator_plots 0

int OnInit()
{
  return(AccountInfoInteger(ACCOUNT_LOGIN) != 12345);    
}

int  OnCalculate( const int, const int, const int, const double &[] )
{
  return(0);
}

Если индикатор будет выгружаться при INIT_FAILED, то график будет терять индикатор при переключении с рабочего счета на другой и обратно.

 
fxsaber # :
Let's say the user has configured his chart with an indicator, where the indicator only works on a certain account.

If the indicator is unloaded at INIT_FAILED, then the chart will lose the indicator when switching from a working account to another and back.

Agree. - But the return value must be reflected in the journal, just like the experts.

Изменить: см. этот пример кода...

//+------------------------------------------------------------------+
//|                                                  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);
    
    return((indicator_subwnd_id != -1) ? INIT_SUCCEEDED : INIT_FAILED);
}


void OnDeinit(const 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 не вызывается

 
Dominik Egert #:

Соглашаться. - Но возвращаемая стоимость должна быть отражена в журнале, как и у экспертов.

#property indicator_chart_window
#property indicator_plots 0

int OnInit()
{
  return(!TerminalInfoInteger(TERMINAL_CONNECTED));
}

int  OnCalculate( const int, const int, const int, const double &[] )
{
  return(0);
}

Перезагружаю терминал и получаю потерю индикатора. Вы так хотите?!

 
fxsaber # : Допустим, пользователь настроил свой график с индикатором, где индикатор работает только на определенном счете.

Если индикатор будет выгружаться при INIT_FAILED, то график будет терять индикатор при переключении с рабочего счета на другой и обратно.

И та же логика, которую вы представили, может быть применима и к советнику (EA). Это не убедительный аргумент.

And the same logic that you have presented could apply to an Expert Advisor (EA) as well. It is not a convincing argument.
 
fxsaber #:

I reboot the terminal and get a loss of the indicator. Is that what you want?!

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

 
Dominik Egert #:

OnDeInit не вызывается

#property indicator_chart_window
#property indicator_plots 0

int OnInit() { return(INIT_FAILED); }

void OnDeinit( const int ) { Print(__FUNCSIG__); }

int  OnCalculate( const int, const int, const int, const double &[] ) { return(0); }


Результат.

void OnDeinit(const int)
 
Fernando Carreiro #:

И та же логика, которую вы представили, может быть применима и к советнику (EA).

Советник торгует, у него гораздо выше требования к безопасности, чем у индикатора.

Это не убедительный аргумент.

Это же субъективная вещь.

 
fxsaber # : Перезагружаю терминал и получаю потерю индикатора. Вы так хотите?!

Разработчик должен сам решить, как он хочет поступать в различных случаях.

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

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

Терминал должен обеспечивать одинаковое поведение как советников, так и индикаторов, как это реализовано в МТ4.

It should be up to the developer to decide how they want to handle the various cases.

Just as in EAs, one can that purposely continue execution and manage the disconnections or other situations if one wishes without termination of the EA.

The same can also be done for indicators. It should not be forced. It should be under the programmer's control of how they wish to handle the situation.

The terminal should allow the same behaviour both on EAs and Indicators, just as it is implemented in MT4.

 

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

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

1. При нахождении цены рядом с TP получаю ошибку 10029 (Ордер или позиция заморожены) при попытке закрыть позицию по рыночной цене.

2. Получаю ошибку 10016 (Неправильные стопы в запросе) при попытке удалить отложенный ордер.

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

И, если с первой ситуацией я справился - ожидая, пока цена не уйдёт подальше, то со второй ситуацией - не понимаю, что делать.

Не могу понять, что не так с ценой.


Если дело опять в "Уровень стопов"(который установлен 110 в спецификации), то почему код ошибки не соответствующий ситуации?

 
fxsaber # : Советник торгует, у него гораздо выше требования к безопасности, чем у индикатора. Это же субъективная вещь.

Более того, как обрабатывается ситуация при использовании iCustom() или ChartIndicatorAdd() , если индикатор не дает сбоя?

Как советник, использующий эту функцию, узнает, что индикатор недействителен, если об этом не сообщается?

Further more, how is the situation handled when using iCustom() or ChartIndicatorAdd() if the Indicator does not fail?

How will the EA using those function know that the Indicator is invalid if it is not reported?