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

 
7bit:

Это можно проверить, просто запустите проверку в бесконечном цикле. как запустить этот цикл при запуске терминала во время обрыва связи - это совершенно отдельная проблема. Как только вы запустили цикл, он будет делать то, что ожидается.

Ваша проблема не имеет никакого отношения к функции IsConnected(). С тем же аргументом вы могли бы пожаловаться на Print() или Alert() или любую другую функцию, которую вы не можете вызвать, потому что не смогли запустить весь код с самого начала по какой-то совершенно другой причине.


Хорошо, позвольте мне объяснить кое-что Потому что я использую много Terminlas Все время мое использование процессора увеличивается до 100 процентов, поэтому мне нужно отключить несколько терминалов

И когда я включаю их (конечно, автоматически), я видел несколько раз, что они не подключены, и советник, работающий на них, не сообщал, что нет соединения,

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

 

Возможно, это связано с "особенностью", которая была впервые представлена в Windows XP SP2, которая отказывается иметь более чем несколько полуоткрытых соединений в любое время, в основном, чтобы раздражать людей, которые хотят использовать приложения с интенсивным использованием сети. AFAIK существуют методы исправления этой раздражающей "особенности" и восстановления нормальной работоспособности: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php.

Ищите событие 4226 в журнале событий windows.

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

Это хорошо, но не всегда работает, поскольку тик может исчезнуть еще до возврата init(), и в этом случае тик отбрасывается. Чтобы подчеркнуть это, если вы добавите паузу в 5 мс после

PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return

то start() не будет выполнен.

Есть ли лучшее решение, чтобы start() выполнялся при загрузке советника, не требуя реального тика от брокера?

 

Я немного стар, ноищу решение той же проблемы, которую я получил в этой теме.

На самом деле, утверждение qjol о том, что "единственный способ сделать это - это запустить скрипт; проблема в том, что нет способа открыть терминал с загруженным скриптом", частично верно. Со скриптом ок, но есть способ запустить скрипт с клиентским терминалом. Это описано в справке metatrader (F1, Tools, Configuration at Startup). Возможно, на момент создания этой темы это было не так.

Поэтому я разработал небольшой скрипт для выполнения этой работы. Используйте его со стартовым скриптом, например:

  ; open chart and run expert and/or script
  Symbol=EURUSD
  Period=H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

И терминал запускается с чем-то вроде :

"...\Metatrader 4\terminal.exe" config\start.ini

Файлы:
 

Привет ребята,

Кто-нибудь из васзнает, почему не работает скрипт fake ticks - https://www.mql5.com/en/forum/128803/page2#373539(страница 2) этой темы для билда 600++?

Моя ОС - Vista. Спасибо.

 
endy5:

Привет ребята,

Кто-нибудь из васзнает, почему не работает скрипт fake ticks - https://www.mql5.com/en/forum/128803/page2#373539(страница 2) этой темы для билда 600++?

Моя ОС - Vista. Спасибо.

Поскольку билд > 600, вам нужно заменить "A" для ansi на "W" для unicode.

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
 

почему в параметре используется 2 и 1

PostMessageA(hwnd, msg, 2, 1)
 
iamsuman2:

почему в параметре используется 2 и 1

Это выходит за рамки MQL, проверьте функцию здесь:

 

На случай, если кто-то еще ищет информацию о функции IsConnected().

Итак, да, функция не будет работать в функции start() или OnTick(), потому что если нет соединения, то не будет нового тика, и функция не сработает в любом случае.....

Так что же нам делать?

Использовать функцию OnTimer(), чтобы регулярно проверять наличие соединения, независимо от входящих тиков.

int timer = 60;   //60 seconds, for example
int OnInit()
  {
//--- create timer
   EventSetTimer(timer);  //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return(INIT_SUCCEEDED);
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer()
  {
    if(!IsConnected())
      Alert("Problem, not connection to the server!");
  }

void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
      
 

fridayda13:

Так что да, функция не будет работать в функции start() или OnTick(), потому что если нет соединения, то новый тик не появится, и функция не сработает в любом случае.....

Так что же нам делать?

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

Вы не должны ничего делать, потому что вы ничего не можете сделать. Пройдет 30+ секунд, прежде чем сеть отключится и функция изменит значение. Что вы собираетесь делать, когда ничего не изменилось и у вас нет соединения?

Это полезно, только если вы никогда не возвращаетесь из start/OnTick (проверяйте ее перед отправкой ордера) или после OrderSend для повторных попыток в пределах одного тика.

Вместо этого, если OrderSend не сработает, запишите это в журнал, вернитесь и проверьте/повторите попытку на следующем тике. Готово.

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