Сначала идет заголовок базы:
struct HistoryHeader
{
int version; // версия базы
char copyright[64]; // копирайт
char symbol[12]; // инструмент
int period; // период инструмента
int digits; // число знаков после запятой в инструменте
time_t timesign; // временной отпечаток создания базы
time_t last_sync; // время последней синхронизации
int unused[13]; // для будущего использования
};
а затем массив баров (выравнивание однобайтовое):
#pragma pack(push,1)
//---- Стандартное представление котировки в базе
struct RateInfo
{
time_t ctm; // текущее время в секундах
double open;
double low;
double high;
double close;
double vol;
};
#pragma pack(pop)
Большое спасибо.
А что пишешь, если не секрет? Я уже этот формат давно прочитал, есть модуль построения графика по истории и вывод заголовка.
Посмотрите на скрипт period_converter.mq4, который появился пару билдов назад. На его примере показана методика генерации и записи чартов любых нестандартных таймфреймов, файлы которых можно потом открыть в оффлайне. С помощью MQL4 можно формировать родные бинарные HST файлы.
Таким же образом можно конвертор из CSV в HST написать прямо на MQL4.
Таким же образом можно конвертор из CSV в HST написать прямо на MQL4.
//+------------------------------------------------------------------+
//| Period-Converter.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property show_inputs
#include <WinUser32.mqh>
extern int i_mult = 3; // new period multiplier factor
int handle;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
int i, start_pos, i_time, time0, last_fpos, periodseconds;
double d_open, d_low, d_high, d_volume, last_volume;
int hwnd=0;
//---- History header
int version=400;
string c_copyright;
string c_symbol=Symbol();
int i_period=Period()*i_mult;
int i_digits=Digits;
int i_unused[13];
//----
handle=FileOpenHistory(c_symbol+i_period+".hst", FILE_BIN|FILE_WRITE);
if(handle < 0) return(-1);
//---- write history file header
c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
FileWriteInteger(handle, version, LONG_VALUE);
FileWriteString(handle, c_copyright, 64);
FileWriteString(handle, c_symbol, 12);
FileWriteInteger(handle, i_period, LONG_VALUE);
FileWriteInteger(handle, i_digits, LONG_VALUE);
FileWriteInteger(handle, 0, LONG_VALUE); //timesign
FileWriteInteger(handle, 0, LONG_VALUE); //last_sync
FileWriteArray(handle, i_unused, 0, 13);
//---- write history file
periodseconds=i_period*60;
start_pos=Bars-1;
d_open=Open[start_pos];
d_low=Low[start_pos];
d_high=High[start_pos];
d_volume=Volume[start_pos];
//---- normalize open time
i_time=Time[start_pos]/periodseconds;
i_time*=periodseconds;
for(i=start_pos-1;i>=0; i--)
{
time0=Time[i];
if(time0>=i_time+periodseconds)
{
last_fpos=FileTell(handle);
last_volume=Volume[i];
FileWriteInteger(handle, i_time, LONG_VALUE);
FileWriteDouble(handle, d_open, DOUBLE_VALUE);
FileWriteDouble(handle, d_low, DOUBLE_VALUE);
FileWriteDouble(handle, d_high, DOUBLE_VALUE);
FileWriteDouble(handle, Close[i], DOUBLE_VALUE);
FileWriteDouble(handle, d_volume, DOUBLE_VALUE);
i_time=time0/periodseconds;
i_time*=periodseconds;
d_open=Open[i];
d_low=Low[i];
d_high=High[i];
d_volume=last_volume;
}
else
{
d_volume+=Volume[i];
if (Low[i]<d_low) d_low=Low[i];
if (High[i]>d_high) d_high=High[i];
}
}
FileFlush(handle);
//---- collect incoming ticks
Print("Run!");
int last_time=LocalTime()-5;
while(true)
{
int cur_time=LocalTime();
//---- check for new rates
if(RefreshRates())
{
time0=Time[0];
//---- is there current bar?
if(time0<i_time+periodseconds)
{
FileSeek(handle,last_fpos,SEEK_SET);
d_volume+=Volume[0]-last_volume;
last_volume=Volume[0];
if (Low[0]<d_low) d_low=Low[0];
if (High[0]>d_high) d_high=High[0];
}
else
{
//---- no, there is new bar
i_time=time0/periodseconds;
i_time*=periodseconds;
d_open=Open[0];
d_low=Low[0];
d_high=High[0];
d_volume=Volume[0];
last_volume=d_volume;
}
//----
last_fpos=FileTell(handle);
FileWriteInteger(handle, i_time, LONG_VALUE);
FileWriteDouble(handle, d_open, DOUBLE_VALUE);
FileWriteDouble(handle, d_low, DOUBLE_VALUE);
FileWriteDouble(handle, d_high, DOUBLE_VALUE);
FileWriteDouble(handle, Close[0], DOUBLE_VALUE);
FileWriteDouble(handle, d_volume, DOUBLE_VALUE);
FileFlush(handle);
//----
if(hwnd==0)
{
hwnd=WindowHandle(Symbol(),i_period);
if(hwnd!=0) Print("Chart window detected");
}
//---- refresh window not frequently than 1 time in 5 seconds
if(hwnd!=0 && cur_time-last_time>=5)
{
PostMessageA(hwnd,WM_COMMAND,33324,0);
last_time=cur_time;
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void deinit()
{
FileClose(handle);
}
//+------------------------------------------------------------------+
Когда-то в какой то ветке я прочел, что поддержки Крестиков-ноликов, Ренко и Каги в ближайшем будущем разработчики не предусматривают, а торгую все больше на "днёвках", минимум на 4-х часовках, хотелось-бы для пущей убедительности других методов прогнозирования рынка видеть и эти представления движения цен.
Для Крестов я уже приспособил BEB 4.
Ренко и Каги от Румуса привязывают совершенно к другой платформе и брокеру, а хочется все от одного брокера и на единой платформе.
NEEP писал, что у него уже есть модуль построения графика. А какого? Написан в МЕ4? Дело в том, что по жизни сталкивался с Борланд Пасквилем и чтобы быстро, пишу на Пасквиле, а чтобы в МТ4 - надо переучиться на МЕ4.
Для Крестов я уже приспособил BEB 4.
Ренко и Каги от Румуса привязывают совершенно к другой платформе и брокеру, а хочется все от одного брокера и на единой платформе.
NEEP писал, что у него уже есть модуль построения графика. А какого? Написан в МЕ4? Дело в том, что по жизни сталкивался с Борланд Пасквилем и чтобы быстро, пишу на Пасквиле, а чтобы в МТ4 - надо переучиться на МЕ4.
NEEP писал, что у него уже есть модуль построения графика. А какого? Написан в МЕ4? Дело в том, что по жизни сталкивался с Борланд Пасквилем и чтобы быстро, пишу на Пасквиле, а чтобы в МТ4 - надо переучиться на МЕ4.
Модуль написан на Delphi для построения крестиков, а также для тестирования стратегий, которые тоже пишу на Delphi. Осталось написать часть которая будет управлять МТ для совершения сделок.
NEEP писал, что у него уже есть модуль построения графика. А какого? Написан в МЕ4? Дело в том, что по жизни сталкивался с Борланд Пасквилем и чтобы быстро, пишу на Пасквиле, а чтобы в МТ4 - надо переучиться на МЕ4.
Модуль написан на Delphi для построения крестиков, а также для тестирования стратегий, которые тоже пишу на Delphi. Осталось написать часть которая будет управлять МТ для совершения сделок.
А где можно скачать? Интересно посмотреть!
NEEP писал, что у него уже есть модуль построения графика. А какого? Написан в МЕ4? Дело в том, что по жизни сталкивался с Борланд Пасквилем и чтобы быстро, пишу на Пасквиле, а чтобы в МТ4 - надо переучиться на МЕ4.
Модуль написан на Delphi для построения крестиков, а также для тестирования стратегий, которые тоже пишу на Delphi. Осталось написать часть которая будет управлять МТ для совершения сделок.
Да, действительно, если не жалко, то можно-ли посмотреть?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Нужно для написания проги в Дельфях.