Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Консольное приложение RangSymbols.exe


Рекомендуемые сообщения

Консольное приложение RangSymbols.exe переписывает файл "symbols.sel", находящийся в папке с историей.

Чтобы всё сработало надо:

1. Достать из архива файл "RangSymbols.exe".

2. Положить файл "RangSymbols.exe" в папку с историей: ...\MetaTrader 4.00\history\NameServer

3. Выгрузить МТ4.

4. Запустить приложение "RangSymbols.exe".

5. Запустить МТ4.

 

//+--------------------------------------------------------------------------------------+
//| RangSymbols.cpp: определяет точку входа для консольного приложения.                  |
//| Приложение предназначено для сортировки по алфавиту символов в файле "symbols.sel"   |
//|терминала МТ4. Таким образом символы выстраиваются по алфавиту в окне "Обзор рынка".  |
//| Copyright © 2009, Жунко Вадим (Zhunko)                                               |
//| e-mail: vadim@zhunko.ru                                      09.03.2010 - 10.03.2010 |
//+--------------------------------------------------------------------------------------+
#include "stdafx.h"
// Пространства имён.
using namespace std;
// Функция возвращает описание кода системной ошибки.
string StringError(const DWORD dwErrCode); // Код системной ошибки.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// Точка входа для консольного приложения.
void main(int argc, char *argv[], char *envp[])
{// Константы.
 const bool DEBUGGING = false; // Включение отладки.
 // Переменные.
 DWORD  dwByte = 0;         // Количество прочитанных байт.
 HANDLE hHandle = 0;        // Файловый описатель.
 int    i, j, k;            // Переменные для счётчиков и циклов.
 int    erError = 0;        // Номер последней ошибки.
 int    nMaxSymbols = 0;    // Максимальное количество инструментов обзора рынка МТ4.
 int    nSearched = 0;      // Номер найденного символа.
 int    nSizeSymb = 0;      // Размер файла с инструметами обзора рынка МТ4.
 string sExclusion = "";    // Возврат строки с сообщением об ошибке.
 string sInfoTool = "";     // Строка для инициализации массива. 
 stringstream  ssExclusion; // Строка с сообщением об ошибке.
 // Структуры.
 struct InfoTools_ {char szTool[12]; char szInfo[116];} InfoTool;
 // Массивы.
 vector <InfoTools_> vitSymbolsListNew; // Массив с сортированным списком.
 vector <InfoTools_> vitSymbolsListOld; // Массив с несортированным списком.
 //xxxx Общие операци. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 if (DEBUGGING) cout << "==== START ====================================== RangSymbols ====================================== START ====" << endl;
 SetConsoleOutputCP(1251); // Меняем кодовую странуцу. Работает только со шрифтом "Lucida Console" в CMD.
 memset(InfoTool.szTool, '\0', 12);  // Очищаем массив структуры.
 memset(InfoTool.szInfo, '\0', 116); // Очищаем массив структуры.
 // Читаем файл со всеми инструментами МТ4.
 if (DEBUGGING) cout << "Читаем файл \"symbols.sel\" с инструментами обзора рынка МТ4." << endl;
 SetLastError(0); // Сбрасываем ошибки.
 //xxxx Блок перехвата ошибок. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 try
  {//==== Общие операции. ==================================================================================================================================================================================================
   sInfoTool.assign(128, '\0'); // Инициализируем строку в 128 знаков.
   if ((hHandle = CreateFileA("symbols.sel", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
    {
     erError = GetLastError();
     ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не открыт файл \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError);
     cout << ssExclusion.str();
     throw(ssExclusion.str());
    }
   // Если файл открыт, сдвигаем файловый указатель в конец файла. Измеряем размер файла.
   if ((nSizeSymb = SetFilePointer(hHandle, 0, NULL, FILE_END)) < 0)
    {
     erError = GetLastError();
     ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не смещён файловый указатель в конец файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError);
     cout << ssExclusion.str();
     throw(ssExclusion.str());
    }
   else if (DEBUGGING) cout << "Размер файла \"symbols.sel\": " << nSizeSymb << " байт." << endl;
   // Сдвигаем файловый указатель в начало списка инструментов.
   if (SetFilePointer(hHandle, 4, NULL, FILE_BEGIN) != 4)
    {
     erError = GetLastError();
     ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не смещён файловый указатель на первый инструмент файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError);
     cout << ssExclusion.str();
     throw(ssExclusion.str());
    }
   nMaxSymbols = (nSizeSymb - 4) / 128; // Определяем количество инструментов, зарегистрированных в файле.
   if (DEBUGGING) cout << "В файле \"symbols.sel\" зарегистрировано " << nMaxSymbols << " инструментов." << endl;
   // Изменяем размер массива с сортированными и несортированными символами.
   vitSymbolsListOld.resize(nMaxSymbols);
   vitSymbolsListNew.resize(nMaxSymbols);
   // Считываем символы из файла.
   if (DEBUGGING) cout << "+----------------+" << endl
                       << "|  ИНСТРУМЕНТЫ   |" << endl
                       << "+---+------------+" << endl
                       << "| № |   TOOLS    |" << endl
                       << "+---+------------+" << endl;
   for (i = 0; i < nMaxSymbols; i++)
    {// Читаем название инструмента.
     if (!ReadFile(hHandle, &vitSymbolsListOld[i], 128, &dwByte, NULL) || dwByte != 128)
      {
       erError = GetLastError();
       ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не прочитано имя инструмента из файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError);
       cout << ssExclusion.str();
       throw(ssExclusion.str());
      }
     if (DEBUGGING) cout << "|" << setw(3) << i << "|" << setw(12) << vitSymbolsListOld[i].szTool << "|" << endl;
    }
   if (DEBUGGING) cout << "+---+------------+" << endl << endl;
   // Сортировка символов.
   for (i = 0; i < nMaxSymbols; i++)
    {
     if (DEBUGGING) cout << "+---------------------------------------------+" << endl
                         << "|           СОРТИРОВКА ИНСТРУМЕНТОВ           |" << endl
                         << "+---+------------+---+---+------------+---+---+" << endl
                         << "| № |    NEW     |smb| № |    OLD     |smb|Ltr|" << endl
                         << "+---+------------+---+---+------------+---+---+" << endl;
     // Ищем непустой инструмент для начала поиска.
     vitSymbolsListNew[i] = vitSymbolsListOld[0];
     for (j = 0, k = 0, nSearched = 0; j < (nMaxSymbols - i); j++)
      {// Если символ имеет больший номер.
       if (DEBUGGING) cout << "|" << setw(3) << i << "|" << setw(12) << vitSymbolsListNew[i].szTool << "|" << setw(3) << vitSymbolsListNew[i].szTool[k]
                           << "|" << setw(3) << j << "|" << setw(12) << vitSymbolsListOld[j].szTool << "|" << setw(3) << vitSymbolsListOld[j].szTool[k] << "|" << setw(3) << k << "|" << endl;
       if (!strcmp(vitSymbolsListNew[i].szTool, vitSymbolsListOld[j].szTool))
        {
         k = 0;    // Сбрасываем счётчик.
         continue; // Пропускаем итерацию, если одинаковые инструменты.
        }
       if (vitSymbolsListNew[i].szTool[k] > vitSymbolsListOld[j].szTool[k])
        {
         vitSymbolsListNew[i] = vitSymbolsListOld[j]; // Берём наименьший символ.
         nSearched = j; // Номер найденного инструмента.
        }
       // Если символы одинаковые, переходим к анализу следующего символа в слове.
       if (vitSymbolsListNew[i].szTool[k] == vitSymbolsListOld[j].szTool[k])
        {
         k++; // Увеличиваем счётчик букв в слове.
         j--; // Уменьшаем счётчик инструментов, чтобы вернуться к предыдущему.
        }
       else k = 0; // Обнуляем счётчик букв в слове,если серия одинаковых символов прошла.
      }
     vitSymbolsListOld.erase(vitSymbolsListOld.begin() + nSearched); // Удаляем ячейку с найденным инструментом.
    }/**/
   if (DEBUGGING) cout << "+---+------------+---+---+------------+---+---+" << endl << endl;
   // Сдвигаем файловый указатель в начало списка инструментов.
   if (SetFilePointer(hHandle, 4, NULL, FILE_BEGIN) != 4)
    {
     erError = GetLastError();
     ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не смещён файловый указатель на первый инструмент файла \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError);
     cout << ssExclusion.str();
     throw(ssExclusion.str());
    }
   // Записываем новый список в файл.
   if (!WriteFile(hHandle, &vitSymbolsListNew[0], 128 * nMaxSymbols, &dwByte, NULL) || dwByte != DWORD(128 * nMaxSymbols))
    {
     erError = GetLastError();
     ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Файл \"symbols.sel\" не записан." << endl << "Последняя ошибка: " << erError << endl << StringError(erError) << endl;
     cout << ssExclusion.str();
     throw(ssExclusion.str());
    }
   else if (DEBUGGING) cout << "Файл \"symbols.sel\" записан с размером " << dwByte << " байт." << endl;
   // Закрываем файл.
   if (!CloseHandle(hHandle))
    {
     erError = GetLastError();
     ssExclusion << endl << "Ошибка в приложении \"RangSymbols\"." << endl << "Не закрыт файл \"symbols.sel\"" << endl << "Последняя ошибка: " << erError << endl << StringError(erError);
     cout << ssExclusion.str();
     throw(ssExclusion.str());
    }
  }
 //xxxx Контроль ошибок. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 catch(string sExclusion)
  {
   MessageBoxA(NULL, sExclusion.c_str(), "RangSymbols", MB_OK|MB_ICONSTOP|MB_DEFBUTTON1|MB_TASKMODAL);
   if (DEBUGGING) cout << "==== END ======================================== RangSymbols ======================================== END ====" << endl;
   #ifdef _DEBUG // В режиме отладки останавливаем выполнение программы для контроля ошибок.
    _getch();
   #endif
   return;
  }
 catch(...)
  {
   MessageBoxA(NULL, "Неизвестная ошибка.", "RangSymbols", MB_OK|MB_ICONSTOP|MB_DEFBUTTON1|MB_TASKMODAL);
   if (DEBUGGING) cout << "==== END ======================================== RangSymbols ======================================== END ====" << endl;
   #ifdef _DEBUG // В режиме отладки останавливаем выполнение программы для контроля ошибок.
    _getch();
   #endif
   return;
  }
 if (DEBUGGING) cout << "==== END ======================================== RangSymbols ======================================== END ====" << endl;
 #ifdef _DEBUG // В режиме отладки останавливаем выполнение программы для контроля ошибок.
  _getch();
 #endif
 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// Функция возвращает описание кода системной ошибки.
string StringError(const DWORD dwErrCode) // Код системной ошибки.
{
 char szBuffer[MAX_PATH] = {'\0'}; // Буфер для приёма строки с описанием ошибки.
 FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwErrCode, 0, szBuffer, MAX_PATH, 0);
 return(szBuffer);
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж

 

Приложение: RangSymbols.exe.rar

Проект: RangSymbols.rar

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...