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

 
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

Сервер реальный или демо?
 

Здравствуйте. Огромный респект всем тем кто помогает вникнуть в особенности МТ5. Без Вас это делать очень сложно... ступор, зависалово, бег по кругу. Так, что РЕСПЕКТ и УВАЖЕНИЕ.


Вопрос. Как лучше увязать rates_total и ограничения баров по истории? Верно ли увязал в коде? Спс за ответ, намек, подсказку.

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

СЕЙЧАС НАБЛЮДАЛ НАСТУПЛЕНИЕ НОВОГО ЧАСА. ВРОДЕ ВСЕ НОРМАЛЬНО РАБОТАЕТ.

Тогда вопрос: корректно ли я оформил в коде момент с rates_total ?

 

Читаю внимательно справку к функции Bars:

"

Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров.

"

В справке не сказано, должны ли включатся даты начала или даты окончания, или нет, в результате не знаешь что ожидать от функции.

Удивляет работа функции:

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

При любом из вариантов, в том числе закомментированных, StopDt получаем значение 2!

Особенно удивляет вариант, когда начальная дата (2018.01.04 10:00) позже по времени конечной (2018.01.03 23:49) в секундном выражении - почему не выдается ошибка или хотя бы 1?

Если начальная и конечная дата совпадают, то тут уж логично выдать единицу, а не опять двойку!

Проверяю на ФОРТС инструмент Si, график минутный.