Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 185

 

Добрый день.

Необходимо, чтобы после после определенного события советник завершал работу.

я так понимаю это функция deinit(), мне нужно ее как то вызвать. Цитата из учебника:

"Специальная функция deinit() вызывается для исполнения клиентским терминалом также при завершении работы клиентского терминала, при закрытии окна финансового инструмента, непосредственно перед сменой финансового инструмента и/или периода графика, при удачной перекомпиляции программы в редакторе MetaEditor, при смене входных параметров, а также при смене счета. "

То есть мне нужно вручную, например, закрыть терминал, чтобы эта функция вызывалась?

Я пытался вызвать эту функцию при срабатывании условия, она выполнялась, но приходил новый тик и снова запускалась функция start.

int deinit()
  {
  Alert("Закрываем программу"); 
   return(0);
  }

int start()
{
//код
..............
if (OrdersTotal()==0) deinit();
return(0);
}



Как мне все таки завершить программу?

Спасибо.

 
GygaByte:

Добрый день.

Необходимо, чтобы после после определенного события советник завершал работу.

я так понимаю это функция deinit(), мне нужно ее как то вызвать. Цитата из учебника:

"Специальная функция deinit() вызывается для исполнения клиентским терминалом также при завершении работы клиентского терминала, при закрытии окна финансового инструмента, непосредственно перед сменой финансового инструмента и/или периода графика, при удачной перекомпиляции программы в редакторе MetaEditor, при смене входных параметров, а также при смене счета. "

То есть мне нужно вручную, например, закрыть терминал, чтобы эта функция вызывалась?

Я пытался вызвать эту функцию при срабатывании условия, она выполнялась, но приходил новый тик и снова запускалась функция start.

Как мне все таки завершить программу?

Спасибо.

Чтобы программно закрыть терминал, в самом начале кода перед функцией start() вставьте:

//----
#import "user32.dll"
int GetParent(int hWnd);  // вызов API
#import
//----

В функции start(), когда вам необходимо закрыть терминал, вызываете функцию ExitMT4(), которую объявляете за пределами функции start()

//+----------------------------------------------------------------------------+
void ExitMT4() {  // выгрузить MT4 из памяти

   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
//----
   while(!IsStopped()) {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
      }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
}
//+----------------------------------------------------------------------------+
 
artmedia70:

Чтобы программно закрыть терминал, в самом начале кода перед функцией start() вставьте:

В функции start(), когда вам необходимо закрыть терминал, вызываете функцию ExitMT4(), которую объявляете за пределами функции start()



Большое спасибо за развернутый ответ.

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

Я думаю deinit() как то должен решить этот вопрос, но видимо я что-то не так делаю..

 

Не могу удалить с компа Terminal.exe от Alpari Limited, build 509.

При использовании панели управления для удаления выдается "У Вас недостаточно прав для удаления. Обратитесь к системному Администратору!"

При использовании Uninstall.exe выдает "Сервер возвратил ссылку".

Техподдержка Alpari ничего вразумительного сказать не может, предлагает просто снести всю папку и установить терминал в другую директорию.

Стоит Win 7, Ultimate. Права администратора активированы, Uninstall.exe запускал от имени Администратора.

Буду очень благодарен за любой совет по решению данной проблемы

 
GygaByte:


Большое спасибо за развернутый ответ.

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

Я думаю deinit() как то должен решить этот вопрос, но видимо я что-то не так делаю..

Не deinit(), а return(0);
 
artmedia70:
Не deinit(), а return(0);


Если не ошибаюсь, return(0) просто завершит текущую функцию start() и будет ждать следующего тика, а мне нужно, чтобы советник завершил работу, как если бы я вручную открепил советник от графика.

Я проверил на практике - бесконечно с каждым тиком выдает алерт "Открытых ордеров - 0"

Заветного "Пока" не дождался

int start()
  {
  if (OrdersTotal()==0) 
   {
   Alert("Открытых ордеров - ", OrdersTotal());
   return(0);
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert("Пока");  
   return(0);
  }
 
polycomp:

Не могу удалить с компа Terminal.exe от Alpari Limited, build 509.

При использовании панели управления для удаления выдается "У Вас недостаточно прав для удаления. Обратитесь к системному Администратору!"

При использовании Uninstall.exe выдает "Сервер возвратил ссылку".

Техподдержка Alpari ничего вразумительного сказать не может, предлагает просто снести всю папку и установить терминал в другую директорию.

Стоит Win 7, Ultimate. Права администратора активированы, Uninstall.exe запускал от имени Администратора.

Буду очень благодарен за любой совет по решению данной проблемы

Некоторые злостные программки (mail.ru у меня было) перераспределяют права доступа и делают так что вы с правами администратора не имеете доступа к их удалению.

Проблема решалась методом научного тыка в перераспределении прав ( ПКМ на папке, свойства, безопасность, изменить, добавить,дополнительно,типы обьектов,поиск.......)

Но потом познакомился с "Revo uninstaller" и весь гемор с удалением чего-то пропал, + увереность что реестр почищен ОТ их деятельности.

 
GygaByte:


Если не ошибаюсь, return(0) просто завершит текущую функцию start() и будет ждать следующего тика, а мне нужно, чтобы советник завершил работу, как если бы я вручную открепил советник от графика.

Я проверил на практике - бесконечно с каждым тиком выдает алерт "Открытых ордеров - 0"

Заветного "Пока" не дождался

Ваше желание напоминает анекдот про "шашечки". Если нужно, чтобы советник перестал торговать, то через активацию (глобального) флага (после наступления каких-то условий), прерывание функции start() (выход через return) даст ожидаемый результат.
 
ALXIMIKS:

Некоторые злостные программки (mail.ru у меня было) перераспределяют права доступа и делают так что вы с правами администратора не имеете доступа к их удалению.

Проблема решалась методом научного тыка в перераспределении прав ( ПКМ на папке, свойства, безопасность, изменить, добавить,дополнительно,типы обьектов,поиск.......)

Но потом познакомился с "Revo uninstaller" и весь гемор с удалением чего-то пропал, + увереность что реестр почищен ОТ их деятельности.

Большое спсибо! Буду знакомиться с Revo uninstaller.
 
TarasBY:
Ваше желание напоминает анекдот про "шашечки". Если нужно, чтобы советник перестал торговать, то через активацию (глобального) флага (после наступления каких-то условий), прерывание функции start() (выход через return) даст ожидаемый результат.

Это, примерно, выглядит так:

bool GlobalFlag;
int init()
{
   GlobalFlag = true;
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
      if (OrdersTotal() == 0) 
      {
         GlobalFlag = false;
         Alert("Открытых ордеров - ", OrdersTotal());
         Alert("Пока");  
      }  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
Причина обращения: