Попробуйте сделать это в своем советнике, в начале функции OnTick.
// Мы будем использовать статическую переменную Old_Time для сохранения времени бара.
// При каждом выполнении OnTick мы будем сверять текущее время бара с сохраненным.
// Если время бара не равно сохраненному времени, это означает, что у нас новый тик.
static datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
// копируем время последнего бара в элемент New_Time[0]
int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
if(copied>0) // ok, данные успешно скопированы
{
if(Old_Time!=New_Time[0]) // если старое время не равно новому времени бара
{
IsNewBar=true; // если это не первый вызов, то появился новый бар
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("У нас тут новый бар ",New_Time[0], "старое время было ",Old_Time);
Old_Time=New_Time[0]; // сохранение времени бара
}
}
else
{
Alert("Ошибка при копировании исторических данных времени, ошибка =",GetLastError());
ResetLastError();
return;
}
//--- Советник должен проверять новую сделку, только если у нас есть новый бар
if(IsNewBar==false)
{
return;
}
//--- Достаточно ли у нас баров для работы
int Mybars=Bars(_Symbol,_Period);
if(Mybars<60) // если общее количество баров меньше 60 баров
{
Alert("У нас менее 60 баров, советник сейчас выйдет!!!");
return;
}
Привет, oneillj,
Я думал, что уже ответил, но, похоже, это исчезло в интернет-эфире.
Приведенный вами фрагмент кода - это практически тот, на который я жаловался в первую очередь. Почему так сложно? Я просто подумал, что должен быть более простой способ. Я придумал этот, который, кажется, работает. Пожалуйста, поправьте меня, если я ошибаюсь. (Я также пытался использовать BarsCalculated, но он всегда был равен Bars, поэтому тест всегда выдавал false).
static int LastBarCount = 0;
if (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
else
return;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if(BARS!=Bars(_Symbol,_Period)) { BARS=Bars(_Symbol,_Period); return(true); } return(false); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
Я использую это...
Вы также можете попробовать следующее:
// Rates structure array for last two bars MqlRates mrate[2]; CopyRates(Symbol(), Period(), 0, 2, mrate); // NEW BAR CHECK. //--------------- static double dBar_Open; static double dBar_High; static double dBar_Low; static double dBar_Close; static long lBar_Volume; static datetime nBar_Time; // Boolean for new BAR confirmation. bool bStart_NewBar = false; // Check if the price data has changed tov the previous bar. if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time) { bStart_NewBar = true; // A new BAR has appeared! // Update the new BAR data. dBar_Open = mrate[0].open; dBar_High = mrate[0].high; dBar_Low = mrate[0].low; dBar_Close = mrate[0].close; lBar_Volume = mrate[0].tick_volume; nBar_Time = mrate[0].time; } // Check if a new bar has formed. if(bStart_NewBar == true) { // Your code. }
Я использую это...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет всем,
Я полный новичок в MQL5, но я сделал достаточно много кодирования для других платформ.
Мне интересно, почему советнику так сложно исполняться только на новом баре. Я просмотрел некоторые статьи, включая обработчик события "новый бар", и это кажется очень сложным.
Если это не сработает и мне придется использовать обработчик события "новый бар", можно ли просто загрузить соответствующие файлы и скопировать их в папку Files(?), а затем #include их? Есть ли где-нибудь документация по этому вопросу для таких людей, как я, которые не имеют ни малейшего представления о том, что они делают?
Я работаю над учебником в https://www.mql5.com/en/articles/100, и первое, что я заметил, это то, что функция "Bars" используется для обеспечения достаточного количества баров для выполнения расчетов, но следующая часть кода, очевидно, предназначена для обнаружения нового бара и является (насколько я понимаю) очень сложной частью кода. Не может ли функция Bars использоваться для обнаружения нового бара? Что-то вроде if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. Будет ли что-то подобное работать?
Один для списка пожеланий. Было бы хорошо, если бы вместо OnTick было событие OnNewBar, которое мы могли бы переопределять? Поскольку все индикаторы, которые я когда-либо видел, работают на барах, а не на тиках, я думаю, это значительно облегчило бы жизнь всем.
Только что нашел еще одну возможность: "BarsCalculated". Опять же, не совсем понимаю, что это значит из описания, но похоже, что это количество баров, которые советник уже обработал. Если бы это было так, то все, что мне нужно было бы проверить, это if(Bars > BarsCalculated), если верно, то идти и делать мою обработку, иначе возврат? Я что-то упустил?
Спасибо,
Ян