Как лучше подать информацию о сотне биржевых символов? - страница 4

 

Чтобы отображать информацию, нужно иметь текстовой файл с названиями символов. Я принял расположение этого файла в общей папке. Прикрепляю пример файла.


И в догонку возник вопрос: после чтения текстового файла, как организовать сортировку от "A" к "Z"?

 
Vladimir Karputov:

Чтобы отображать информацию, нужно иметь текстовой файл с названиями символов. Я принял расположение этого файла в общей папке. Прикрепляю пример файла.


И в догонку возник вопрос: после чтения текстового файла, как организовать сортировку от "A" к "Z"?

Скорее всего, нужно создать массив, и его отсортировать, а потом уже выводить в цикле

 
Vladimir Karputov:

Чтобы отображать информацию, нужно иметь текстовой файл с названиями символов. Я принял расположение этого файла в общей папке. Прикрепляю пример файла.


И в догонку возник вопрос: после чтения текстового файла, как организовать сортировку от "A" к "Z"?

Даже нашёл решение (спасибо @Vasiliy Sokolov) :

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

Сортировка двухмерного массива.

Vasiliy Sokolov, 2015.03.21 16:19

Я бы решил так: каждая строка представляет собой некий объект CObject, а вся таблица: CArrayObj. В своем классе наследнике CObject перегрузите метод Compare. Вот накидал полностью рабочую демонстрацию в виде скрипта:

//+------------------------------------------------------------------+
//|                                                   MultiArray.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#define EQUAL 0
#define LESS -1
#define MORE 1
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>

enum ENUM_SORT_TYPE
{
   SORT_BY_TEXT,
   SORT_BY_NUMBER
};

class CLineTable: public CObject
{
private:
   string m_text;
   int m_number;
public:
   CLineTable();
   CLineTable(string text, int number)
   {
      m_text = text;
      m_number = number;
   }
   string Text()const{return m_text;}
   int Number()const{return m_number;}
   virtual int Compare(const CObject *node,const int mode=0) const
   { 
      const CLineTable* line = node;
      switch (mode)
      {
         case SORT_BY_TEXT:
            if(line.Text() == this.Text())
               return EQUAL;
            else if(line.Text() < this.Text())
               return MORE;
            else
               return LESS;
         case SORT_BY_NUMBER:
            if(line.Number() == this.Number())
               return EQUAL;
            else if(line.Number() < this.Number())
               return MORE;
            else
               return LESS;
      }
      return EQUAL;
   }
};
CArrayObj Table;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
    //Добавляем в таблицу 13 строк CLineTable
    int limit = 13;
    Table.Sort(SORT_BY_TEXT);
    for(int i = 0; i < limit; i++)
    {
      string n = (string)(i+1);
      if(StringLen(n) < 2)n = "0"+n;
      string text = "Текст" + n;
      Table.InsertSort(new CLineTable(text, limit-i));
    }
    //Смотрим что получилось:
    for(int i = 0; i < Table.Total(); i++)
    {
      CLineTable* line = Table.At(i);
      printf(line.Text() + "\t" + (string)line.Number());
    }
    //Сортируем по второму фактору: номера
    Table.Sort(SORT_BY_NUMBER);
    //Смотрим что получилось:
    printf("");
    for(int i = 0; i < Table.Total(); i++)
    {
      CLineTable* line = Table.At(i);
      printf(line.Text() + "\t" + (string)line.Number());
    }
    Table.Clear();
  }
//+------------------------------------------------------------------+

 Смотрим вывод:


 
Vladimir Karputov:

Даже нашёл решение (спасибо @Vasiliy Sokolov) :

Так массив одномерный?

 
Vitaly Muzichenko:

Так массив одномерный?

Да, одномерный, но не числовой, поэтому

ArraySort
ArraySort Сортирует многомерный числовой массив ...

не подходит.

 
Vladimir Karputov:

Да, одномерный, но не числовой, поэтому

не подходит.

//===============================================================================================
//-------------------------------- Сортирует строковой массив ----------------------------------+
//===============================================================================================
void ArraySortStr(string &Str[]) {
 string Min;
 int jMin, Size = ArraySize(Str);
  for(int i=0; i<Size-1;i++) {
   Min = Str[i];
   jMin = i;
    for(int j=i+1; j<Size; j++)
     if(Str[j] < Min) {
       Min = Str[j];
       jMin = j;
      }
     if(jMin > i) {
       Str[jMin] = Str[i];
       Str[i] = Min;
     }
   }
 }
Насколько помню, то функция от fxsaber
 
Vladimir Karputov:

Да, одномерный, но не числовой, поэтому

не подходит.

создаем массив с инструментами и сортируем его при инициализации?

тогда нужна ли загрузка из файла?

практичнее файл 1 раз подготовить по необходимым правилам

 
Renat Akhtyamov:

создаем массив с инструментами и сортируем его при инициализации?

тогда нужна ли загрузка из файла?

практичнее файл подготовить по необходимым правилам

Файл готовим вручную, а как его готовить, если в нём 50 инструментов, и нужно иногда добавить ещё несколько?

Загрузить файл и его отсортировать в инициализации, ну это и так понятно, никто ведь не будет загружать, и сортировать на каждом тике)

 
Renat Akhtyamov:

создаем массив с инструментами и сортируем его при инициализации?

тогда нужна ли загрузка из файла?

практичнее файл 1 раз подготовить по необходимым правилам

Не совсем так. При инициализации читается файл. Все символы которые найдены  складываются в таблицу (пост ). В таблице они автоматически сортируются. И уже из отсортированной таблицы заполняется служебный массив символов с которым и идёт работа.

А файл нужен обязательно - в нём содержатся необходимые символы. Почему нельзя использовать "Обзор рынка"? Да потому, что при переключении на другой сервер "Обзор рынка" очень сильно меняется :)

 
Vladimir Karputov:

Не совсем так. При инициализации читается файл. Все символы которые найдены  складываются в таблицу (пост ). В таблице они автоматически сортируются. И уже из отсортированной таблицы заполняется служебный массив символов с которым и идёт работа.

А файл нужен обязательно - в нём содержатся необходимые символы. Почему нельзя использовать "Обзор рынка"? Да потому, что при переключении на другой сервер "Обзор рынка" очень сильно меняется :)

А вот в этом случае, Я бы отказался от файла, это совсем не рационально, проще читать текущий обзор рынка, и обновлять массив при добавлении/исключении инструментов

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