Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Bonifacy
269
Bonifacy  

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

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

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

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

 Выдается -1;

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

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

Bonifacy
269
Bonifacy  
Понятно, абсолютные путь файла указывать нельзя...
Victor Nikolaev
Модератор
14972
Victor Nikolaev  
Bonifacy:
Понятно, абсолютные путь файла указывать нельзя...
Атрибутами поиграйтесь. Например открыть для чтения и записи одновременно
Bonifacy
269
Bonifacy  
Vinin:
Атрибутами поиграйтесь. Например открыть для чтения и записи одновременно

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

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

Alexey Volchanskiy
18711
Alexey Volchanskiy  

Ну вот прямо из кода мультивалютника, создается куча лог-файлов. Есть в формате 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  
VDev:

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

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

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

Vladimir Karputov
Модератор
55857
Vladimir Karputov  
Bonifacy:

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

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

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

Bonifacy
269
Bonifacy  
barabashkakvn:

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

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

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

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

Я использую в роботе методы DSP и мне нужна дискретизация с определенной частотой для правильной обработки сигнала. То есть все тики мне не нужны. Я использую дискретизацию по таймеру с частотой 1 Гц, при этом обрабатываются 8 валютных пар. Для меня 1 Гц - это приемлемый компромисс между загруженностью проца и точностью полученных данных. Все равно на МТ4/5 HFT не катит )))
Gulnaz Akhtyamova
10620
Gulnaz Akhtyamova  
VDev:
Я использую в роботе методы DSP и мне нужна дискретизация с определенной частотой для правильной обработки сигнала. То есть все тики мне не нужны. Я использую дискретизацию по таймеру с частотой 1 Гц, при этом обрабатываются 8 валютных пар. Для меня 1 Гц - это приемлемый компромисс между загруженностью проца и точностью полученных данных. Все равно на МТ4/5 HFT не катит )))
для котировки основная частота не 1Гц (т.е. одна колебание в секунду), а одно значение цены за один тик, даже если цена не изменилась. попробуйте и Ваши методы обработки сигнала, т.е. цены станут приближены к рынку.
Alexey Volchanskiy
18711
Alexey Volchanskiy  
_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 и я решил для прикола погонять на нем...
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий