Самоликвидация

 

Есть система, состоящая из нескольких экспертов, работающих с одним инструментом. Могут ли они удалить/деиницилизировать сами себя после отработки неких условий.

Вариант

extern int ticks_cnt=10;
int start() {
   if(!ticks_cnt)      
      return();  
   ticks_cnt--;
   Print("TicksCnt=",ticks_cnt);
	....   
   return(0);
  }
не подходит. Есть другие идеи ?

Спасибо
 
Вот конкретный пример скрипта создающего файл в папке и затем удаляющий его (через 1 минуту). Вставте подобный код в эксперта и при заданном условии он сотрет сам себя.

//-------------Del_file----------------------
#import "kernel32.dll"
bool DeleteFileA(string lpFileName);   // path\file name 
#import
 
int start() 
{
  
  string fName = StringConcatenate(WindowExpertName(), "\\filename.csv" );
  int hh=FileOpen(fName,FILE_CSV|FILE_WRITE);   //  файл будет создан в папке \experts\files\Del_file [имя скрипта из которого вызывается функция]\filename.csv
  FileClose(hh);
  Sleep(60000);//   пауза, что бы успели посмотреть что файл создан и потом удален
  
//  DeleteFileA("C:\MIG_MT4\experts\files\Del_file\filename.csv"); // удалять надо конкретно указывая полный путь или так или см. ниже
 
  string fName_del=StringConcatenate("C:\MIG_MT4\experts\files\\",WindowExpertName(), "\\filename.csv" );
  DeleteFileA(fName_del);
 
  
  return(0);
}
//+------------------------------------------------------------------+
 

Если эксперты работают в одном и том же клиентском терминале, то для их взаимодействия можно использовать глобальные переменные

 
GSB спасибо.
Возможно я не точно обозначил задачу. Мне нужно не удалить файл ex4, а прекратить выполнение эксперта путем например удаления его с графика или любым из способов, описанных в
UninitializeReason()
 
GSB:
Вот конкретный пример скрипта создающего файл в папке и затем удаляющий его (через 1 минуту). Вставте подобный код в эксперта и при заданном условии он сотрет сам себя.

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

bool Finish=False;
 
start(
if(Finish)return;
.......
if( /* Условие отключения эксперта*/ ) 
  {Finish=true; Print(" Эксперт N отключен");return;}
.....
Тогда эксперт на каждом тике будет сразу же прекращать работу.
 

Спасибо но это не то. Надо чтобы ему на этом самом тике некуда было входить

 
То что хотите - невозможно (вернее возможно, но очень и бессмысленно сложно). Если у вас все советники находятся на одном терминале - смотрите выше. Если у вас мnого терминалов - GlobalAddAtom - 'взаимодействие советников из разных терминалов'
 
Digger:

Спасибо но это не то. Надо чтобы ему на этом самом тике некуда было входить

Тогда можно попробовать так: послать своему окну ( или чужому, передав его хэндл в глобальной переменной), команду на закрытие окна.
#include <WinUser32.mqh>
extern int exit;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    int win_handle=WindowHandle(Symbol(),Period());


      if(win_handle!=0) 
       if(Minute() > exit)
        PostMessageA(win_handle,WM_CLOSE,0,0);     
   return(0);
  }
//+------------------------------------------------------------------+
Эксперт будет удалён вместе с графиком.
 
Valmars:
Digger:

Спасибо но это не то. Надо чтобы ему на этом самом тике некуда было входить

Тогда можно попробовать так: послать своему окну ( или чужому, передав его хэндл в глобальной переменной), команду на закрытие окна.
#include <WinUser32.mqh>
extern int exit;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    int win_handle=WindowHandle(Symbol(),Period());


      if(win_handle!=0) 
       if(Minute() > exit)
        PostMessageA(win_handle,WM_CLOSE,0,0);     
   return(0);
  }
//+------------------------------------------------------------------+
Эксперт будет удалён вместе с графиком.




Вот это уже интересно. Большое спасибо. А как узнать возвращает ли 
WindowHandle(Symbol(),Period())
 дескриптор именно того окна к которому прикреплен эксперт. В моем случае открыты несколько окон с одинаковыми Symbol(), Period(). Ко всем ним прикрепленны эксперты с одинаковыми именнами
но с разными Magic numbers & input parameters
 
Digger:

Вот это уже интересно. Большое спасибо. А как узнать возвращает ли
WindowHandle(Symbol(),Period())
дескриптор именно того окна к которому прикреплен эксперт. В моем случае открыты несколько окон с одинаковыми Symbol(), Period(). Ко всем ним прикрепленны эксперты с одинаковыми именнами
но с разными Magic numbers & input parameters


Вопрос к профессионалам, я же любитель и не знаю Виндовских функций. Во всяком случае, в приведённом примере закрытия по времени, два одинаковых эксперта, прикреплённых к графикам одного инструмента и периода, закрывали именно своё окно и удаляли себя.
Кто-бы пояснил ещё, что означают два последних параметра в функции PostMessageA ?
 
Digger:

Есть система, состоящая из нескольких экспертов, работающих с одним инструментом. Могут ли они удалить/деиницилизировать сами себя после отработки неких условий.

Вариант

extern int ticks_cnt=10;
int start() {
   if(!ticks_cnt)      
      return();  
   ticks_cnt--;
   Print("TicksCnt=",ticks_cnt);
	....   
   return(0);
  }
не подходит. Есть другие идеи ?

Спасибо
Добрый день

т е разные эксперты
друг другу подают сигналы о дективации - активации ?

типа: я отработал - вышел - твоя очередь

СМЫСЛ ЗАДАЧИ в том что бы торговать разными стратегиями на одной паре ?

мне кажется вполне можно организовать  подобный "разговор" между экспертами через глобальные переменные
Причина обращения: