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

 
fxsaber #:

Блин. Вчера проверял и он не работал.

Сегодня работает.

Ну вот и замечательно.

Спасибо.

 
JRandomTrader #:

В новой вкладке показывает.

У меня сначала не показывает. Кликнул на пустом экране -- показывает.

 
Aleksandr Slavskii #:

Блин. Вчера проверял и он не работал.

Сегодня работает.

Ну вот и замечательно.

Спасибо.

Здесь, чтобы продемонстрировать, как это на самом деле работает:


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

#define LIB_DEBUG
//#include <MQLplus/lib_debug.mqh>

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


struct __dbg_this_program_lifetime
{
    ulong start;
    __dbg_this_program_lifetime() :
        start(GetMicrosecondCount())
    { printf("##### Program start %s", MQLInfoString(MQL_PROGRAM_NAME)); };
    
    ~__dbg_this_program_lifetime()
    { 
        IndicatorRelease(indicator_handle);
        printf("##### Program stop %s", MQLInfoString(MQL_PROGRAM_NAME)); 
    };
} program_lifetime();


double indicator_buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    SetIndexBuffer(0, indicator_buffer);
    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);
//    ResetLastError();
//    IndicatorRelease(indicator_handle);
//    printf("_LastError: %llu", _LastError);
    
    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());

    for(int cnt = prev_calculated - (prev_calculated > 0); (cnt < rates_total) && !_StopFlag; cnt++)
    { indicator_buffer[cnt] = close[cnt]; }

    static datetime auto_exit = time[rates_total - 1] + (2 * PeriodSeconds());

    double receive_bfr[];
    CopyBuffer(indicator_handle, 0, time[rates_total - 2], time[rates_total - 1], receive_bfr);
    ArrayPrint(receive_bfr);

    if(time[rates_total - 1] > auto_exit)
    { IndicatorRelease(indicator_handle); }

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

Все равно это сложно, потому что нужно отлавливать "удаление индикатора" в OnChartEvent().

 
fxsaber #:

Мистика.

Опять не работает. Тот же самый код. Утром работал, сейчас перестал.

Как так то?

 
Aleksandr Slavskii #:

Мистика.

Опять не работает. Тот же самый код. Утром работал, сейчас перестал.

Как так то?

Возможно, хендл неправильно определился.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2024.01.29 15:58

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

 

Всем привет. Кто-то разбирался с функцией Alignment()  из СБ?

Взял пример кода поля Edit на панельке отсюда.

В функцию CreateEdit() добавил выравнивание по правому краю, но ничего не происходит:

bool CControlsDialog::CreateEdit(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP;
   int x2=ClientAreaWidth()-INDENT_RIGHT;
   int y2=y1+EDIT_HEIGHT;
//--- create
   if(!m_edit.Create(m_chart_id,m_name+"Edit",m_subwin,x1,y1,x2,y2))
      return(false);
//--- разрешим редактировать содержимое
   if(!m_edit.ReadOnly(false))
      return(false);
  
  // --- добавлено выравнивание    
   m_edit.Alignment(WND_ALIGN_RIGHT, 0, 0, 0, 0);
  // ---
     
   if(!Add(m_edit))
      return(false);
//--- succeed
   return(true);
  }


Если напрямую обратиться к объекту Edit по имени, то так выравнивание работает:

bool CControlsDialog::CreateEdit(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP;
   int x2=ClientAreaWidth()-INDENT_RIGHT;
   int y2=y1+EDIT_HEIGHT;
//--- create
   if(!m_edit.Create(m_chart_id,m_name+"Edit",m_subwin,x1,y1,x2,y2))
      return(false);
//--- разрешим редактировать содержимое
   if(!m_edit.ReadOnly(false))
      return(false);
  
  // --- добавлено выравнивание
   ObjectSetInteger(m_chart_id, m_name+"Edit", OBJPROP_ALIGN, ALIGN_RIGHT);
  // ---
     
   if(!Add(m_edit))
      return(false);
//--- succeed
   return(true);
  }


Подскажите, что не так делаю с m_edit.Alignment() ?

Файлы:
 
Ошибка при выполнении:
class A {
public:
    A() {}
    A(const A&) {}
    void operator&&(const A&) { Print(3); }
};
A f( int i ) { Print( i ); return A(); }
void OnStart()
{
    f(1) && f(2);
}

Результат:   2-1-3

Ожидалось: 1-2-3

 
A100 #:
Ошибка при выполнении:

Результат:   2-1-3

Ожидалось: 1-2-3

Это не ошибка.

Порядок вычисления подвыражений в выражении не определён.

Не нужно на него рассчитывать.

 
Koldun Zloy #:

Это не ошибка.

Порядок вычисления подвыражений в выражении не определён.

Не нужно на него рассчитывать.

И в каком же еще компиляторе, кроме MQL - вычисления идут справа налево - кроме пустых слов - пример можете привести?

 
A100 #:

И в каком же еще компиляторе, кроме MQL - вычисления идут справа налево - кроме слов - пример можете привести?

В любом компиляторе C++.

И не справа налево, а как захочется компилятору.

В стандарте языка это не определено.

Причина обращения: