datetime daytimes[]; int shift=10,dayshift,error; //---- массив Time[] отсортирован в порядке убывания ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1); error=GetLastError(); if(error==4066) { //---- делаем еще 2 попытки чтения for(int i=0;i<2; i++) { Sleep(5000); ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1); //---- проверим время текущего дневного бара datetime last_day=daytimes[0]; if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day)) break; } } if(Time[shift]>=daytimes[0]) dayshift=0; else { dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND); if(Period()<PERIOD_D1) dayshift++; } Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ", TimeToStr(daytimes[dayshift]));2) Что означает "другой программой"? Если это другой эксперт - тогда нужно исспользовать глобальные переменные - https://docs.mql4.com/ru/globals
Если совершенно другая программа (не связана с МТ4) тогда лучше всего - GlobalAddAtom
3) Никак. Dll-ы делают на C, Delphi и т.д.
Если совершенно другая программа (не связана с МТ4) тогда лучше всего - GlobalAddAtom
"
141 | RickD 08.06.2006 16:50
Попробуй через GlobalAddAtom. |
Я не силен в MQL4, подскажите, как правильно задать все параметры на конкретном примере.
В целом, мне необходимо отправить в другую программу сформированный в индикаторе файл, дождаться его обработки, вернуть полученный результат в индикатор, и продолжить его работу. Я пытался это делеть записывая файл из индикатора на диск, и тормозя дальнейшую работу индикатора выше указанным способом до тех пор, пока внешняя программа не обработает этот файл и не запишетего результат на диск, далее я считывал данные с диска в индикатор. Получается все очень медленно, много времени тратится на записи на диск, а торможение индикатора сильно замедляет обработку результатов в другой программе.
Как сделать все более корректно?
Все таки мне кажется, что сам подход ошибочный. Если не секрет - а что тако вы хотите сделать? Можеть это пройденный этап для многих?
Легче всего - импортируйте историю в .csv, потом обрабатывайте как хотите и наконец пусть в самом начале (init()) ваш индикатор откроет файл и сделает все, что надо. Иначе с этими паузами все умрет.
Все таки мне кажется, что сам подход ошибочный. Если не секрет - а что тако вы хотите сделать? Можеть это пройденный этап для многих?
Я сейчас так и поступаю, импортирую историю в .csv, пишу на диск, далее Матлабом читаю и обрабатываю. Проблема в том, что пока я обрабатываю в Матлабе, индикатор завершает свой цикл и вернуть в него результаты расчетов я могу только при поступлении следующего бара, что сводит на нет весь смысл анализа.
<я провожу анализ котировок в Матлабе>
ИМХО, пальба из пушек по воробьям. Но ежели так неймется, то в качестве идеи: можно попробовать сделать в сасмом начале функции start() счетчик тиков, при каждом тике опрашивать некий флажок, и пропускать тики до тех пор, пока Матлаб не выставит этот флажок (например, тоже в файле), что он обработку закончил и данные выгрузил.
Если не ошибаюсь, там есть возможность компилить матлабовские скрипты в том числе и в DLL.
DLL вы можете вызывать из МТ напрямую.
Вообще в Матлабе есть большой раздел связанный с интеграций с другими системами.
Наверняка вы там чтото полезное найдете.
Жаль что МТ всякие там OLE/ActiveX/COM не поддерживает ...
Тогда бы вообще небыло проблем со связью МТ с внешним миром
(практически все в виндах можно использовать черех СОМ)
<я провожу анализ котировок в Матлабе>
ИМХО, пальба из пушек по воробьям. Но ежели так неймется, то в
качестве идеи: можно попробовать сделать в сасмом начале функции
start() счетчик тиков, при каждом тике опрашивать некий флажок,
и пропускать тики до тех пор, пока Матлаб не выставит этот флажок
(например, тоже в файле), что он обработку закончил и данные выгрузил.
Подскажите, пожалуйста, как это сделать в виде примера.
В качестве идеи:
//+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int flg_allow; // этот флажок должен выставлять Матлаб. // Для примера, пусть он пишет в файл с // именем M_Flag.csv 0, если обработка данных // не закочилась, и -1, если можно рассчитывать // индикатор int file_handle; // хэндл сигнального файла M_Flag.csv static int n_ticks = 0; // счетчик пропущенных тиков static string file_name = "M_Flag.csv"; // имя сигнального файла //---- file_handle = FileOpen(file_name, FILE_CSV | FILE_READ); if ((file_handle > 0) && (FileSize(file_handle) > 0)) { flg_allow = FileReadInteger(file_handle); FileClose(file_handle); if (flg_allow >= 0) { n_ticks++; return(0); // досрочный выход } } else // была ошибка при чтении файла { // обработчик ошибки чтения файла (например, при первом // обращении создать его заново - см. справку) file_handle = FileOpen(file_name, FILE_CSV | FILE_WRITE); FileWriteInteger(file_handle, 0); FileClose(file_handle); } // здесь начинается выполнение основной программы пользовательского индикатора file_handle = FileOpen(file_name, FILE_CSV | FILE_WRITE); // возвращаем Матлабу количество пропущенных тиков, // вдруг ему для чего-нибудь понадобится FileWriteInteger(file_handle, n_ticks); FileClose(file_handle); // n_ticks = 0; // обнуляем счетчик тиков // // <тело индикатора> // //---- return(0); }Что-то в этом роде. Коряво, зато просто и быстро. Должно работать. Дерзайте!
(Чтобы не читать сигнальный файл на каждом тике, можно ввести параметр NTicks_Missed (число пропущенных тиков) и читать файл по условию if (n_ticks >= NTicks_Missed) { n_ticks = 0; // ToDo } else { n_ticks++; return(0); } ).
alexjou - спасибо, я попробую. Если Вы работаете также и с матлабом, может
быть подскажете мне, как из м-файла запустить на выполнение
программу, или правильно задать параметры библиотеки, а то я
с этим никогда не работал и не могу найти информацию по этому
вопросу.
Из командной строки файл запускается следующим выражением:
"C:Program Files DedBinDSt.exe" "D:Мои документыdemo.ded" /RUN Как мне запустить его на выполнение из м-файла? Если нельзя запустить напрямую, как оформить запуск в виде библиотеки? Мне прислали образец файла запуска в виде библиотеки, но мне не удается запустить его из м-файла, не знаю, как правильно задать параметры, чтобы матлаб не ругался. «Для примера я Вам высылаю dll-файл (см вложение), содержащий одну единственную функцию ExecCmd, при помощи которой можно вызвать исполняемый файл на выполнение. Вот заголовок функции, которая находится в файле bgexec.dll: BOOL ExecCmd(PChar lpCmdLine, DWORD lpExitCode, DWORD dwTimeOut, BOOL bTerminate): BOOL; При этом: lpCmdLine - это командная строка, которую необходимо выполнить. К примеру "C:Program FilesDedBinDSt.exe" "D:Мои документыdemo.ded" /RUN lpExitCode - адрес переменной, в которую будет записан код возврата работы приложения dwTimeOut - время ожидания завершения выполнения исполняемого файла (-1, если необходимо ждать до бесконечности) bTerminate - Признак того, необходимо ли принудительно завершить работу приложения в случае истечения таймаута.» Надеюсь на помощь, заранее благодарю. |
В матлабе очень хороший хелп, там все есть.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Например:
1) int limit;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if (limit==0)
{…….. …….блок, который должен выполняться после загрузки всей предъистории при поступлении последнего бара
}
Такой вариант у меня не срабатывает.
2) Как приостановить дальнейшее выполнение программы до того момента, пока метка МТ1 не будет установлена в 1 другой программой? Я пытаюсь следующим образом, но у меня тормозится выполнение других программ:
while (MT1==0)
{//8
Sleep(3000);
handle=FileOpen("MT1.csv", FILE_CSV, ',');
if(handle>0)
{//9
MT1=FileReadNumber(handle);
FileClose(handle);
}//9
}//8
Есть ли другой способ, подскажите, как правильно сделать.
3) Как в MetaEditor создать dll библиотеку?