Скачать MetaTrader 5

Создание лог файла

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
Bonifacy
269
Bonifacy 2014.11.27 18:05 

Добрый день. Пытаюсь сделать простяцкую вещь - текстовый лог файл. Да вот беда не получается.

Использовал класс CFileTxt

Пишу следующее:

CFileTxt logFile;
Print(logFile.Open("D:\logFile.txt", FILE_TXT|FILE_REWRITE));

 Выдается -1;

Подцепиться к уже существующему файлу также не получается, что делаю не так?

Как создать файл для чтения\записи?

Bonifacy
269
Bonifacy 2014.11.27 18:37  
Понятно, абсолютные путь файла указывать нельзя...
Victor Nikolaev
Модератор
14524
Victor Nikolaev 2014.11.30 03:58  
Bonifacy:
Понятно, абсолютные путь файла указывать нельзя...
Атрибутами поиграйтесь. Например открыть для чтения и записи одновременно
Bonifacy
269
Bonifacy 2014.12.01 14:57  
Vinin:
Атрибутами поиграйтесь. Например открыть для чтения и записи одновременно

Дело не в атрибутах, использовать прямой путь к файлу нельзя. Для файлов разрешено пространство лишь в директории C:\Путь установки MT\MQL5\Files

А я пытался создать файл на диске D: 

Alexey Volchanskiy
16684
Alexey Volchanskiy 2014.12.04 12:36  

Ну вот прямо из кода мультивалютника, создается куча лог-файлов. Есть в формате csv, есть бинарные, я потом их в матлабе анализирую. Может, поможет в чем-то... Заодно пишу тиковые данные в таком формате

2014.12.4 13:38:40,1202.48,1202.79
2014.12.4 13:38:41,1202.48,1202.79
2014.12.4 13:38:42,1202.43,1202.69
2014.12.4 13:38:44,1202.43,1202.69
2014.12.4 13:38:44,1202.43,1202.69
2014.12.4 13:38:45,1202.43,1202.69
2014.12.4 13:38:46,1202.53,1202.79
bool OpenLogFiles()
{
    string LogFileName;    
    
    if(EnableLogAllOrders)
    {
        if(LogFileAllOrders > 0)
             FileClose(LogFileAllOrders);
        if(IsRunOnTester())
        {
            LogFileName = MQLInfoString(MQL_PROGRAM_NAME) + "_AllOrders" + "_Testing.ord";
            LogFileAllOrders = FileOpen(LogFileName, FILE_CSV | FILE_WRITE, ',');
        }
        else
        {
            LogFileName = MQLInfoString(MQL_PROGRAM_NAME) + "_AllOrders" + ".ord";
            LogFileAllOrders = FileOpen(LogFileName, FILE_CSV | FILE_READ | FILE_WRITE | FILE_SHARE_READ, ',');
        }
        
        if(LogFileAllOrders == INVALID_HANDLE)
            Alert("Не могу открыть лог-файл " + LogFileName);
        else    
        {
            Print(LogFileName + " is opened");
            FileSeek(LogFileAllOrders, 0, SEEK_END);
        }    
    }
    
    if(!(EnableLogOrders || EnableLogInfo || EnableTickSave))
        return false;
    
    for(int ns = 0; ns < USING_SUMBOLS_COUNT; ns++)
    {
        string symbolName = UsingSymbolNames[ns];
        if(MarketInfo(symbolName, MODE_ASK) < 0.01)
            continue;
        for(int n = 0; n < (int)maxLogFileType; n++)
        {    
            switch((LogFileType)n)
            {
            case opOrders: 
                LogFileName = symbolName + "_" + MQLInfoString(MQL_PROGRAM_NAME) + "_Orders";
                break;
            case opInfo:
                LogFileName = symbolName + "_" + MQLInfoString(MQL_PROGRAM_NAME) + "_Info";
                break;
            case opTickSave:
                LogFileName = symbolName + "_" + MQLInfoString(MQL_PROGRAM_NAME) + "_Tick";
                break;
            default:
                Alert("Wrong file type inedtificator in OpenLogFiles");
                break;
            }
    
            if(LogFilesArray[ns][n] > 0)
                FileClose(LogFilesArray[ns][n]);
    
            if(IsRunOnTester())
            {
                if((LogFileType)n == opOrders)
                {
                    LogFileName = LogFileName + "_Testing.ord";
                    LogFilesArray[ns][n] = FileOpen(LogFileName, FILE_CSV | FILE_WRITE, ',');
                }    
                if((LogFileType)n == opInfo)
                {
                    LogFileName = LogFileName + "_Testing.dat";
                    LogFilesArray[ns][n] = FileOpen(LogFileName, FILE_BIN | FILE_WRITE);
                }
                if((LogFileType)n == opTickSave)
                {
                    LogFileName = LogFileName + "_Testing.csv";
                    LogFilesArray[ns][n] = FileOpen(LogFileName, FILE_CSV | FILE_WRITE, ',');
                }    
            }    
            else
            {
                if((LogFileType)n == opOrders)
                {
                    LogFileName = LogFileName + ".ord";
                    LogFilesArray[ns][n] = FileOpen(LogFileName, FILE_CSV | FILE_READ | FILE_WRITE | FILE_SHARE_READ, ',');
                }    
                if((LogFileType)n == opInfo)
                {
                    LogFileName = LogFileName + ".dat";
                    LogFilesArray[ns][n] = FileOpen(LogFileName, FILE_BIN | FILE_READ | FILE_WRITE | FILE_SHARE_READ);
                }
                if((LogFileType)n == opTickSave)
                {
                    LogFileName = LogFileName + ".csv";
                    LogFilesArray[ns][n] = FileOpen(LogFileName, FILE_CSV | FILE_READ | FILE_WRITE | FILE_SHARE_READ, ',');
                }    
            }    
            
            if(LogFilesArray[ns][n] == INVALID_HANDLE)
                Alert("Не могу открыть лог-файл " + LogFileName);
            else    
            {
                Print(LogFileName + " is opened");
                FileSeek(LogFilesArray[ns][n], 0, SEEK_END);
            }    
        }
    }    
    return true;
}
Bonifacy
269
Bonifacy 2014.12.10 13:29  
VDev:

