문제는 이 스크립트가 mt의 마지막 업데이트 이후에 제 기능을 하지 않는다는 것입니다. 막대가 아직 누락되었습니다.
새로운 플랫폼에 맞게 조정할 수 있습니까? 또는 다른 유사하고 작동하는 솔루션이 있을 수 있습니다. 검색은 결과를 반환하지 않습니다.
미리 감사드립니다.
//+------------------------------------------------------------------+//| 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 설명에는 이중 유형을 반환한다고 나와 있습니다.
하지만 정지 수준은 정수이고 사용하고 싶습니다.
전체적으로..
.. 이것은 개발자의 버그입니까, 아니면 경고가 정확하고 이해하지 못합니까?
안녕하세요.
MT4에서 어떤 브로커가 최소 지연(ping)을 하는지 알려주세요.
질문은 주제에서 벗어났습니다. 브로커는 여기에서 논의되지 않습니다. 2개의 포럼에서 2번 질문할 필요는 없습니다.
죄송합니다)
질문은 주제에서 벗어났습니다. 브로커는 여기에서 논의되지 않습니다. 2개의 포럼에서 2번 질문할 필요는 없습니다.
친애하는 프로그래머, 도와주세요!!!
문제는 이 스크립트가 mt의 마지막 업데이트 이후에 제 기능을 하지 않는다는 것입니다. 막대가 아직 누락되었습니다.
새로운 플랫폼에 맞게 조정할 수 있습니까? 또는 다른 유사하고 작동하는 솔루션이 있을 수 있습니다. 검색은 결과를 반환하지 않습니다.
미리 감사드립니다.
친애하는 프로그래머, 도와주세요!!!
문제는 이 스크립트가 mt의 마지막 업데이트 이후에 제 기능을 하지 않는다는 것입니다. 막대가 아직 누락되었습니다.
새로운 플랫폼에 맞게 조정할 수 있습니까? 또는 다른 유사하고 작동하는 솔루션이 있을 수 있습니다. 검색은 결과를 반환하지 않습니다.
미리 감사드립니다.
이 스크립트를 어디서 다운로드할 수 있습니까? 이 모든 코드를 작은 스크립트에 푸시하는 방법을 모르겠습니다.
친애하는 프로그래머, 도와주세요!!!
문제는 이 스크립트가 mt의 마지막 업데이트 이후에 제 기능을 하지 않는다는 것입니다. 막대가 아직 누락되었습니다.
새로운 플랫폼에 맞게 조정할 수 있습니까? 또는 다른 유사하고 작동하는 솔루션이 있을 수 있습니다. 검색은 결과를 반환하지 않습니다.
미리 감사드립니다.
여기에 답변
문제를 찾았습니다. ObjectGet은 시간과 색상 대신 0을 반환합니다. 이것은 또한 strict가 설정된 후 경고에 기록됩니다: 형식 변환으로 인한 데이터 손실 가능성 . 그래서 뭐 할까? 필요한 것을 제공하도록 수정하는 방법은 무엇입니까?
upd: ObjectGetInteger는 모든 것을 잘 생성합니다. 일주일동안 정신을 가다듬고...
여보세요,
Expert Advisors를 테스트할 때와 유사한 방식으로 사용자 지정 표시기 로드 매개변수(코드 헤더에서 입력을 통해 초기화됨)를 저장한 다음 로드하는 방법이 있습니까?
내 말은, 자신의 유틸리티를 작성하지 않고 말입니다.
감사해요