Укажите новый бар - страница 4

 
Donald Gibson:

Enhanced-MQL4?

Никогда не слышал об этом.


Я тоже со вчерашнего дня ;) А правильное название, кажется,"Обновленный MQL4". MQ пишет:

(...) Начиная с билда 600, язык программирования MQL4 был полностью переработан и достиг уровня MQL5- теперь вы можете разрабатывать торговых роботов на MQL4/5, используя единую среду разработки MetaEditor, единый стиль, библиотеки и средства отладки.

(...) Поэтому мы решили реализовать в нем максимально возможное количество функций и возможностей языка MQL5, полностью сохранив функциональность MQL4. Другими словами, все мощные функции MQL5, включая ООС и компилятор нативного кода, станут доступны в MQL4. (...)

Для этого мы разработали унифицированный компилятор, который автоматически поддерживает оба языка MQL4 и MQL5. (...)

Проблема в определении заключается в слове "языки". Язык - это MQL, так же как C++ - это язык, а Basic - язык. Updated-MQL4/MQL5 - это просто специфические для платформы модификации MQL, не больше и не меньше, поэтому сравнение (родного) MQL4 и Updated-MQL4 практически такое же, как и в случае с C и C++. А миграция MQL4.com в MQL5.com только усилила путаницу. Как показывают эти сообщения, большинство людей не ассоциируют ООП с MQL4, как и я. Для меня это всегда был MQL5, который поддерживает обе платформы, MT4 и MT5.

Но в любом случае, это работает довольно хорошо, и MQLWhatever - далеко не самый лучший интерфейс по сравнению со всеми остальными дерьмовыми вещами вокруг.

 

@Lorentzos Roussos

Alain can correct me on this but you may find gaps in instances where on the time horizon of a bar there where no ticks , so no bar will be in place

Уппппсссс... Я еще не видел такого болтуна. (Что ничего не значит).

Я использую свой "NewBar-индикатор", чтобы автоматически натягивать стопы на максимум или минимум предыдущего бара.

(На самом деле, это немного сложнее, так как я считаю "Innenstaebe и Aussenstaebe" (eng. "внутренние и внешние движения" ???). Не знаю, какой правильный перевод.

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

Я не думаю, что найду период в десять минут без тиков.

В любом случае, программа должна уметь это обрабатывать.

Спасибо!

Willbur

 
Willbur:

@Lorentzos Roussos

Уппппсссс... Я еще не видел такого болтуна. (Что ничего не значит).

Я использую свой "NewBar-индикатор", чтобы автоматически натягивать стопы на максимум или минимум предыдущего бара.

(На самом деле, это немного сложнее, так как я считаю "Innenstaebe и Aussenstaebe" (eng. "внутренние и внешние движения" ???). Не знаю, какой правильный перевод.

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

Я не думаю, что найду период в десять минут без тиков.

В любом случае, программа должна уметь это обрабатывать.

Спасибо!

Willbur

Вы используете iTime, если нет нового бара, он все равно не сработает. Вы в безопасности.
 
Вы используете iTime, если нет нового бара, он все равно не сработает. Вы в безопасности <br / translate="no">

Что вы имеете в виду под "Вы используете iTime"? Я так понял, что "iTime" - это просто переменная в вашей программе - вы можете назвать ее "Bert" или "Clarly", если хотите ?!!?

- - - - -

Сегодня я провел несколько тестов. И я обнаружил некоторые из упомянутых вами разрывов.

Например, S&P500 в 20:34 есть бар, за 20:35 и 20:36 я не получил ни тиков, ни баров от сервера (ActiveTrades). Следующие тики появились в 20:37.

Впоследствии на графике нет баров для этих периодов (см. прикрепленный график M1).

Я не проверял, но думаю, что в функции CopyRates() также нет баров для этого времени.



Думаю, вам стоит проверить свой код в этот момент.

Я бы предположил, что это будет указывать три первых тика бара 20:37 как новые бары.

(TimeCurrent() прыгает с 20:34 до 20:37! Вам нужно добавить PeriodeSeconds() три раза, чтобы достичь этого).

void OnTick()  
{
//---   if(TimeCurrent()>=projection)   
    {Print("New Bar "+TimeToString(projection,TIME_DATE|TIME_MINUTES));   
     projection=projection+PeriodSeconds();   
    }

Willbur


 

Привет всем,

Если кто-то еще ищет... вот фрагмент моего кода для обеспечения открытия только одной сделки на бар.

  if (iBars(Symbol(),0) == BarsCurr)DisableTrading = 1;
  
  for(i=0;i<OrdersTotal();i++)
  {
  if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == True && OrderMagicNumber() == MagicNumber) DisableTrading = 1;
  }

  for(i=OrdersTotal();i>0;i--)
  {
  if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY) == True && OrderMagicNumber() == MagicNumber)
  {
  if ((OrderClosePrice() >= Open[0] && OrderClosePrice() <= Close[0]) && (OrderOpenPrice() >= Open[0] && OrderOpenPrice()<= Close[0]))
  {
  DisableTrading = 1;
  }
   }
      }

ibars можно заменить на bars, а disabletrading = 1 означает ничего не делать. Часть с барами можно понять, используя то, что обычно публикуется. Поместите BarsCurr = 0 в части инициализации и BarsCurr = Bars в части кода ордера на покупку/продажу.

Однако у меня есть проблема, я пытаюсь реализовать закрытие ордера по обратному сигналу... есть идеи?

 

Поскольку дебаты о распознавании NewBars немного затянулись, я кратко подведу итоги.

Техническая среда:

Если сервер обнаруживает изменение (новая сделка или новое определение цены), он посылает сигнал на терминал. Терминальная программа запускает процедуру OnTick ().

С помощью этого сигнала мы получаем следующую информацию:

Time Current () - время сервера, когда был отправлен тик.

Информация о последнем тике - SymbolInfoTick().
- Время сервера, когда возник тик
- Ask
- Ставка
- Последняя цена (не у всех провайдеров)
- флаг, указывающий на то, что было изменено.

Информация о текущем баре
- CopyRates()
- "имя" бара, например, "10:20:00".
- Open-High-Low-Close

Распознавание нового бара (например, Period = M1).

Поскольку сервер посылает сигнал только в том случае, если что-то изменилось,
бары с именем "hh.mm:00" могут отображаться позже, чем "hh:mm:00".

Это может вызвать особые ситуации для символов с низкой ликвидностью.

Решения, работающие с длительностью периода, этого не обнаруживают:

TimeCurrent() bars "name"
Последний тик 10:10:07 10.10:00
Next Tick 10:11:30 10:11:00

Нет с этим (Ноль тиков в периоде):

TimeCurrent() bars "name"
Последний тик 10:10:30 10:10:00
Next Tick 10:13:40 10:13:00 Бар 10:12:00 отсутствует!

Очень редко я встречал ситуации (при очень высокой нагрузке на сервер?), когда время сервера уже перешло в следующий период, а бары - нет.

TimeCurrent() bars "name"
Последний тик 10:10:00 10:09:00
Следующий тик 10:10:00 10:10:00

Вывод:

Можно использовать TimeCurrent(), чтобы подавить ненужные CopyRates().

Когда TimeCurent() достигает нового периода, необходимо проверить, переключается ли бар.

Это возвращает меня к коду, который Ален привел в обсуждение очень рано:

https://www.mql5.com/en/forum/22983

Уиллбур

Improve your time execution by removing Bars function calls
Improve your time execution by removing Bars function calls
  • www.mql5.com
After a basic profiling I get the following results :.
 

@emeka Mbanefo

В моем руководстве не упоминается функция с именем "iBars".

Вы уверены, что это код MQL5?

Willbur

 
Willbur:

@emeka Mbanefo

В моем руководстве не упоминается функция "iBars".

Вы уверены, что это код для MQL5?

Willbur

А, она не для mql5. Она для mql4, я думаю. Тем не менее, iBars - это я так, играючи. Его Bars - это общая функция, как я уже говорил ранее.

Все еще жду помощи с кодом разворота сигнала.

Спасибо.

 
emeka Mbanefo:

А, это не для mql5. Это для mql4, я думаю. Тем не менее, iBars - это моя игра. Его Bars - это общая функция, как я уже говорил ранее.

Все еще жду помощи с кодом разворота сигнала.

Спасибо.

  • Пожалуйста, не захламляйте другие темы не связанным с ними содержанием.
  • Эта тема о mql5, как уже было сказано.
  • Эта тема об обнаружении нового бара, а не о торговле только один раз на бар.
  • iBars ненадежен для обнаружения нового бара.
Indicate a new bar
Indicate a new bar
  • www.mql5.com
Another idea could be the check wether the number of bars has been incremented.