Light Style© by Fisana

Перейти к содержимому


РАММ сервис NordFx: копируй сделки лучших трейдеров форекс


NordFX

Фотография

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


  • Пожалуйста, авторизуйтесь, чтобы ответить
В этой теме нет ответов

#1 Zhunko

Zhunko

    vip-участник

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 2 441 сообщений

Опубликовано 11 Май 2010 - 03:21

Консольное приложение 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   10,73 КБ   286 Скачано
Проект: Вложенный файл  RangSymbols.rar   33,62 КБ   267 Скачано




Посетителей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных пользователей

Рейтинг брокеров форекс: кто лидер, кто аутсайдер и почему?




Masterforex-V NordFX

Rambler's Top100

Принимаем Z-Payment