Ваши вопросы по языку MQL4

eevviill

Заблокирован
В смысле? Фигурными скобками обточить? Счас попробую.
Так-то смысл в том, чтобы "полоса возврата" расширялась до размера всей свечи, т.е. изменение цены внутри свечи сову не интересует. Если цена такая на этой свече уже была, то ее повторно обрабатывать не надо.
На реале-то пофиг, а на тесте как-то надо ускорить процесс, вот я и выдумываю.
Там вот еще:
PHP:
if(Volume[0] == 1) { Rhigh = Bid + spread; Rlow = Bid - spread; }
Я правильно понимаю, что в тесте все тики обрабатываются всегда, т.е. Volume[0] == 1 - это первый тик текущей свечи?
1) Я про саму логику.
2) Да это первый тик текущей свечи.
 

ansol

Местный знаток
1) Я про саму логику.
2) Да это первый тик текущей свечи.

Ну логика такая, что раз Bid вылез за установленные рамки, то эти рамки надо расширить.
if(Rhigh < Bid) Rhigh = Bid + spread; - это Бид за верхней границей, поэтому поднимаем верхнюю границу еще выше Бида
if(Rlow > Bid) Rlow = Bid - spread; - это Бид ниже нижней границы, опускаем её
Т.е. пока там в следующий раз Бид дочапает до отодвинутой границы, тики должны пропускаться по return
Я почему и спрашиваю, что часто бывает по невнимательности че-то накосячу - ощущение, что не пропускает оно ничего.
 

eevviill

Заблокирован
Ну логика такая, что раз Bid вылез за установленные рамки, то эти рамки надо расширить.
if(Rhigh < Bid) Rhigh = Bid + spread; - это Бид за верхней границей, поэтому поднимаем верхнюю границу еще выше Бида
if(Rlow > Bid) Rlow = Bid - spread; - это Бид ниже нижней границы, опускаем её
Т.е. пока там в следующий раз Бид дочапает до отодвинутой границы, тики должны пропускаться по return
Я почему и спрашиваю, что часто бывает по невнимательности че-то накосячу - ощущение, что не пропускает оно ничего.
Вроди всё правильно, попробуй алертом проверить.
 

qqmber

Почетный гражданин
Пытаюсь "обрезать" лишние тики при тестировании:
PHP:
int start()
  {
// Для теста
         if(IsTesting() || IsOptimization()) 
            {
             int spread = Point*MarketInfo(Symbol(), MODE_SPREAD)/2;
               if(Volume[0] == 1) { Rhigh = Bid + spread; Rlow = Bid - spread; }
                  if(Bid >= Rlow && Bid <= Rhigh) return(0);
                     if(Rhigh < Bid) Rhigh = Bid + spread;
                     if(Rlow > Bid) Rlow = Bid - spread;
             }
...код совы...
return(0);
}
Rhigh и Rlow объявлены "до того как".
Т.е. болтание цены внутри уже пройденного диапазона не должно обрабатываться.
Например, спред в тесте ставим 10, тогда цена внутри ±5 тиков просто завершает обработку по return(0)
Эффекта не вижу, очень долго тестирует, может ошибка вкралась где-то у меня?
double spread=...
 

ansol

Местный знаток
Ха ха. Как всегда всё просто.

Я вот никогда не считал, что "две головы лучше", просто с моей невнимательностью одному работать нельзя.
Я тут нарисовал классный советник, но почему-то он, падла, больше 30% в месяц не хочет зарабатывать, хотя ясно, что можно рубить капусту в больших количествах. Наверное, еще где-то у меня такие же глюки закрались, а я и не знаю :D
 

AlexeyVik

Программист mql4 mql5
Я вот никогда не считал, что "две головы лучше", просто с моей невнимательностью одному работать нельзя.
Я тут нарисовал классный советник, но почему-то он, падла, больше 30% в месяц не хочет зарабатывать, хотя ясно, что можно рубить капусту в больших количествах. Наверное, еще где-то у меня такие же глюки закрались, а я и не знаю :D
Тормозит оптимизация ещё из-за наличия графических элементов или комментария, который выводится в левом верхнем углу.
Ну и просмотри что можно выполнять только по открытию бара. :)
 

ansol

Местный знаток
Тормозит оптимизация ещё из-за наличия графических элементов или комментария, который выводится в левом верхнем углу.
Ну и просмотри что можно выполнять только по открытию бара. :)

Э-э-э! Как это? У меню тут до хрена чего выводится, но ведь в режиме оптимизации эти функции должны игнорироваться, не?!

Когда тестирование в режиме "visual" - тогда - да, все ясно. но тогда мне эти данные позволяют понять. что происходит.
Но когда оптимизация идет - ничего никуда не выводится же, хотя и есть много "Comment"
Или это тоже всё выкуривать надо из исходника?
 

AlexeyVik

Программист mql4 mql5
Э-э-э! Как это? У меню тут до хрена чего выводится, но ведь в режиме оптимизации эти функции должны игнорироваться, не?!

Когда тестирование в режиме "visual" - тогда - да, все ясно. но тогда мне эти данные позволяют понять. что происходит.
Но когда оптимизация идет - ничего никуда не выводится же, хотя и есть много "Comment"
Или это тоже всё выкуривать надо из исходника?
C абсолютной уверенностью сказать не могу, но и исключить Comment() из кода абсолютно не сложно.
А если порассуждать, так почему игнорируется? Вот если делать скрины на каждом новом баре, то ни индикаторы ни комментарии на скрине не видны. Стоит сделать паузу перед снимком 1 секунду на скрине всё присутствует. Значит выполняется. Наглядный пример на прикреплённом скрине. А уж графика точно выполняется и задерживает ещё больше чем при визуализации.
И можешь ещё почитать здесь _http://forum.roboforex.ru/showthread.php?t=6519 на мой взгляд полезно. Ну как минимум я взял МТ оттуда и заметил большую разницу в скорости.
 

Вложения

  • 2013.01.09 00.jpg
    2013.01.09 00.jpg
    92,8 КБ · Просмотры: 32

ansol

Местный знаток
Так... Ч0рто пабьери!..
Я а-то думаю, что у меня дурная сова х на у поделить не может по-быстрому?! Ну, ладно, счас будем чинить это безобразие, спасибо
 

mobidik

-----
ВОПРОС
Просмотрев горячие клавиши по МТ4, не нашел как вызвать окно настроек индикатора. При этом, как я понимаю, когда наброшен индюк на график и вызывается окно настроек данного индюка, функция int start() прерывает свою работу до момента закрытия окна настроек? Если это так, то, что за функция, команда, запускается в этот момент? Есть необходимость полу-автоматически либо автоматически вызвать окно настроек индюка. Как это реализовать?
 

qqmber

Почетный гражданин
ВОПРОС
Просмотрев горячие клавиши по МТ4, не нашел как вызвать окно настроек индикатора. При этом, как я понимаю, когда наброшен индюк на график и вызывается окно настроек данного индюка, функция int start() прерывает свою работу до момента закрытия окна настроек? Если это так, то, что за функция, команда, запускается в этот момент? Есть необходимость полу-автоматически либо автоматически вызвать окно настроек индюка. Как это реализовать?
Простого способа нет. На графике может быть индикаторов больше, чем кнопок на клавиатуре, каждому персональный хоткей не выдашь.
Но если очень надо, я бы послал через WinAPI последовательность Ctrl/I ↓ ↓ Tab Tab Enter.
 

Ugar

Гуру форума
ВОПРОС
Просмотрев горячие клавиши по МТ4, не нашел как вызвать окно настроек индикатора.
Как Вы себе это представляете. Вот у меня есть активное окно, я нажимаю горячие клавиши вызова свойств индикатора. Возникает вопрос, а какого, ведь в окне может быть много индикаторов.
При этом, как я понимаю, когда наброшен индюк на график и вызывается окно настроек данного индюка, функция int start() прерывает свою работу до момента закрытия окна настроек?
Это не так. Индикатор продолжает работать, функция start() выполняется с приходом тика даже когда открыто окно настроек индикатора.
 

mobidik

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

Для этого, как я понимаю, есть функции:

int WindowsTotal() - Возвращает количество окон индикаторов на графике, включая главное окно графика.

int WindowFind(string name) - Возвращает номер подокна графика, содержащего индикатор с указанным именем name, если он найден, иначе возвращается -1. WindowFind() возвращает -1, если пользовательский индикатор ищет сам себя в процессе инициализации init().

Это не так. Индикатор продолжает работать, функция start() выполняется с приходом тика даже когда открыто окно настроек индикатора.

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

Дело в том, что есть один индюк, на истории показывает хорошо, а в работе - не то. Стоит только открыть и тут же закрыть окно настроек данного индюка - и картинка меняется, понятно - в лучшую сторону. Вот накинул на М1 дважды этот индюк, один периодически обновлял через открытие/закрытие его окна настроек, а второй не трогал. В итоге выяснилось, что значения на нулевом и первом барах у них одинаковые, а дальше в историю уже наростает существенная разница. Вообщем, свою идею отправляю в топку, грааля в этот раз не будет.
 

Ugar

Гуру форума
Для этого, как я понимаю, есть функции:

int WindowsTotal() - Возвращает количество окон индикаторов на графике, включая главное окно графика.

int WindowFind(string name) - Возвращает номер подокна графика, содержащего индикатор с указанным именем name, если он найден, иначе возвращается -1. WindowFind() возвращает -1, если пользовательский индикатор ищет сам себя в процессе инициализации init().
Эти функции не указывают на индикатор. В любом подокне может быть много индюков.

Если индикатор перерисовывается нужно выделить файлы индикаторов и нажать shift + delete. И не стоит даже думать как ему помочь инициализироваться что бы он успешно перерисовался.
 

eevviill

Заблокирован
PHP:
OrderCloseBy()
С помощью этой функции можно закрыть залокированные(или частично) позиции. При этом мы сэкономим на одном спреде. В истории сделок будет указано что один ордер закрылся с 0 лотов.
А в ручную где такую функцию найти?
 
Последнее редактирование:

ansol

Местный знаток
PHP:
OrderCloseBy()
С помощью этой функции можно закрыть залокированные(или частично) позиции. При этом мы сэкономим на одном спреде. В истории сделок будет указано что один ордер закрылся с 0 лотов.
А в ручную где такую функцию найти?

Это имееется в виду?
 

Вложения

  • eur.jpg
    eur.jpg
    180,2 КБ · Просмотры: 23
Верх