//+------------------------------------------------------------------+//| dehole_hst.mq4 |//| kukan&alextron |//| http://www.kukan.ru |//+------------------------------------------------------------------+//8 декабря 2005г ////Скрипт выполнен для решения задач по выводу нескольких инструментов в одно окно, //и для синхронного совместного использования. Котировщики, (в частности Альпари) //используют следующий принцип поставки котировок, если нет изменения цены на каком-то баре, //то этот бар не поставляется. Особенно это касается мелких тайм фреймов 1 мин, 5мин…//В ночное время , когда активность рынка низкая, бывают выпадают несколько баров подряд.//Для одной валюты это не принципиально, но для вывода на экран одновременно нескольких //валют или индикаторов, связанных с валютами и анализа их, это становится актуально.//С течением времени под баром с определенным временем одной валюты, стоит бар с другим //временем другой валюты, другими словами происходит рассинхронизация валют.//Кроме того, ряд индикаторов, запуск которых осуществляется от определенного времени (бара), //не корректно работают, так как в это время для запуска может не оказаться бара.//Так же с помощью его можно находить крупные дыры в исторических файлах.////Скрипт делает новые файлы истории *.new, которые можно переименовать в *.hst, и перезапустив//терминал, иметь синхронизированную по времени историю.//Не забудь сохранить оригинальные файлы////сразу моменты://!находим пару с самой маленькой историей и с этого момента пойдет склейка//!соответственно размер истории будет определяться самой маленькой историей//!важно, склеивание идет не по времени, а по существующим барам, т.е.//полная синхронизация инструментов по времени//журнал работы по паре смотреть в файле *.log в дирректории где хранятся//файлы истории////это скрипт, положить в дирректорию скриптов.//запускать можно на любом графике, он графиками не пользуется//обработает историю и уйдет.//#property copyright"kukan&alextron"#property link"http://www.kukan.ru"#property show_inputs#define qty_smb 6//количество инструментовexternint m_period= 1 ; //можно клеить не только минутные бары - любыеexternstring symbol_0= "EURUSD" ; //поставить в "входные параметры" "N" чтоб исключить пару из синхронизацииexternstring symbol_1= "GBPUSD" ;
externstring symbol_2= "AUDUSD" ;
externstring symbol_3= "USDCHF" ;
externstring symbol_4= "USDJPY" ;
externstring symbol_5= "USDCAD" ; //можно другие инструменты обрабатыватьexternint volume_null= 0 ; //чем заполняем пустые бары//массив названий инструментовstring symbol_m[qty_smb];
//массивы указателейint i_handle[qty_smb];
int o_handle[qty_smb];
int log_handle[qty_smb];
//массив переменных - данные историиint h_time[qty_smb];
double h_open[qty_smb],h_low[qty_smb],h_high[qty_smb],h_close[qty_smb];
double h_volume[qty_smb];
double old_close[qty_smb]; //старая цена инструментаint old_time[qty_smb]; //старенькая дата для журнальчикаbool symbol_list[qty_smb]; //наличие инструмента//массив статистических данных для работы с логомint lg_sk[qty_smb]; //пропущенных котировок всегоint lg_sk_v[qty_smb]; //пропущенных котировок подрядint tm_cur= 0 ; //время бара обрабатываемой истории в секундахint ia,ib; //переменные простоint cnt_bars= 0 ; //счетчик обработанных баровbool fl_stop= false ; //флаг останова скрипта//+------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------+int start()
{
//---- //открываем все файлы историиfor ( int i= 0 ;i<qty_smb;i++)
{
//открытие файлов доноров
i_handle[i]= FileOpenHistory (symbol_m[i]+m_period+ ".hst" , FILE_BIN | FILE_READ );
symbol_list[i]= true ;
if (i_handle[i]< 0 )
{
Print (symbol_m[i], " Нехватает самой истории, исключаем из работы" );
h_time[i]=- 1 ; //будем пропускать данный инструмент
symbol_list[i]= false ;
}
else
{
fl_stop= true ;
}
//открытие файлов назначенийif (h_time[i]>= 0 && symbol_list[i])
{
o_handle[i]= FileOpenHistory (symbol_m[i]+m_period+ ".new" , FILE_BIN | FILE_WRITE );
if (o_handle[i]< 0 ) return (- 1 );
log_handle[i]= FileOpenHistory (symbol_m[i]+m_period+ ".log" , FILE_BIN | FILE_WRITE );
if (o_handle[i]< 0 ) return (- 1 );
//переписывание заголовка исторического файла
copy_title_proc(i_handle[i],o_handle[i]);
}
}
//проверка если нет ниодной истории то выйти нахренif (!fl_stop)
{
Print ( " Нет таких историй" );
return (- 1 );
}
//все готово файлы открыты//ищем самую короткую историю
tm_cur= 0 ; //возмем какое нибудь старое времяfor (i= 0 ;i<qty_smb;i++)
{
if (h_time[i]< 0 ) continue ; //пропускаем инструмент
read_bars_hst(i);
if (h_time[i]== 0 )
{
Print (symbol_m[i], " Нехватает самой истории, исключаем из работы" );
h_time[i]=- 1 ; //будем пропускать данный инструмент
symbol_list[i]= false ;
}
if (tm_cur<h_time[i])
{
tm_cur=h_time[i];
ia=i; //запоминаем номер инструмента с самой короткой историей
}
old_time[i]=h_time[i]; //убирание пограничных эфектов
old_close[i]=h_close[i];
}
cnt_bars++;
Print ( "Самая короткая история у " ,symbol_m[ia], " с " , TimeToStr (h_time[ia], TIME_DATE | TIME_MINUTES ));
////теперь устанавливаем файловые указатели на данное время по всем инструментам//вернее на время после этого на один барfor (i= 0 ;i<qty_smb;i++)
{
if (h_time[i]< 0 ) continue ; //пропускаем инструментwhile (tm_cur>h_time[i])
{
if (h_time[i]== 0 )
{ //если файл кончился присылается 0 и это гуд, //не буду пока обрабатывать конец файла//если файл кончился тут, то нехватает данных на инструменте //в той истории где вопщето мы должны клеитьPrint (symbol_m[i], " Нехватает данных в ранней истории, исключаем из работы " );
h_time[i]=- 1 ; //будем пропускать данный инструмент
symbol_list[i]= false ;
break ;
}
read_bars_hst(i);
}
write_text_logs(i, "Начало работы\t " + TimeToStr (tm_cur, TIME_DATE | TIME_MINUTES )+ "\n" );
}
//..................................................//все файлы синхронизированы основной цикл склейки//если время меньше то пишем в выходной файл цену закрытия с нулевым обьемом//и редактируем журнал//теперь если файл кончился уже не будем пропускать инструментwhile (fl_stop)
{
//заполняем новый файл истории записямиfor (i= 0 ;i<qty_smb;i++)
{
if (symbol_list[i]) //если работать не начали то и нехрен придумывать
{
if (tm_cur<h_time[i] || h_time[i]< 0 )
{ //нет такого бара на инструменте или вообще кончился файл инструмента
write_bars_hst_null(i); //придумываем его
lg_sk[i]++; //считаем придуманные бары
lg_sk_v[i]++; //считаем придуманные бары подряд
}
else
{ //такой бар есть копируем
write_bars_hst(i);
if (lg_sk_v[i]!= 0 )
{
//Однако пропущенные бары есть делаем запись в журнал
write_text_logs(i, "Нет баров-" +lg_sk_v[i]+ "\t " + TimeToStr (old_time[i], TIME_DATE | TIME_MINUTES )+ "\n" );
lg_sk_v[i]= 0 ;
}
}
}
}
//теперь находим следующий сушествующий на каком либо инструменте бар//бар должен быть самым старым//для этого считываем по одной записи с инструмента//у которого время меньше или равно только что обработанному//
ib= CurTime (); //просто взял молодое время :)for (i= 0 ;i<qty_smb;i++)
{
if (h_time[i]< 0 ) continue ; //пропускаем инструментif (h_time[i]<=tm_cur) read_bars_hst(i);
if (h_time[i]== 0 )
{
Print (symbol_m[i], " Кончился файл истории " , TimeToStr (old_time[i], TIME_DATE | TIME_MINUTES ));
write_text_logs(i, "Кончился файл истории \t " + TimeToStr (old_time[i], TIME_DATE | TIME_MINUTES )+
"\t синхронизировал " +cnt_bars+ " баров\n" );
h_time[i]=- 1 ; //будем пропускать данный инструмент
}
else
{ //бар есть//если он старее ib, то ib будет равен емуif (ib>h_time[i]) ib=h_time[i];
}
}
cnt_bars++;
//теперь присваиваем текущему времени самое старое из прочитанных
tm_cur=ib;
////проверяем не пора ли закончить тосить историю//если не осталось ни одного файла донора
fl_stop= false ;
for (i= 0 ;i<qty_smb;i++)
{
if (h_time[i]> 0 ) fl_stop= true ; //кто то живой остался :))
}
}
//----return ( 0 );
}
//+------------------------------------------------------------------+int init()
{
symbol_m[ 0 ]=symbol_0;
symbol_m[ 1 ]=symbol_1;
symbol_m[ 2 ]=symbol_2;
symbol_m[ 3 ]=symbol_3;
symbol_m[ 4 ]=symbol_4;
symbol_m[ 5 ]=symbol_5;
//ArrayInitialize (i_handle,- 1 );
ArrayInitialize (o_handle,- 1 );
ArrayInitialize (log_handle,- 1 );
ArrayInitialize (h_time, 0 );
ArrayInitialize (lg_sk, 0 );
ArrayInitialize (lg_sk_v, 0 );
return ( 0 );
}
//+------------------------------------------------------------------+void deinit()
{
//закрываем открытые файлы при выходе из скриптаfor ( int i= 0 ;i<qty_smb;i++)
{
if (i_handle[i]>= 0 ) { FileClose (i_handle[i]); i_handle[i]=- 1 ; } //файлы источникиif (o_handle[i]>= 0 ) { FileClose (o_handle[i]); o_handle[i]=- 1 ; } //файлы назначенияif (log_handle[i]>= 0 ) { FileClose (log_handle[i]); log_handle[i]=- 1 ; } //файлы журналов
}
Print ( "Работать закончил, синхронизировал " +cnt_bars+ " баров " );
//
}
//+------------------------------------------------------------------+//процедура копирования заголовка исторического файла//похоже это зря в процедуру оформил, фиг с нимbool copy_title_proc( int wi_handle, int wo_handle)
//на входе указатели файла донора и куда
{
int i_unused[ 13 ];
//FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE ); //версия//FileWriteString (wo_handle, FileReadString (wi_handle, 64 ), 64 ); //копирайтFileWriteString (wo_handle, FileReadString (wi_handle, 12 ), 12 ); //символ//FileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE ); //периодFileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE ); //количество знаков после точкиFileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE ); //незнаюFileWriteInteger (wo_handle, FileReadInteger (wi_handle, LONG_VALUE ), LONG_VALUE ); //незнаю//
FileReadArray(wi_handle,i_unused, 0 , 13 );
FileWriteArray (wo_handle,i_unused, 0 , 13 ); //незнаю//FileFlush (wo_handle);
//return ( true );
}
//+------------------------------------------------------------------+//чтение одной записи из файла истории в массивvoid read_bars_hst( int number)
//number-номер инструмента
{
old_time[number]=h_time[number]; //запоминаем дату для журнальчика
old_close[number]=h_close[number]; //запоминаем предыдущую цену
h_time[number]= FileReadInteger (i_handle[number], LONG_VALUE );
//
h_open[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
h_low[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
h_high[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
h_close[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
h_volume[number]= FileReadDouble (i_handle[number], DOUBLE_VALUE );
//
}
//+------------------------------------------------------------------+//запись одного бара в файл историиvoid write_bars_hst( int number)
{
FileWriteInteger (o_handle[number],h_time[number], LONG_VALUE );
//FileWriteDouble (o_handle[number],h_open[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],h_low[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],h_high[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],h_close[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],h_volume[number], DOUBLE_VALUE );
//FileFlush (o_handle[number]);
//
}
//---------------------------------------------------//запись одного пустого бара в файл историиvoid write_bars_hst_null( int number)
{
FileWriteInteger (o_handle[number],tm_cur, LONG_VALUE );
//FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],old_close[number], DOUBLE_VALUE );
FileWriteDouble (o_handle[number],volume_null, DOUBLE_VALUE );
//FileFlush (o_handle[number]);
//
}
//процедура записи в журналvoid write_text_logs( int number, string text)
{
FileWriteString (log_handle[number],text, StringLen (text));
FileFlush (log_handle[number]);
}
//---------------------------------------------------
好时间,先生们,决定开始在这个愚蠢的话题中发帖,如果有人有任何建议。
MT4失去了网络--服务器时钟不跳了,但 "连接状态 "显示一切正常。互联网是有保障的,没有任何忙乱。
这种情况每天都会发生很多次,经纪人的变化不会影响到一个情况。 终端只是卡在某个位置,而且感觉它可以永远停留在这个位置。
如果有任何提示,我们将不胜感激。
下午好。
我在编译过程中得到一个警告
由于类型转换而可能造成的数据损失
就行了。
int Stop_Loss = MarketInfo(Symbol(),MODE_STOPLEVEL);
MarketInfo的描述中说,它返回的类型是double。
但停止水平是一个整数,我想使用它
作为一个整数...
...是开发者的错,还是警告正确而我不理解?
下午好。
你能告诉我哪个经纪商在MT4上有最小的延迟(ping)吗?
这个问题偏离了主题,我们不在这里讨论经纪人。你不需要在两个论坛上问两次 问题。
对不起)
这个问题偏离了主题,我们不在这里讨论经纪人。你不需要在两个论坛上问两次 问题。
亲爱的程序员,请帮忙!!!
问题是这个脚本在最后一次更新 mt 之后没有完成它的工作。酒吧仍然失踪。
也许您可以针对新平台对其进行调整?或者也许还有另一个类似且有效的解决方案。搜索不返回任何结果。
提前致谢。
问题是,这个脚本在最后一次mt更新后并没有完成工作,条形图仍然没有。
能否为新的平台进行调整? 或者也许有一个类似的、可行的解决方案。
预先感谢。
我在哪里可以下载这个脚本,我只是不知道如何把这些代码弄到这么小的一个脚本里?
问题是,这个脚本在最后一次mt更新后不能工作了。
能否为新的平台进行调整? 或者也许有一个类似的、可行的解决方案。
预先感谢。
这里的 答案
我找到了问题所在。ObjectGet给出的是零,而不是时间和颜色。在我设置之后,也写了警告:由于类型转换,可能会丢失数据。那么该怎么做呢?如何修复它以发出我需要的东西?
更新:ObjectGetInteger给出了所有权利。我已经绞尽脑汁想了一个星期...
你好。
是否有办法保存自定义指标的 加载参数(通过代码头中的输入...初始化),然后加载它们,类似于测试EA时的做法?
我的意思是不写你自己的实用程序。
谢谢