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

A100:

Не понял, а какой смысл в MQL было делать все наоборот?

C++ VS2017
MQL
printf( "%s", ... )
printf( "%S", ... )
printf( "%S", ... )
printf( "%s", ... )
printf( "%c", ... )
printf( "%C", ... )
printf( "%C", ... )
printf( "%c", ... )
по факту MQL::printf соответствует CPP::wprintf при том, что аналог CPP::printf в MQL отсутствует
MQL5 весь юникодный, так что мы полностью отказались от однобайтных строк.
Renat Fatkhullin:
MQL5 весь юникодный, так что мы полностью отказались от однобайтных строк.

Не верю что полностью! Все работает

void OnStart()
{
        uchar ch[] = { 0x41,0x6E,0x73,0x69,0x20,0x69,0x73,0x20,0x61,0x6C,0x69,0x76,0x65,0x21 };
        string ansi;
        for ( int i = 0, j = 0; i < ArraySize( ch ); i+=2, j++ )
                StringSetCharacter( ansi, j, ch[ i ] | ch[ i + 1 ] << 8 );
        printf( "%S", ansi );
}

Результат: Ansi is alive!

A100:

Не верю что полностью! Все работает

Результат: Ansi is alive!

Упаковать бинарно в unicode, а потом получить риск взорваться на вызове через системную функцию неразумно.

Скорее всего отфильтруем такие попытки позже.

Renat Fatkhullin:

получить риск взорваться на вызове через системную функцию неразумно.

Не стоит преувеличивать поскольку string гарантированно завершается нулем. И кроме того однобайтовые символы наряду с многобайтовыми фактически являются частью Юникода и в MQL тоже все это прекрасно работает благодаря чему например есть возможность вывода во вкладку Эксперты нормальным (а не этим ужасным моноширинным) шрифтом.

Это все равно что запретить вызов из dll функции с аргументом uchar[] опасаясь что пользователь неправильно его заполнит (например не завершит нулем), при том что многие системные функции требуют именно uchar[], а не ushort[] (который кстати тоже можно неправильно заполнить)

2-ая строка - вывод человеческим (не моноширинным) шрифтом. Как видите технически не сложно оставить моноширинный шрифт только для ::ArrayPrint()

Здравствуйте. Помогите пожалуйста найти причину ошибки. Перевожу индикатор с mql4 на mql5. Для функций iHigh использую следующую "оболочку":

double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   double Arr[1];
   if(CopyHigh(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else
     {
      Print(__FUNCTION__,GetLastError());
      return(-1);
     }
  }

В итоге получаю ошибку 4301: "Неизвестный символ", хотя в качестве параметра symbol передается строка возвращаемая функцией Symbol(). Вот кусок кода функции, которая вызывает iHigh

ENUM_TIMEFRAMES tf=Period();
   string symbol = Symbol();
   if(filtr1==false) 
      return(true);  
   int i1,i2=0; 
   for(i1=i+1; i2<6; i1++)
     {
      
      if(iLow(symbol,tf,i1)<=iLow(symbol,tf,i1+1) && 
         iHigh(symbol,tf,i1)>=iHigh(symbol,tf,i1+1)) 
        {
         break; //выход из цикла
        }
      else
        {
         i2++;
        }
     }
Ошибка в CCanvas::Attach. Отсутствует выделенная строка
//+------------------------------------------------------------------+
//| Attach new object without bitmap resource                        |
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      if(StringLen(rcname)==0 && width>0 && height>0 && ArrayResize(m_pixels,width*height)>0)
        {
         ZeroMemory(m_pixels);
         if(ResourceCreate("::"+objname,m_pixels,width,height,0,0,0,clrfmt) && 
            ObjectSetString(chart_id,objname,OBJPROP_BMPFILE,"::"+objname))
           {
            m_chart_id = chart_id;
            m_width=width;
            m_height=height;
            m_objname=objname;
            m_rcname="::"+objname;
            m_format=clrfmt;
            m_objtype=OBJ_BITMAP_LABEL;
            //--- success
            return(true);
           }
        }
     }
//--- failed
   return(false);
  }
О, надо попросить Николая Семко запилить альтернативную версию канваса, с хорошим сглаживанием, возможно другим видением, и запилить статью, вдруг согласится?
Aleksandr Teleguz:

Здравствуйте. Помогите пожалуйста найти причину ошибки. Перевожу индикатор с mql4 на mql5. Для функций iHigh использую следующую "оболочку":

В итоге получаю ошибку 4301: "Неизвестный символ", хотя в качестве параметра symbol передается строка возвращаемая функцией Symbol(). Вот кусок кода функции, которая вызывает iHigh

Кто такой "i"? Какое его значение перед циклом?


Вы делаете вызов ResetLastError перед iHigh?

Vladimir Karputov:

Кто такой "i"? Какое его значение перед циклом?


Вы делаете вызов ResetLastError перед iHigh?

Значение i перебирается в цикле в функции OnCalculate

for(int i=rates_total-prev_calculated; i>0 && !IsStopped(); i--)
     {
      if(i>rates_total-10) continue;


 Вызов ResetLastError не делал, сейчас поставил - код ошибки тот же. В функции OnCalculate я использую массивы low[i], high[i] и т.п., а во внешних функциях iHigh, iLow и т.п.