Как ввести задержку на выполнение программы, как создать dll библиотеку

 
Как ввести задержку на выполнение блока программы до полной загрузки предъистории?
Например:
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 библиотеку?
 
1) Смотрим на https://docs.mql4.com/ru/array/ArrayCopySeries:
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.

1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.

"
Я не силен в MQL4, подскажите, как правильно задать все параметры на конкретном примере.
В целом, мне необходимо отправить в другую программу сформированный в индикаторе файл, дождаться его обработки, вернуть полученный результат в индикатор, и продолжить его работу. Я пытался это делеть записывая файл из индикатора на диск, и тормозя дальнейшую работу индикатора выше указанным способом до тех пор, пока внешняя программа не обработает этот файл и не запишетего результат на диск, далее я считывал данные с диска в индикатор. Получается все очень медленно, много времени тратится на записи на диск, а торможение индикатора сильно замедляет обработку результатов в другой программе.
Как сделать все более корректно?
 
Легче всего - импортируйте историю в .csv, потом обрабатывайте как хотите и наконец пусть в самом начале (init()) ваш индикатор откроет файл и сделает все, что надо. Иначе с этими паузами все умрет.

Все таки мне кажется, что сам подход ошибочный. Если не секрет - а что тако вы хотите сделать? Можеть это пройденный этап для многих?
 
Itso:
Легче всего - импортируйте историю в .csv, потом обрабатывайте как хотите и наконец пусть в самом начале (init()) ваш индикатор откроет файл и сделает все, что надо. Иначе с этими паузами все умрет.

Все таки мне кажется, что сам подход ошибочный. Если не секрет - а что тако вы хотите сделать? Можеть это пройденный этап для многих?

Секрета нет, я провожу анализ котировок в Матлабе, для этого мне нужно в него переслать котировки из индикатора, а после анализа вернуть результат в индикатор и наложить его на график. Проблема в том, что и Матлаб очень замороченный пакет, и MQL4 слабый по своим возможностям, особенно при взаимодействии с внешними программами, к тому же я его практически не знаю.
Я сейчас так и поступаю, импортирую историю в .csv, пишу на диск, далее Матлабом читаю и обрабатываю. Проблема в том, что пока я обрабатываю в Матлабе, индикатор завершает свой цикл и вернуть в него результаты расчетов я могу только при поступлении следующего бара, что сводит на нет весь смысл анализа.
 

<я провожу анализ котировок в Матлабе>

ИМХО, пальба из пушек по воробьям. Но ежели так неймется, то в качестве идеи: можно попробовать сделать в сасмом начале функции start() счетчик тиков, при каждом тике опрашивать некий флажок, и пропускать тики до тех пор, пока Матлаб не выставит этот флажок (например, тоже в файле), что он обработку закончил и данные выгрузил.

 
В матлабе есть компилятор, в хелпе описано как им пользоваться.
Если не ошибаюсь, там есть возможность компилить матлабовские скрипты в том числе и в DLL.
DLL вы можете вызывать из МТ напрямую.

Вообще в Матлабе есть большой раздел связанный с интеграций с другими системами.
Наверняка вы там чтото полезное найдете.

Жаль что МТ всякие там OLE/ActiveX/COM не поддерживает ...
Тогда бы вообще небыло проблем со связью МТ с внешним миром
(практически все в виндах можно использовать черех СОМ)
 
alexjou писал (а):

<я провожу анализ котировок в Матлабе>

ИМХО, пальба из пушек по воробьям. Но ежели так неймется, то в качестве идеи: можно попробовать сделать в сасмом начале функции start() счетчик тиков, при каждом тике опрашивать некий флажок, и пропускать тики до тех пор, пока Матлаб не выставит этот флажок (например, тоже в файле), что он обработку закончил и данные выгрузил.


Подскажите, пожалуйста, как это сделать в виде примера.
 
В самом Матлабе есть встроенный переводчик *.m -> *.c, *.cpp, по крайней мере, в версии 6.5 (у меня такая). Дальше полученный код лучше всего перелопатить на предмет оптимизации и повышения удобочитаемости, если предполагается работать с ним и далее, добавить поддержку АХ и СОМ, сделать много чего еще, после чего пользоваться штатным компилятором С, установленным в системе (сам Матлаб им же и пользуется; при установке матлабовского С-компилятора сетап обязательно спросит, какой штатный. Если никакой не установлен, МСС, скорее всего, тоже откажется становиться). OLE/ActiveX/COM можно подключить с помощью длл-коммуникатора: одним концом, подключенным к МТ, она не АХ, а другим - предоставляет внешним приложениям некую модель объектов. Вообще, это большой геморрой.

В качестве идеи:
//+------------------------------------------------------------------+
//| 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 - Признак того, необходимо ли принудительно завершить
работу приложения в случае истечения таймаута.»

Надеюсь на помощь, заранее благодарю.

 
Блин, вы читать умеете?
В матлабе очень хороший хелп, там все есть.
Причина обращения: