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

 
Alex Renko #:

Да но если 

будет стоять первым то далее 

всегда будет тоже самое что и INDICATOR_SHORTNAME

Не ставьте первым, а ставьте вторым.

Вообще проблемы не вижу.

 
Vitaly Muzichenko #:

Не ставьте первым, а ставьте вторым.

Вообще проблемы не вижу.

Ну это костыль и баг - описать надо в документации это както тогда что для индикаторов надо INDICATOR_SHORTNAME ставить в конце OnInit aто он карежыт любые вызовы MQL_PROGRAM_NAME, т.е мы должны догадаться 

 
Alex Renko #:

Ну это костыль и баг - описать надо в документации это както тогда что для индикаторов надо INDICATOR_SHORTNAME ставить в конце OnInit aто он карежыт любые вызовы MQL_PROGRAM_NAME, т.е мы должны догадаться 

MQL_PROGRAM_NAME, может вызываться после OnInit.  INDICATOR_SHORTNAME может назначаться ДО OnInit.

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

 
fxsaber #:

MQL_PROGRAM_NAME, может вызываться после OnInit.  INDICATOR_SHORTNAME может назначаться ДО OnInit.

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

Пасиб! 

Из всего я понял одно -  что лучше всего все смотреть и принтовать и с друг другом сравнивать что бы исключить работу переименованного ex5 или старой версии что отличается от серверной 

   // 777: INDICATOR_SHORTNAME Должен стоять всегда в конце Ininit
   
   
   string FullPath = MQLInfoString(MQL_PROGRAM_PATH);
   string FileNameFromPath = GetFileNameFromPath(FullPath);
   //Print("FileNameFromPath: ", FileNameFromPath);
    
   string PROGRAM_NAME = MQLInfoString(MQL_PROGRAM_NAME)+".ex5"; // GetFileNameFromPath(FullPath);
   //Print("MQL_PROGRAM_NAME: ", PROGRAM_NAME);

   // Устанавливаем это имя как короткое название индикатора
   IndicatorSetString(INDICATOR_SHORTNAME, SoftNameVersion);
   //Print("SoftNameVersion:  ",SoftNameVersion);
   
   if(FileNameFromPath != PROGRAM_NAME || FileNameFromPath != SoftNameVersion || PROGRAM_NAME != SoftNameVersion)
   {
   Print("Old version of soft - please download New at www.....");
   return(INIT_FAILED);
   }
//-------------------------------------------------------------------------------------
string GetFileNameFromPath(string FullPath)
{
    int LastBackslash = StringLastIndexOf(FullPath, '\\'); // Находим последнее вхождение "\"
    
    if (LastBackslash >= 0)
        return StringSubstr(FullPath, LastBackslash + 1); // Извлекаем имя файла

    return FullPath; // Если `\` не найден, возвращаем весь путь (на случай, если это просто имя файла)
}

// Функция для поиска последнего вхождения символа в строке
int StringLastIndexOf(const string Str, const short Char)
{
    int Pos = StringLen(Str) - 1;

    while (Pos >= 0 && Str[Pos] != Char)
        Pos--;

    return Pos;
}
//-------------------------------------------------------------------------------------
 
fxsaber #:

MQL_PROGRAM_NAME в индикаторах возвращает INDICATOR_SHORTNAME.

Не нашел в Документации такого. При этом используется издавна.

Баг или фича?

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

 
Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам".
 
Интересный факт. Если сделать поиск названия функции FileLoad на русскоязычной/англоязычной версии сайта, то можно обнаружить упоминание использования этой функции (менее) 10-тью людьми.

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

Обсуждение статьи "Основы программирования на MQL5: Файлы"

Renat Fatkhullin, 2016.10.21 23:35

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

Что то сломал, не пойму что. Запускаю скрипт, через пару секунд он пишет в логи "эксперты"  вот такое

Access violation at 0x000001CE3010318B read to 0xFFFFFFFFFFFFFFFF in 'C:\Users\Iskander\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B\MQL5\Scripts\46\LoadSymbol.ex5'
   crash -->  000001CE3010318B 660F2E441108      ucomisd    xmm0, [rcx+rdx*1+0x08]
              000001CE30103191 7506              jnz        0x000001CE30103199

              000001CE30103193 0F8B17040000      jnp        0x000001CE301035B0

              000001CE30103199 8B4830            mov        ecx, [rax+0x30]
              000001CE3010319C F6C102            test       cl, 0x02
              000001CE3010319F 7521              jnz        0x000001CE301031C2

              000001CE301031A1 48C7400800000000  mov        qword ptr [rax+0x08], 0x00
              000001CE301031A9 83BC24A000000000  cmp        dword ptr [rsp+0xA0], 0x00
              000001CE301031B1 0F84EC090000      jz         0x000001CE30103BA3

              000001CE301031B7 488B8424B4000000  mov        rax, [rsp+0xB4]
              000001CE301031BF 8B4830            mov        ecx, [rax+0x30]
              000001CE301031C2 F6C104            test       cl, 0x04
              000001CE301031C5 0F84A5030000      jz         0x000001CE30103570


00: 0x000001CE3010318B
01: 0x00007FF9ADEA21C1
02: 0x00007FF9ADEA2D73
03: 0x0000000001E91AD0
04: 0x0000000000590008
05: 0x0000006E0000000A


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

В этой папке есть ещё папочка, которая с помощью симлинк лежит в рамдиск, который в оперативной памяти.

Что сие может значить?


ЗЫ. Ещё в рам диске пишет, что в нём занято 180метров, а там лежат всего 6 файлов по 1кб. 

ЗЫЫ. Нашёл ошибку. Сравнивал тёплое с мягким, а терминал оказался неженкой и не захотел прощать такие вольности)))

 
Aleksandr Slavskii #:

ЗЫЫ. Нашёл ошибку. Сравнивал тёплое с мягким, а терминал оказался неженкой и не захотел прощать такие вольности)))

Это важно для багрепорта. Крашей не должно быть.

 
fxsaber #:

Это важно для багрепорта. Крашей не должно быть.

Ну примерно так

MqlTick prevTick[];  // объявлена на глобале, ArrayResize сделана в другом месте.
//+------------------------------------------------------------------+
void NewTick(int i, string symb)
  {
   MqlTick ticks[];
   if(FileLoad(fName + symb + "_Tick", ticks, FILE_COMMON) > 0)
      if((ticks[0].bid != prevTick[i].bid) || (ticks[0].ask != prevTick[i].ask) || (ticks[0].time != prevTick[i].time))
        {
         CustomTicksAdd(symb + "_c", ticks);
         prevTick[i] = ticks[0];
        }
  }
//+------------------------------------------------------------------+

Эта функция вызывается в цикле. Отсутствие выделенной i  вызывало краш на строке if(   на второй итерации.

Я не умею багрепорты.