Ну вот прямо из кода мультивалютника, создается куча лог-файлов. Есть в формате csv, есть бинарные, я потом их в матлабе анализирую. Может, поможет в чем-то... Заодно пишу тиковые данные в таком формате

Да, проблема решена, все равно файлы вне директории МТ писать, создавать нельзя.

Лучше скажите, при выводе информации о тиках в файл, много ли их пропадает? Ведь OnTick не сработает до тех пор пока предыдущая обработка не завершится... Можно ли выводить данные стакана цен? не только bid и ask? Есть ли у кого подобный опыт? 

Vladimir Karputov
Модератор
46201
Vladimir Karputov 2014.12.10 13:51  
Bonifacy:

Да, проблема решена, все равно файлы вне директории МТ писать, создавать нельзя.

Лучше скажите, при выводе информации о тиках в файл, много ли их пропадает? Ведь OnTick не сработает до тех пор пока предыдущая обработка не завершится... Можно ли выводить данные стакана цен? не только bid и ask? Есть ли у кого подобный опыт? 

Собирайте тики в индикаторе. Индикатор обрабатывает все тики, советник может тики пропускать. 

Bonifacy
269
Bonifacy 2014.12.10 16:00  
barabashkakvn:

Собирайте тики в индикаторе. Индикатор обрабатывает все тики, советник может тики пропускать. 

Спасибо за хороший совет, а что со стаканом? можно ли программно получать данные с него?
Alexey Volchanskiy
16684
Alexey Volchanskiy 2014.12.10 20:39  
Bonifacy:

Да, проблема решена, все равно файлы вне директории МТ писать, создавать нельзя.

Лучше скажите, при выводе информации о тиках в файл, много ли их пропадает? Ведь OnTick не сработает до тех пор пока предыдущая обработка не завершится... Можно ли выводить данные стакана цен? не только bid и ask? Есть ли у кого подобный опыт? 

Я использую в роботе методы DSP и мне нужна дискретизация с определенной частотой для правильной обработки сигнала. То есть все тики мне не нужны. Я использую дискретизацию по таймеру с частотой 1 Гц, при этом обрабатываются 8 валютных пар. Для меня 1 Гц - это приемлемый компромисс между загруженностью проца и точностью полученных данных. Все равно на МТ4/5 HFT не катит )))
Gulnaz Akhtyamova
10620
Gulnaz Akhtyamova 2014.12.12 22:37  
VDev:
Я использую в роботе методы DSP и мне нужна дискретизация с определенной частотой для правильной обработки сигнала. То есть все тики мне не нужны. Я использую дискретизацию по таймеру с частотой 1 Гц, при этом обрабатываются 8 валютных пар. Для меня 1 Гц - это приемлемый компромисс между загруженностью проца и точностью полученных данных. Все равно на МТ4/5 HFT не катит )))
для котировки основная частота не 1Гц (т.е. одна колебание в секунду), а одно значение цены за один тик, даже если цена не изменилась. попробуйте и Ваши методы обработки сигнала, т.е. цены станут приближены к рынку.
Alexey Volchanskiy
16684
Alexey Volchanskiy 2014.12.13 23:36  
_new-rena:
для котировки основная частота не 1Гц (т.е. одна колебание в секунду), а одно значение цены за один тик, даже если цена не изменилась. попробуйте и Ваши методы обработки сигнала, т.е. цены станут приближены к рынку.

Эта ошибочная точка зрения кочует по форумам уже много лет. Конечно, я пробовал этот подход, получается хуже. Да и с точки зрения теории ЦОС это неверно. Если мы работаем во временной области, то в ней и надо дискретизировать. К тому же у меня параллельно идет анализ 8 валютных пар, к каким тикам прикажете привязываться?

И небольшой пример. Частота дискретизации CD 44100 Гц. Примените ваш подход и на выходе вместо музыки получите какофонию )).

https://www.mql5.com/ru/blogs/post/235953 

Тестирование скальпера после доработок - день 1
Тестирование скальпера после доработок - день 1
  • 2014.12.13
  • Alexey Volchanskiy
  • www.mql5.com
Сегодня вечером (19:30 мск) вывел своего скальпера погулять, а то неделю его мучал улучшениями, застоялся бедняга. Был у меня смешной бонусный счет от RVD на $10 и я решил для прикола погонять на нем...
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий