IsConnected() - страница 2

 
Matutin:

Просто вызовите start() из init() ...и вы будете в start() даже без тика!

спасибо вам 2
 
Viffer:

Расширяя мою ссылку выше... Я запускаю отдельный советник для мониторинга состояния соединения. В нем весь код для моего теста закодирован внутри start с sleep в конце. Start - это, по сути, большой цикл, когда он завершается, он возвращается в начало. Но вместо того, чтобы ждать тика для запуска, я вызываю start() внутри init(). Таким образом, start() продолжает цикл с sleep, а init() никогда не завершается, поэтому код выполняется на основе временных интервалов от sleep, а не в ожидании тика... ссылка выше показывает принцип...

hth

V


Матутин:

Просто вызовите start() из init() ...и вы окажетесь в start() даже без прихода тика!


Это не решит проблему, потому что init() также не запускается, если нет соединения.

Единственный способ сделать это - использовать скрипт; проблема в том, что нет способа открыть терминал со скриптом Loaded

 
qjol:


ни один из этих способов не решает проблему, потому что init() также не запускается, если нет соединения

единственным способом сделать это является скрипт; проблема в том, что нет способа открыть терминал со скриптом Loaded


Давайте посмотрим на инструменты MT4i.com. Я использую их для мониторинга соединения и отправки оповещений по почте или смс.

http://www.mt4i.com/mtdashboard.aspx

 
Matutin:

Просто вызовите start() из init() ...и вы будете в start() даже без наступления тика!

НЕТ! Это недопустимо. Ожидается, что init() вернется через 2 секунды. Init не разрешается блокировать! Всевозможные проблемы могут (и будут) возникать из-за этого.

Просто сделайте цикл в start и ожидайте, что start будет вызван автоматически на следующем доступном тике после загрузки советника. Были тики до разрыва соединения, поэтому ваш цикл уже будет запущен, когда произойдет это событие.


Если вам действительно нужно вызвать start() из init(), потому что вам нужно, чтобы он выполнялся в выходные, то единственный правильный способ - это использовать трюк PostMessage() для принудительного запуска тика. Вы публикуете сообщение, а затем позволяете init вернуться! После этого MT4 вызовет start() обычным способом, и init() не будет блокироваться.


Пример смотрите в следующем сообщении.

 
// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}
Это единственный правильный способ принудительного запуска start() из init() в советнике. Вы не можете сделать это в индикаторе, поскольку там start() будет выполняться в потоке GUI.
 
/**
* MT4/experts/scripts/ticks.mq4
* send a fake tick every 200 ms to the chart and
* all its indicators and EA until this script is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);
      Sleep(200);
   }
}
Для полноты картины выше приведен скрипт, который я использую для имитации фальшивых тиков в выходные дни. Вам он не нужен, это только пример. В основном это полезно для отладки других советников и индикаторов.
 
/**
* this is a variation of the above script meant to be run as an EA.
* Send a fake tick every 200 ms to the chart and
* all its indicators until this EA is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue the first fake tick
}

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);  // produce more fake ticks
      Sleep(200);
   }
}

Это то же самое, что и сценарий выше, но реализованный как советник, демонстрирующий обе концепции в одном советнике.

В init() он регистрирует самый первый тик, чтобы вызвать первый start(), а затем в start() он будет производить больше тиков в бесконечном цикле. Эти тики затем будут подхвачены всеми индикаторами на одном и том же графике.

 
7bit:
Это единственный правильный способ принудительного запуска start() из init() в советнике. Вы не можете сделать это в индикаторе, так как там start() будет выполняться в потоке GUI.

// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}

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

 
qjol:


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

Но она должна продолжать работать после запуска в нормальных условиях (что должно быть обычным случаем использования). Попробуйте отключиться после запуска.


И это служит примером того, как избежать блокировки init() и запустить его как советник, а не как скрипт.

 
7bit:

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


И это служит примером того, как избежать блокировки init() и запустить его как советник вместо скрипта.


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

Причина обращения: