Скачать MetaTrader 5

Эмуляция прерываний в MQL4?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В сервисе Фриланс участвуют тысячи разработчиков. Присоединяйся!
GreinV
77
GreinV 2011.08.16 17:02 
Для работы с графическими элементами требуется делать обращения к функциям с периодичностью несколько раз в сек. Тиковые "прерывания" не устраивают. Что делать?, зацикливаться внутри тика не есть хорошо наверное, так-как возможна потеря/пропуск тиковой котировки. Какие-то есть решения в MQL4!
Vadim Zhunko
5226
Vadim Zhunko 2011.08.16 17:08  
Зациклить скрипт или эксперт внутри start().
GreinV
77
GreinV 2011.08.16 18:02  
Zhunko:
Зациклить скрипт или эксперт внутри start().

И забирать котировки самому через функцию, ок! А не получится там переполнения какого-нибудь в стеке или очереди много потоковости процессов? Ведь функция Старт() отрабатывается на каждом тике, и получается что зациклившись в "тике" мы не будем возвращать значение возврата (return) функции, а вызов функции будет происходить каждый тик, отсюда возможное переполнение указателей стека и зависание препроцессора!? Ну по аналогии с ассемблером, пуш и поп команды, сами знаете что там шутки плохи!
Maxim Zaguzov
1416
Maxim Zaguzov 2011.08.16 18:07  
Grein:

И забирать котировки самому через функцию, ок! А не получится там переполнения какого-нибудь в стеке или очереди много потоковости процессов? Ведь функция Старт() отрабатывается на каждом тике, и получается что зациклившись в "тике" мы не будем возвращать значение возврата (return) функции, а вызов функции будет происходить каждый тик, отсюда возможное переполнение указателей стека и зависание препроцессора!? Ну по аналогии с ассемблером, пуш и поп команды, сами знаете что там шутки плохи!
Ответ:
Учебник:

В экспертах специальная функция start() вызывается (и исполняется) сразу после прихода очередного тика. Если новый тик поступил в период выполнения специальной функции start(), то этот тик будет проигнорирован, т.е. вызов на исполнение специальной функции start() в момент прихода такого тика осуществляться не будет. Все котировки, пришедшие в период выполнения специальной функции start(), будут проигнорированы. Запуск специальной функции start() на исполнение производится клиентским терминалом только при условии, что предыдущий сеанс работы полностью завершён, управление передано клиентскому терминалу и специальная функция start() находится в ожидании нового тика.
Maxim Zaguzov
1416
Maxim Zaguzov 2011.08.16 18:15  
Grein:

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

Ага. Точно. Все знают про это! :)))))

Andrey F. Zelinsky
31288
Andrey F. Zelinsky 2011.08.16 18:21  
Grein:
Для работы с графическими элементами требуется делать обращения к функциям с периодичностью несколько раз в сек. Тиковые "прерывания" не устраивают. Что делать?, зацикливаться внутри тика не есть хорошо наверное, так-как возможна потеря/пропуск тиковой котировки. Какие-то есть решения в MQL4!

время запоминать и проверять сколько секунд прошло - не подходит?
Boris
503
Boris 2011.08.16 19:21  

Учебник:

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

Используйте : RefreshRates();

Stanislav Korotky
17876
Stanislav Korotky 2011.08.16 19:33  
Grein:

И забирать котировки самому через функцию, ок! А не получится там переполнения какого-нибудь в стеке или очереди много потоковости процессов? Ведь функция Старт() отрабатывается на каждом тике, и получается что зациклившись в "тике" мы не будем возвращать значение возврата (return) функции, а вызов функции будет происходить каждый тик, отсюда возможное переполнение указателей стека и зависание препроцессора!? Ну по аналогии с ассемблером, пуш и поп команды, сами знаете что там шутки плохи!
Из вопроса не совсем ясно, о каких графических элементах речь - если об объектах на чартах, то ничего страшного, а если нужно работать с контролами и используется dll, то имеет смысл реализовать семафор, поскольку МТ4 нереентерабелен в плане вызовов функции start (и цитата из учебника, приведенная MaxZ, не совсем верна). Подробности можно посмотреть здесь - Проблема: цикл обработки сообщений Windows и сброс локального контекста в start.
Rustamzhan Salidzhanov
7683
Rustamzhan Salidzhanov 2011.08.16 19:48  

циклить init()

Для работы с графическими элементами управления - посмотрите сюда https://www.mql5.com/ru/code/10344

Андрей
1890
Андрей 2011.08.16 20:24  
Скрипт
/*
Ключевые слова:
    Эмуляция тиков для ускоренной проверки индикаторов
    Как имитировать поступление тика

Линки:
    Визуальная проверка индикатора, Рош, http://simple-testing.blogspot.com/2009/04/blog-post.html
    Как имитировать постоупление тика, http://metatrader4.com/ru/forum/13299
*/

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

#define WM_COMMAND   0x0111
//#include <WinUser32.mqh> // Заголовочный файл библиотеки "user32.dll" функций API Windows XP.


int HandlWindow = -1;
int MT4InternalMsg = -1;
void Вентилировать()
{
    if(HandlWindow == -1) {
        HandlWindow = WindowHandle(Symbol(),Period());        
    }
    
    if(MT4InternalMsg == -1) {
        MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message"); //incoming tick for EAs
    }
    
    for(;;)
    {
        if(IsStopped()) {return;}
        PostMessageA(HandlWindow, WM_COMMAND, 33324, 0);
                //PostMessageA (HandlWindow, MT4InternalMsg, 8, 0); // Обновляем окно.
        //PostMessageA(HandlWindow,MT4InternalMsg, 2, 1); //incoming tick for EAs
                //PostMessageA (HandlWindow, WM_COMMAND, 2, 1); // Эммуляция тика для эксперта.
        WindowRedraw();
    }
}

void start()
{
    Вентилировать();
}
Vadim Zhunko
5226
Vadim Zhunko 2011.08.16 21:07  
xrust:

циклить init()

Для работы с графическими элементами управления - посмотрите сюда https://www.mql5.com/ru/code/10344

Нельзя зацикливать инит. Это использование недокументированных возможностей.
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий