Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1213

 

Салют! Помогите :)

Из индикатора (мт5) копируется тиковая история для дальнейшей обработки. Алгоритм копирования содрал со справочника, лишь немного изменив:

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

Но есть предупреждение, мол тиковая история не синхронизирована:

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

А в справочнике пишет:

ERR_HISTORY_TIMEOUT

4403

Превышен таймаут при запросе истории

Капитанская интуиция подсказывает, что нужно синхронизировать тики... правильно ли понимаю вот этот момент? А как это сделать? Или  можно  без особого вреда работать и без синхронизации, просто убрав проверку success ?

 
Yevhenii Levchenko:

Салют! Помогите :)

Из индикатора (мт5) копируется тиковая история для дальнейшей обработки.

в индикаторах асинхронный доступ к историческим данным, в экспертах и скриптах синхронный доступ, по крайней мере разработчики так называют поведение MQL-программ при работе с данными

если человеческим языком, то при обращении к данным истории в индикаторе нужно получив ошибку выполнить выход из цикла расчета и спустя время повторно выполнить обращение к истории

а выполнять в индикаторе в цикле несколько раз обращение к истории нет смысла - такой прием работает только в экспертах и скриптах

 
Igor Makanu:

в индикаторах асинхронный доступ к историческим данным, в экспертах и скриптах синхронный доступ, по крайней мере разработчики так называют поведение MQL-программ при работе с данными

если человеческим языком, то при обращении к данным истории в индикаторе нужно получив ошибку выполнить выход из цикла расчета и спустя время повторно выполнить обращение к истории

а выполнять в индикаторе в цикле несколько раз обращение к истории нет смысла - такой прием работает только в экспертах и скриптах

Спасибо!

Синхронный это с многопоточностью связано? "Ticks are not synchronized yet" - получается больше как предупреждение?

 
ANDREY:

Нонсенс... с логикой не дружите, с математикой не дружите ..... и в то же время давно и  успешно модерируете форум тематика которого пронизана тотально и логикой и математикой.

Где я говорил что не дружу с логикой?

 
ANDREY:

Думаю, что знания которыми обладала куча специалистов не были знаниями самого Форда и никогда ими не стали. Тем более - потребности в этих знаниях у него не было, поскольку он назвал их ненужными. И если бы эти специалисты попытались бы передать свои знания Форду он не смог бы эти знания усвоить и оперировать ими в практических целях. Что бы усваивать новые знания нужно уже иметь немного более чем  общие представления о предмете с которым связаны новые знания. В приведенном примере специалисты обеспечивали знаниями не Форда, а адвокатов.

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

Если мне сейчас 100 академиков начнут объяснять правила вычисления интегральных уравнений - я не научусь их вычислять до тех пор пока они не вложат в мою голову и не разложат в ней по полочкам  все учебники математики и алгебры которые я должен был усвоить в школе до того как учитель начал объяснять нам тему интегральный уравнений.

Аналогично и в изучении MQL Если ты не понимаешь что такое переменная и для чего она нужна, то трудно понять даже что такое знание переменной ,  я уже не говорю о других даже не очень сложных понятиях.

Форд не говорил, что его влёт обучат нужному вопросу в интересующей его области знаний. Он говорил, что его окружает такое количество специалистов в разных областях знаний, что он в любой момент может получить ответы на нужные в этот момент вопросы. Зачем руководителю знать то, что могут знать 200 спецов, каждый их которых выдаст нужный ответ в своей области? Да и не возможно знать всё в принципе. А вот быстро получать ответы на требуемые задачи при помощи услуг специалистов - это и есть то, о чём говорил Форд, это и есть то, что я говорил о справочниках и использовании нужной информации. И это в какой-то узкой области предоставляет данный ресурс в виде CodeBase и форума.

 
Yevhenii Levchenko:

Спасибо!

Синхронный это с многопоточностью связано? "Ticks are not synchronized yet" - получается больше как предупреждение?

нет

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

... вот на нечеловеческий язык перешли ))))


а асинхронный это запрос и данные или ошибка, причем после возникновения ошибки запускается синхронизация, но время окончания синхронихации (или построения ТФ) неизвестно и из за высокой производительности МТ5 получаешь каждый повторный вызов ошибку вместо синхронизированных данных 

ЗЫ: в МТ5 там все сложно.... есть сервер, есть терминал и наконец наша MQL-программа, при запросе истории нужно синхронизировать сервер-терминал и затем уже терминал - MQL-программу, у кого то могут быть не готовы таймфреймы или тиковые данные 

 
Igor Makanu:

нет

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

... вот на нечеловеческий язык перешли ))))


а асинхронный это запрос и данные или ошибка, причем после возникновения ошибки запускается синхронизация, но время окончания синхронихации (или построения ТФ) неизвестно и из за высокой производительности МТ5 получаешь каждый повторный вызов ошибку вместо синхронизированных данных 

ЗЫ: в МТ5 там все сложно.... есть сервер, есть терминал и наконец наша MQL-программа, при запросе истории нужно синхронизировать сервер-терминал и затем уже терминал - MQL-программу, у кого то могут быть не готовы таймфреймы или тиковые данные 

Проще было ответить примерно так:

Чтобы в индикаторе дождаться синхронизации, нужно после получения ошибки просто выйти из OnCalculate() с возвратом нуля - return 0;

При этом первое обращение к историческим данным запускает процесс синхронизации данных, и остаётся только проверять её завершение. Если ошибка получения данных, то возвращать ноль - так как ноль указывает на количество уже посчитанных данных на прошлом вызове (prev_calculated), и при текущем вызове и успешной загрузке исторических данных OnCalculate() будет рассчитываться по всей глубине истории (так как вернув 0 мы тем самым указали на прошлом вызове, что ничего не было посчитано).

 
a.lxrn:

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

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

Ордер один открывается но после срабатывания стопа или профита, сигнал остается и будет достаточное долгое время оставаться Истинным, уверен понимаете о чем я,

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

флаги, но при закрытии ордера они не спасут, и он откроется или задержки минут на 15. Еще круче бывает когда одновременно Истинны условия открытия и закрытия ордеров. На каждом тике ордер)))) Флаги это если сигнал на открытие ордера истина и флаг что ордер открыт ложь то открываем ордер. И если флаг что ордер открыт истина, ордер не откроется). Задержка проще и эффективней. После закрытия ордера ставим задержку.

 
Igor Makanu:

а асинхронный это запрос и данные или ошибка, причем после возникновения ошибки запускается синхронизация, но время окончания синхронихации (или построения ТФ) неизвестно и из за высокой производительности МТ5 получаешь каждый повторный вызов ошибку вместо синхронизированных данных 

ЗЫ: в МТ5 там все сложно.... есть сервер, есть терминал и наконец наша MQL-программа, при запросе истории нужно синхронизировать сервер-терминал и затем уже терминал - MQL-программу, у кого то могут быть не готовы таймфреймы или тиковые данные 


Приблизительно понял... Спасибо :)

Artyom Trishkin:

Проще было ответить примерно так:

Чтобы в индикаторе дождаться синхронизации, нужно после получения ошибки просто выйти из OnCalculate() с возвратом нуля - return 0;

При этом первое обращение к историческим данным запускает процесс синхронизации данных, и остаётся только проверять её завершение. Если ошибка получения данных, то возвращать ноль - так как ноль указывает на количество уже посчитанных данных на прошлом вызове (prev_calculated), и при текущем вызове и успешной загрузке исторических данных OnCalculate() будет рассчитываться по всей глубине истории (так как вернув 0 мы тем самым указали на прошлом вызове, что ничего не было посчитано).

Проще не значит понятнее :)

Перешел на фондовые инструменты и там только раз напечатало, что не синхронизированы. При последующих запросах ничего такого больше не выводило.

Подскажите, почему в тестере не выдает объемов?
 
Yevhenii Levchenko:

Приблизительно понял... Спасибо :)

Проще не значит понятнее :)

Перешел на фондовые инструменты и там только раз напечатало, что не синхронизированы. При последующих запросах ничего такого больше не выводило.

Подскажите, почему в тестере не выдает объемов?

Для поддержания исторических данных в актуальном "горячем" состоянии, необходимо раз в две минуты обращаться к этим данным при помощи любой из функций CopyXXX, iXXX, например CopyTime(), iTime(), и т.д...

Не знаю каких объёмов у вас не выдаёт в тестере. Есть объёмы реальные, и есть тиковые. Без кода нет возможности ответить по существу.