Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 986

 
Artyom Trishkin:

В OnInit() сделайте обращение к таймсерии символа: iTime(Symbol,Timeframe,1);

В OnTick() в самом начале сделайте запрос нужного бара нужной таймсерии через соответствующую iFunc(), хотя бы тем же if( iTime(Symbol,Timeframe,10)==0) return;

Тогда советник не дойдёт до определения нового бара и будет ждать следующего тика.

В OnInit() мы запросили данные таймсерии, тем самым активизировав подкачку данных.

В OnTick()проверяем доступность минимально-требуемой советнику истории и, если она ещё не доступна - уходим в ожидание следующего тика.

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

Как только все необходимые данные будут подкачаны и получены, советник начнёт работу с новым баром и нужной ему историей.

Для поддержания серийных данных в актуальном состоянии, обязательно нужно к ним обращаться не менее одного раза в две минуты. Сделайте секундный таймер примерно на полторы минуты (90 секунд) и в нём просто обращайтесь к любой таймсерии нужного символа, например iTime(Symbol,Timeframe,1); Без проверки полученных данных - просто "шевельнуть" историю. Тогда все данные по символу будут всегда находиться в актуальном состоянии.

Я конечно попробую вариант с проверкой нового бара по всем TF, но разве это происходит не синхронно, это же не MT4. Да и проблема не в баре, а в не отработки индикаторов, которые вызываются из индикатора, который в свою очередь вызывается из советника.

Я работаю на минутках, поэтому история по идеи всегда актуальна должна быть.

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

 

Пока решил проблему так, перед началом работы основного кода сделал проверку готовности индикаторов, которые давали сбой

//При появлении нового бара проверяем корректность расчета индикаторов
      if(isNewBar_Predv_Calc_Ind()==true)Predv_Calc_Ind=true;
      if(Predv_Calc_Ind==true)
      {
      double arr_DonUp=ZZ_Vibor(0,2,0);
      double arr_DonDown=ZZ_Vibor(0,3,0);
      double arr_DonUp_m2=ZZ_Vibor(1,2,0);
      double arr_DonDown_m2=ZZ_Vibor(1,3,0);
      double arr_DonUp_m5=ZZ_Vibor(2,2,0);
      double arr_DonDown_m5=ZZ_Vibor(2,3,0);
      double arr_DonUp_m15=ZZ_Vibor(3,2,0);
      double arr_DonDown_m15=ZZ_Vibor(3,3,0);
      if (arr_DonUp<1     || arr_DonDown<1    ||
          arr_DonUp_m2<1  || arr_DonDown_m2<1 ||
          arr_DonUp_m5<1  || arr_DonDown_m5<1 ||
          arr_DonUp_m15<1 || arr_DonDown_m15<1
         )return;
      else{Predv_Calc_Ind=false;}      
      }
//Операции выполняются только при появлении следующего бара   
   if(!isNewBar()) return;

Но такой подход не универсален, так-как надо перечислять все индикаторы, есть ли иной, более универсальный метод заставить корректно работать окружение тестера?

 
Artyom Trishkin:

В OnTick()проверяем доступность минимально-требуемой советнику истории и, если она ещё не доступна - уходим в ожидание следующего тика.

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

Как только все необходимые данные будут подкачаны и получены, советник начнёт работу с новым баром и нужной ему историей.

Как Вы предлагаете проверять доступность истории, я что-то не понял...

 
fxsaber:

Добавьте перед MQL4-функцией эту строку

и она станет работать в MT5.

Гениально. Огромное спасибо!

 
Доброе время суток, молодому пенсионеру захотелось  вот такие кнопочки сделать в МТ5.

Подскажите в МТ5 можно реализовать такие кнопки, может уже есть у кого поделитесь кодом...

 
Кнопка "Пуск(Start)" и кнопка "Закрыть все ордера". перемещаются по экрану. МТ5, все пары, все таймфреймы, 4/5 знаков. начальный лот 0.01 в том числе центовый.
Предусмотреть проскальзывание и реквоты.

Функции для кнопки "Пуск(Start)" 
После того как растяну фибо в ручную, нужно открыть от 1 до 11 ордеров сразу в BAY или SELL по текущей цене, предварительно
выбрав в настройках сколько ордеров открывать и каких (1, 2, 5, 7 или все 11) в сторону развернутого фибо. 
В настройках каждому ордеру была возможно указывать лотность в ручную или динамически увеличение/уменьшение.

ТР - Take Profit устанавливается в порядке возрастания от 1 до 11 ордеров на уровнях фибо 61,8; 78,6; 100.0; 
161.8; 185.4; 200.0; 261.8; 285.0; 423.6; 561,8; 685.4 

SL - Stop Loss в размере - 2 спрэда (рассчитывается автоматом) от нулевой линии фибо.

TS - Trailing Stop тянет все ордера за собой.
1. трейлинг переносит SL всех ордеров на уровень 38,2 + 2 спрэда если цена достигла уровня 61,8, 
2. трейлинг переносит SL всех оставшихся ордеров на уровень 50,0+2 спрэда если цена достигла уровня 100,0, 
3. трейлинг переносит SL всех оставшихся ордеров на уровень 78,6+2 спрэда если цена достигла уровня 161,8, 
4 . трейлинг переносит SL всех оставшихся ордеров на уровень 100.0+2 спрэда если цена достигла 261,8, 5. 
5. трейлинг переносит SL всех оставшихся ордеров на уровень 200.0+2 спрэда если цена достигла уровня 423,6, 
6. трейлинг переносит SL всех оставшихся ордеров на уровень 423,6+2 спрэда если цена достигла уровня 561,8;

Функции кнопки "Закрыть все ордера" - принудительно закрыть все ордера.
 

Здравствуйте, если по ценам Ask и  Bid из класса CSymbolInfo более или менее пнятно, то как получить например SessionInterest или SessionBuyOrdersVolume или SessionPriceLimitMin, Выдает ноли, не могу понять почему...

 
Александр Юрин:

Здравствуйте, если по ценам Ask и  Bid из класса CSymbolInfo более или менее пнятно, то как получить например SessionInterest или SessionBuyOrdersVolume или SessionPriceLimitMin, Выдает ноли, не могу понять почему...

Если торговый сервер транслирует эту информацию - Вы её получите. 

Как правило эту информацию транслируют Брокеры для биржевых символов (не путайте Брокера и дилинговые центры).

 
Vladimir Karputov:

Если торговый сервер транслирует эту информацию - Вы её получите. 

Как правило эту информацию транслируют Брокеры для биржевых символов (не путайте Брокера и дилинговые центры).

Брокер Открытие, Фьючерс на индекс РТС, предполагаю, что должен транслировать по крайней мере  SessionPriceLimitMin и SessionPriceLimitMax (т.к. они насколько я понимаю по ценам открытия используются в рыночных ордерах). Неужели открытие не транслирует... Прописываю например:

Print(m_symbol.Ask(),"   ",m_symbol.SessionBuyOrdersVolume()); - из вашего советника

В журнал получаю только цены Ask

Файлы:
y2a4cgbfjw.png  63 kb
 

Прошу помощи в написании кусочка кода, который правильно бы определял дату последнего бара с любым сдвигом в любом TF с точностью до текущего ТФ. 

int              N_bar=iBarShift(Symbol(),PERIOD_CURRENT,iTime(Symbol(),PERIOD_H1,0));//номер текущего бара
datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,N_bar+1);//только для минуток и то может быть не корректно!

Print("StopDt_Shift=",TimeToString(StopDt,TIME_DATE|TIME_MINUTES));

Такой код в целом рабочий, но если только время начала текущего бара совпадает с фактическим (с округлением до минуты) баром, так как мой текущий график M1. А если не совпадает, то возникают различные казусы, в зависимости от разных TF. К примеру, мне надо узнать дату начала последнего бара M1 в прошлом часе, если это был час 12 то проблем нет, время будет 12:59, а если это 13 часов, то время будет уже 13:58 так как бар часовой открылся не в 14:00, а в 14:05 и функция iBarShift вернула ближайший бар к 14:00, а именно 13:59. 

Добавлено: сделал так, кажется работает

datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,_Shift-1),iTime(Symbol(),PERIOD_CURRENT,0)));
 
Александр Юрин:

Брокер Открытие, Фьючерс на индекс РТС, предполагаю, что должен транслировать по крайней мере  SessionPriceLimitMin и SessionPriceLimitMax (т.к. они насколько я понимаю по ценам открытия используются в рыночных ордерах). Неужели открытие не транслирует... Прописываю например:

Print(m_symbol.Ask(),"   ",m_symbol.SessionBuyOrdersVolume()); - из вашего советника

В журнал получаю только цены Ask

Сервер реальный или демо?
Причина обращения: