Как получить список доступных в терминале символов? - страница 3

 
mql4com >>:

. . .

HST-файл обновляется при этом точно. Но график после Refresh - нет. Терминал всего один раз считывает данные из HST-файла - когда первый раз открывается нужный график. Далее HST-файл никак не участвует в формировании данных. И если, например, аварийно завершить работу терминала, то HST-файл останется со старыми данными.

Так вот вопрос, как заставить обновить данные графика из его HST-файла? Или перефразировав - как добавить (удалить) на online-графике бар?

Да, действительно, терминал считывает данные из *.hst файла только при первом открытии графика.

Поэтому заставить терминал в дальнейшем считывать историю из файла для online-графика нельзя.


В свое время, когда я экспериментировал "подсовыванием" своих скорректированных данных в историю инструмента, обнаружил следующее.

Терминал сохраняет свои текущие данные в *.hst файле и считывает историю инструмента заново при смене профиля. Таким образом, создав

два профиля с разными инструментами, я модифицировал историю одного при работе другого. Затем производил смену профиля. Данные на графике

при этом корректировались. Однако этот способ работал неустойчиво и требовал рутинных манипуляций с терминалом. Достаточно было вызвать

команду Refresh, как модифицированные данные тут же корректировались терминалом. Да и к тому же, терминал при смене профиля всегда обновлял

последние где-то 15-20 баров на графике.


В конечном счете, по-крайней мере для себя, я решил, что лучшее решение - это создание offline-графиков по мотивам period_converter.

Их можно обновлять в реальном времени. Графики всегда будут строиться из истории и ни каких неожиданных обновлений из сервера котировок

не будет. И если терминал вдруг аварийно завершит работу,  то данные не будут утеряны.

 

Ilnur, cпасибо за ответ.

Если менять бары относительно далекого прошлого, то на них команда Refresh не сказывается.

Пытался когда-то отловить "свои" (не WM_COMMAND) сообщения терминала при первом открытии графика или смене профиля - безрезультатно.

Найти флаг, который отвечает за считывание данных из HST-файла, не получилось.

 
Ilnur >>:

Вот простая функция на MQL4, которая возвращает список всех символов, предоставляемых ДЦ.

Символы считываются из файла symbols.raw (идея kaisa).


Спасибо что упомянули,

а мы все по-старинке _llseek да _lreed даже не знал что у них есть FileReadString

интересно как эта функция действует на встечающиеся в середине 00 проверять не хочется (комбат все хотел узнать описание этих символов)

я уж как то к delphi приспособился логинишься проверяешь этот simbol.raw на изменение начинаешь пробивать

О ЖИЗНИ

просто хочу создать сайт о mt

всем будет жутко интересно

информация у меня о 320 компаниях которые используют() mt

а соратников нет

onix сдох, mt4stats.com лажа

 
kaisa >>:

Спасибо что упомянули,

а мы все по-старинке _llseek да _lreed даже не знал что у них есть FileReadString

интересно как эта функция действует на встечающиеся в середине 00 проверять не хочется (комбат все хотел узнать описание этих символов)

Если функция в процессе считывания встречает 00, то воспримет его как конец строки.

 
В диалоге с Talex родилась несколько расширенная версия, где вылавливается еще и описание интсрумента. Жаль только, что проблема вылавливания группы инструментов, что я там озвучил, так и повисла. Никто не копал дальше?
 
Babay >>:
Жаль только, что проблема вылавливания группы инструментов, что я там озвучил, так и повисла. Никто не копал дальше?

Группа инструментов: offset 0x64 (100) для первого

ну и соответсвенно 1936*номер инструмента+0x64

 
kaisa писал(а) >>

Группа инструментов: offset 0x64 (100) для первого

ну и соответсвенно 1936*номер инструмента+0x64

Вот благодарю! А то в этом symbols.raw черт ногу сломит - столько мусора...

Получилось следующее. Проверил на восьми кухнях, вроде работает. Причесывать и оптимизировать не стал (коды fGetSymbols() и fGetGroups() практически идентичны).

fGetSymbols() и fGetGroups() работают только вместе, поскольку последняя использует максимальный номер группы, определенный в fGetSymbols() - такова структура файла SymGroups.raw, в нем много скрытых и неиспользуемых групп.

Структура получаемых массивов:

sSym[i][0] - наименование символа
sSym[i][1] - описание символа
sSym[i][2] - номер группы символа (k); счет ведется с нуля, так у них задумано

sGrp[k][0] - наименование группы
sGrp[k][1] - описание группы

Последняя функция fPrintThisFuckingList() сугубо демонстрационная. В таком ее варианте на выходе получим следующее:

Group 1 - Indexes (Indexes); _SP500 ()
Group 7 - Forex3 (); USDZAR (US Dollar vs South Africa Rand)
Group 5 - Forex2 (Foreign Exchange Second); USDRUB (US Dollar vs Russian Ruble)
Group 0 - Forex (Foreign Exchange); USDJPY (US Dollar vs Japanese Yen)
Group 4 - Metals (Gold & Silver); SILVER (SPOT Silver Once vs Us Dollar )
Group 5 - Forex2 (Foreign Exchange Second); NZDJPY (New Zealand Dollar vs Japanese Yen)
Group 6 - Oil (нефть); Brent (Brent Crude Oil )
Group 2 - CFD (Contract For Difference); #XOM (ExxonMobil Corporation)

Собственно код:

int      i, j, k,
         iSymHandle, iSymField[3], iSymRecLen, iSymRecQty,
         iGrpHandle, iGrpField[2], iGrpRecLen, iGrpRecQty;
string   sSymPath, sGrpPath, sSym[][3], sGrp[][2];


//+------------------------------------------------------------------+
//| start() - script program start function
//+------------------------------------------------------------------+
int start()
{
   fGetSymbols();
   fGetGroups();
   fPrintThisFuckingList(0); // qty of output records; 0 - All
return(0);
}
//
//
//
//--------------------------------------
void fGetSymbols() 
{
   iGrpRecQty     = 0;

   sSymPath       = "Symbols.raw";
   iSymRecLen     = 1936;  // lentgh of sym record
   iSymField[0]   = 12;    // sym name len,  offset 0  (0)
   iSymField[1]   = 88;    // sym desc len,  offset 0E (13)
   iSymField[2]   = 1;     // sym group len, offset 64 (101)
   
   iSymHandle = FileOpenHistory(sSymPath, FILE_BIN|FILE_READ);
   iSymRecQty = FileSize(iSymHandle) / iSymRecLen;
   ArrayResize(sSym, iSymRecQty);
   
   for(i = 0; i < iSymRecQty; i++)
      {
      FileSeek(iSymHandle, i * iSymRecLen, SEEK_SET);
      for(j = 0; j < ArrayRange(iSymField, 0); j++)
         {
         sSym[i][j] = FileReadString(iSymHandle, iSymField[j]);
         if (j == 2) 
            {
            k = StringGetChar(sSym[i][j], 0);
            sSym[i][j] = k;
            if (k > iGrpRecQty) {iGrpRecQty = k;}
            }
         }
      }
   iGrpRecQty++;
   FileClose(iSymHandle);
   
return(0);
}

//
//
//
//--------------------------------------
void fGetGroups() 
{
   sGrpPath       = "SymGroups.raw";
   iGrpRecLen     = 80; // lentgh of grp record
   iGrpField[0]   = 16; // grp name len,  offset 0 (0)
   iGrpField[1]   = 64; // grp desc len,  offset 10 (17)
         
   iGrpHandle = FileOpenHistory(sGrpPath, FILE_BIN|FILE_READ);
   ArrayResize(sGrp, iGrpRecQty);
   
   for(i = 0; i < iGrpRecQty; i++)
      {
      FileSeek(iGrpHandle, i * iGrpRecLen, SEEK_SET);
      for(j = 0; j < ArrayRange(iGrpField, 0); j++)
         {
         sGrp[i][j] = FileReadString(iGrpHandle, iGrpField[j]);
         }
      }
   
   FileClose(iGrpHandle);
   
return(0);
}

//
//
//--------------------------------------
void fPrintThisFuckingList(int piQty = 0)
{
   if (piQty == 0) {piQty = ArrayRange(sSym, 0);}
   for(i = 0; i < piQty; i++) 
      {
      k = StrToInteger(sSym[i][2]);
      Print("Group ", k, " - ", sGrp[k][0], " (", sGrp[k][1], "); ", 
            sSym[i][0], " (", sSym[i][1], ")");
      }
   
return(0);
}

 

Описалово по символу.

Тож не причесывал, вроде без проблем...

string SymDes(string s) 
{
int      i, j, iHandle, iField[2], iRecLen, iRecQty;
int lens=StringLen(s);
string   txt, sSym[][2];
iRecLen     = 1936;  // lentgh of sym record
iField[0]   = 12;    // sym name offset
iField[1]   = 68;    // sym desc offset
iHandle = FileOpenHistory("Symbols.raw", FILE_BIN|FILE_READ);
iRecQty = FileSize(iHandle) / iRecLen;
//
ArrayResize(sSym, iRecQty);
for(i = 0; i < iRecQty; i++)
{
FileSeek(iHandle, i*iRecLen, SEEK_SET);
for(j = 0; j < ArrayRange(iField, 0); j++)
{sSym[i][j] = FileReadString(iHandle, iField[j]);}
}
FileClose(iHandle);
for(i = 0; i < ArrayRange(sSym, 0); i++)
{if(StringSubstr(sSym[i][0],0,lens)==s) txt=sSym[i][1];}
//
return(txt);
}
Скрипт для теста ...
//+------------------------------------------------------------------+
int i;
string siMS[];
int start()
{
for(i=0; i<GetSymbols(siMS); i++)
{
Alert("sim: = ",siMS[i]," = ",SymDes(siMS[i]) );
}

Alert("==========================================================");

return(0);
}
//--- ниже набор функций пользователя
 
Babay >>:

Вот благодарю! А то в этом symbols.raw черт ногу сломит - столько мусора...

Да всего-то 1936 байт, разобраться можно если нужно, хотя и мусора действительно хватает (это broco)


че-за "водники"

Запустить бы MT4Admistrator, там все эти параметры и устанавливаются,

полегче бы было, а filemon от sysinternal покажет offset.


 
kombat писал(а) >>

Описалово по символу.

Тож не причесывал, вроде без проблем...

Скрипт для теста ...



Здравжлм, вашбродь!

Описание символа - это тоже хорошо. Я поправил пост - добавил небольшую сопроводиловку.

P.S. А я-то думал, вот обрадую комбата :), а то он всякими правдами и неправдами пытается установить принадлежность символа к определенной группе.

Ты бы хоть запустил мой код для интересу :(

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