SymbolList: новые идеи...

 
 

Проектов на вывод списка торговых инструментов встечал несколько,

от простого вбивания в скрипт руками, до перебора по литерам...

Или чтением из файла, как например этот:

'SymbolList fromSet'


Однако вот что подумалось работая с другим направлением,

чтением и копированием файлов вне терминальной корзины.

'Файловые операции в MQL4 без ограничений'


А что если...

Читать данные прямо из папки ..\symbolsets

БЕЗ создания\копирования промежуточного файла!


Хоть без ручек не обойтись и в этом случае, однако гораздо проще и без лишних телодвижений

в обзоре рынка показать все символы и сохранить под нужным именем, например 05052008.set

#property show_inputs
#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, int& buffer[], int bytes);
   int _lwrite (int handle, string buffer, int bytes);
   int _lclose (int handle);
#import
// ------------------------------------------------------------ 
void start() 
  {
    string text=ReadFile(TerminalPath()+"\symbolsets\05052008.set");
    //WriteFile("\services\T97954447.txt",text);
    int count=StringLen(text);
    string title="Чтение из файла";
    string msg="Число считанных байт: "+count+"    \n"
    +"Cодержимое файла:\n\n"+text;
    MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
  }

// !!! это просто заготовка !!! \\
 

Вот такой еще вариант (без ручек)


//+------------------------------------------------------------------+
//|                                             GetAllMarketInfo.mq4 |
//|                                                   версия 0.0.0.1 |
//|                                              igorkaisa@gmail.com |
//+------------------------------------------------------------------+
#include <WinUser32.mqh>
#import "kernel32.dll"
    int _lclose (int);
    int _lopen  (string,int);
    int _llseek (int,int,int);
    int _lread  (int,string,int);
#import
 
int start()
{ 
    int    sectorSize  = 1936;    
    int    fileHandle  =_lopen(TerminalPath()+"\\history\\"+AccountServer()+"\\symbols.raw",0);
    int    symbolCount =_llseek(fileHandle,0,2)/sectorSize;  
    string symbolName  = "123456789012";       
 
    for(int i=0; i<symbolCount; i++)
    {
        _llseek(fileHandle,i*sectorSize,0);      
        _lread (fileHandle,symbolName,12);
        Print
        (
            symbolName,";",
            MarketInfo(symbolName,MODE_SPREAD),";",
            MarketInfo(symbolName,MODE_SWAPLONG),";",              
            MarketInfo(symbolName,MODE_SWAPSHORT) 
            // добавить кому что нужно или вообще в файл записывать                                      
        );        
    } 
    Print("Символов: ", symbolCount);
    _lclose(fileHandle);
    return(0);
}
 

Ух ты... какой изящный ход...

Респект!

-

Для меня это пока темный лес, но открыв на просмотр файл symbols.raw

заметил что там есть и описания торгуемых инструментов (символов)

Кто-то даже спрашивал как бы их тоже вытаскивать... можно это реализовать?

-

CFD Live Cattle, Euro vs US Dollar и т.д...

 
Кто-то даже спрашивал как бы их тоже вытаскивать... можно это реализовать?

CFD Live Cattle, Euro vs US Dollar и т.д...

я и спрашивал

реализовать можно, на C++ получается,

а на MQL со строками ихними малость запутался...

так то черновой вариант есть

просто хочется не только "изящного хода" но и изящного кода

 
kaisa писал (а) >>

Вот такой еще вариант (без ручек)

Здорово! Все-таки расковырял!

Игорь, интересует Ваше мнение и если возможно помощь.

При обратном процессе(не прочитать, а изменить) эти изменения повлияют на работу тестера?

Сам не смогу это проверить. Помогите со скриптом, пожалуйста.

 

Блин... :((( чёт не хочет скрипт листать...

В алерте всё ок, считает, видит и т.д...

а вот в например в рабочем скрипте не хочет.

-

Там вместо ручного ввода списка символов решил загонять автоматом,

предварительно "нагрузив" массив siMS из файла...

//+------------------------------------------------------------------+
//|  02.04.2006  Скрипт для выгрузки информации о символах.          |
//+------------------------------------------------------------------+
#property show_inputs
#include <WinUser32.mqh>
#import "kernel32.dll"
    int _lclose (int);
    int _lopen  (string,int);
    int _llseek (int,int,int);
    int _lread  (int,string,int);
#import

int handle;
//------- Внешние параметры скрипта ---------------------------------+
extern string siFileName  = "SymbolInfo.csv";
extern string siSeparator = ".";
//---
string siMS[];
//------- как это было в исходном варианте -----------------------------+
/* string siMS[15]={
"AFLRUR",
"AUDCAD",
"AUDCHF"
};
*/
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start()
{
    int    sectorSize  = 1936;    
    int    fileHandle  =_lopen(TerminalPath()+"\\history\\"+AccountServer()+"\\symbols.raw",0);
    int    symbolCount =_llseek(fileHandle,0,2)/sectorSize;  
    string symbolName  = "123456789012";       

    for(int i=0; i<symbolCount; i++)
    {
        _llseek(fileHandle,i*sectorSize,0);      
        _lread (fileHandle,symbolName,12);
        siMS[i]="\""+symbolName+"\"";
                
    } 
    
    _lclose(fileHandle);
//---------------
string st;
  FileDelete(siFileName);
  st=";"+TimeToStr(LocalTime(), TIME_DATE)+";"+AccountCompany();
  WritingLineInFile(siFileName, st);
  WritingLineInFile(siFileName, "");
  st="№;Символ;Рынок;BUY;SELL;Спрэд;Стопы;Контракт;Маржа";
  WritingLineInFile(siFileName, st);

  for (i=0; i<ArraySize(siMS); i++)
  {
    st=DoubleToStr(i+1, 0)+";"+ //№ п.п.
       siMS[i]+";"+ // Символ
       DoubleToStr(MarketInfo(siMS[i], MODE_MARGINCALCMODE),0)+";"+ // Рынок
       DoubleToStr(MarketInfo(siMS[i], MODE_SWAPLONG), 2)+";"+ // Бай своп
       DoubleToStr(MarketInfo(siMS[i], MODE_SWAPSHORT), 2)+";"+ // Селл своп
       DoubleToStr(MarketInfo(siMS[i], MODE_SPREAD), 0)+";"+ // Спред
       DoubleToStr(MarketInfo(siMS[i], MODE_STOPLEVEL), 0)+";"+ // Стопы
       DoubleToStr(MarketInfo(siMS[i], MODE_LOTSIZE), 0)+";"+ // Обьём лота
       DoubleToStr(MarketInfo(siMS[i], MODE_MARGINREQUIRED), 2); // Маржа 
    if (siSeparator!=".") st=StrTran(st, ".", siSeparator);
    WritingLineInFile(siFileName, st);
    Alert("s: ",siMS[i]," k: ",1);
  }

Comment("Сформирован файл: "+siFileName);
}

//+------------------------------------------------------------------+
//| Замена подстроки                                                 |
//| Параметры:                                                       |
//|   str     - текстовая строка, в которой производится замена      |
//|   strfrom - заменяемая подстрока                                 |
//|   strto   - заменяющая подстрока                                 |
//+------------------------------------------------------------------+
string StrTran(string str, string strfrom, string strto)
{
  int    n;
  string outstr="", tempstr;

  for (n=0; n<StringLen(str); n++)
  {
    tempstr=StringSubstr(str, n, StringLen(strfrom));
    if (tempstr==strfrom)
    {
      outstr=outstr+strto;
      n=n+StringLen(strfrom)-1;
    } else outstr=outstr+StringSubstr(str, n, 1);
  }
  return(outstr);
}

//+------------------------------------------------------------------+
//| Запись строки в файл                                             |
//+------------------------------------------------------------------+
void WritingLineInFile(string FileName, string text)
{
  int file_handle=FileOpen(FileName, FILE_READ|FILE_WRITE, " ");

    if (file_handle>0)
    {
        FileSeek(file_handle, 0, SEEK_END);
        FileWrite(file_handle, text);
        FileClose(file_handle);
    }
}
//+------------------------------------------------------------------+
 

Упс... дополнение...

//--- было...
string siMS[];

// сделал так, вроде заработало, правда всего 15 символов
string siMS[15];

но ведь количество символов как-бы неизвестно заранее...

Как сделать этот размер резиновым?

 

hi,

ты бы лучше объяснил, что хочешь, а то кусок отсюда, кусок оттуда.

о, новый термин "резиновый" суть то конечно правильная



 

Хм... ну скрипт Игоря Ким вроде не диковнка, и назначен для генерации таблицы свойств сиволов.

Единственым неудобным моментом было (и пока есть...) это прописка вручную этих самых символов.

Вроде и не проблема, но!

- зависимость от ДЦ

- зависимость от "сезонных" символов

- зависимость от вновь вводимых символов

- да и просто неудобно в составлении списка вручную

*

Вот и вся недолга с этими кусками оттуда и оттуда... :)))

Хотя кусками это сложно назвать, ибо скрипт Кима практически весь,

за исключением массива siMS который из "ручного" заполнения

переведён в "автоматический" кодом GetAllMarketInfo.

*

Как вариант реализации, генератор хтмл-таблицы нацарапаный мной.

Зависимости всё те-же и хотелось бы от них избавиться...

 

хорошо переварю и напишу а то у нас в омске уже ночь

сегодня уже думать не хочется

 

Ну вотЪ... родил...

Правда есть ещё где что поправить почистить, но уже работает!

*

Теперь на следующую версию разработать сортировку, хотя бы одну.

*

Посмотреть тестовую страницу...

Файлы: