Ошибки, баги, вопросы - страница 2615

 
 return a++;

Так оказывается нельзя делать :( ++ в этом случае не работает, хотя в более сложном виде так вообще возвращает "a" а после каким то способом выполняет ++, т.е. возвращенное значение не равно "a"

 int tt=0;
 #define AAA (0==0) ? (tt++):0
int Primer() {return AAA;}
void OnStart()
  {
  int a=Primer();
  Print(a," ",tt, a!=tt? " WTF?!!": "");
  
  }

2019.12.09 16:17:51.363 proba (EURUSD,H1) 0 1 WTF?!!


build 2093
 
fxsaber:

Мне нужно, чтобы советник, выполняющийся на Агенте, смог получить хендл Терминала, из которого он был отправлен на выполнение в Агенте.

сложная задача, даже не представляю как запускаются агенты, думаю, что если прогуглить PID родительского процесса по моему еще больше усложнит все

задачу не знаю, но по моему нужно некий идентификатор (магик-номер) передавать в агенты и там обрабатывать


ЗЫ: почему то мне кажется, что даже чтение файла расположенного на RAMDisk будет быстрее чем несколько раз вызывать WinAPI при поиске родительского процесса, т.е. писать в файл в общей папке 

 
Alexandr Andreev:

2019.12.09 16:17:51.363 proba (EURUSD,H1) 0 1 WTF?!!

Так все правильно. a получает tt до инкремента.

 
Igor Makanu:

задачу не знаю

https://www.mql5.com/ru/forum/321656/page31#comment_14170117

 
fxsaber:

Так все правильно. a получает tt до инкремента.

Ну да что то совсем забыл про "i++" "++i"

 

понятно, т.е. решаете извечную проблему обмена данными между терминалами, не думал в этом направлении, я обычно все в dll пишу, что не решается в MQL, в WinAPI редко когда ищу решения - долго

ЗЫ: вчера почитывал про SQLite, в описании однозначно присутствует разъяснение, что БД можно открыть как для записи так и только для чтения, саму dll БД можно установить отдельно, я бы там поискал оптимальное решение обмена данными,  нужно будет поизучать этот материал

 
Igor Makanu:

понятно, т.е. решаете извечную проблему обмена данными между терминалами

Нет. Нужно получение данных Тестера, из которого запущен советник. Для 90% случаев это умею делать.

 
fxsaber:

Мне нужно, чтобы советник, выполняющийся на Агенте, смог получить хендл Терминала, из которого он был отправлен на выполнение в Агенте.

про агенты не скажу. не проверял, но хендл терминала, как и предполагал, через PID можно получить:

#define   READ_CONTROL   0x00020000
#define   bInheritHandle true

#include <WinAPI\processthreadsapi.mqh>
int OnInit()
  {
   uint process_id = GetCurrentProcessId();
   Print("process_id = ",process_id);
   HANDLE handle = OpenProcess(READ_CONTROL,bInheritHandle,process_id);	// https://docs.microsoft.com/ru-ru/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess?redirectedfrom=MSDN
   Print("handle = ",handle);
   return(INIT_SUCCEEDED);
  }

2019.12.09 21:05:36.259 tst_Wapi (EURUSD,H1) process_id = 9280

2019.12.09 21:05:36.259 tst_Wapi (EURUSD,H1) handle = 2276

вот проверил PID в диспетчере задач совпадает


 
Igor Makanu:

про агенты не скажу. не проверял, но хендл терминала, как и предполагал, через PID можно получить:

2019.12.09 21:05:36.259 tst_Wapi (EURUSD,H1) process_id = 9280

2019.12.09 21:05:36.259 tst_Wapi (EURUSD,H1) handle = 2276

вот проверил PID в диспетчере задач совпадает

Такой код подойдет для Сервиса, но не для советника на Агенте.

 
Igor Makanu:

про агенты не скажу. не проверял, но хендл терминала, как и предполагал, через PID можно получить:

2019.12.09 21:05:36.259 tst_Wapi (EURUSD,H1) process_id = 9280

2019.12.09 21:05:36.259 tst_Wapi (EURUSD,H1) handle = 2276

вот проверил PID в диспетчере задач совпадает

Решил задачу, Спасибо.