Учёба. Классы. Нужна помощь. - страница 28

 
lynxntech #:

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

Вот представьте, что ваш алгоритм рассчитан работать на периоде Н1 а вы случайно переключили на М5… Советник пересчитался на новый ТФ и что? У вас новый бар на М5 и советник должен отработать. Потом, в этом и есть преимущество ООП. Конечно только частично… Вы можете используя функцию не писать её в каждом советнике отдельно. Что касается ошибки открытия позиции на первом тике нового бара, то это решается очень просто.

Когда получили новый бар, устанавливаете для сравнения время текущего бара, отправляете OrderSend() и получаете ошибку…

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

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

НО!!! Можно нарваться на долбёжку сервера и блокировку советника или счёта.

 
Alexey Viktorov #:

Вот представьте, что ваш алгоритм рассчитан работать на периоде Н1 а вы случайно переключили на М5… Советник пересчитался на новый ТФ и что? У вас новый бар на М5 и советник должен отработать. Потом, в этом и есть преимущество ООП. Конечно только частично… Вы можете используя функцию не писать её в каждом советнике отдельно. Что касается ошибки открытия позиции на первом тике нового бара, то это решается очень просто.

Когда получили новый бар, устанавливаете для сравнения время текущего бара, отправляете OrderSend() и получаете ошибку…

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

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

НО!!! Можно нарваться на долбёжку сервера и блокировку советника или счёта.

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

у меня на любом периоде все работает, и к тому-же не дергаю график с роботом

add

НО!!! Можно нарваться на долбёжку сервера и блокировку советника или счёта.

тут не понял 

 
lynxntech #:

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

у меня на любом периоде все работает, и к тому-же не дергаю график с роботом

add

НО!!! Можно нарваться на долбёжку сервера и блокировку советника или счёта.

тут не понял 

О получении свежих данных индикатора уже обсуждали. Решение очень простое… Ищите, читайте…

Не понял и хорошо. Значит применять не будете.

Хочу спросить, с шаблонами разобрались?

 
Alexey Viktorov #:

О получении свежих данных индикатора уже обсуждали. Решение очень простое… Ищите, читайте…

Не понял и хорошо. Значит применять не будете.

Хочу спросить, с шаблонами разобрались?

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

по данным индикатора, тема у нас тут образовательная, можно и пример привести, а то мы можем о разных совсем вещах говорить, особенность Терминала и правильность написания индикаторов, я ведь говорил про уникальные редкие случаи, а не про то, что индикатор не правильно считает события

 
lynxntech #:

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

по данным индикатора, тема у нас тут образовательная, можно и пример привести, а то мы можем о разных совсем вещах говорить, особенность Терминала и правильность написания индикаторов, я ведь говорил про уникальные редкие случаи, а не про то, что индикатор не правильно считает события

Я вот об этом говорил

lynxntech #:

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

у меня на любом периоде все работает, и к тому-же не дергаю график с роботом

add

НО!!! Можно нарваться на долбёжку сервера и блокировку советника или счёта.

тут не понял 

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

Тема у нас да, образовательная. Но писать какие-то примеры для объяснения того, что уже обсуждалось или искать где это обсуждалось мне совсем не… как бы выразиться, чтобы было не обидно……

 
Alexey Viktorov #:

Я вот об этом говорил

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

Тема у нас да, образовательная. Но писать какие-то примеры для объяснения того, что уже обсуждалось или искать где это обсуждалось мне совсем не… как бы выразиться, чтобы было не обидно……

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

 

Предположим, нам нужен индикатор, который в подвале рисует тики. Поскольку значения индикаторного буффера автоматически сдвигаются на новой свече, то как раз в этот момент значения индикаторного буффера сдвигать не нужно - терминал их сдвинул сам. Но если новый бар не пришёл. а пришёл лишь очередной тик, то для отрисовки индикатора нужно сдвинуть на 1 значения в индикаторном буффере. Вот пример, который даёт одну из иллюстраций того, зачем моет понадобиться функция определения нового бара.

//+------------------------------------------------------------------+
//                                                        Ticker.mq4 |
//+------------------------------------------------------------------+
#property strict
//---- отрисовка индикатора в отдельном окне
#property indicator_separate_window
//---- количество индикаторных буферов
#property indicator_buffers 1
//---- цвет индикаторных линий
#property indicator_color1 Blue
//---- buffers
double ExtMapBuffer1[];
// ---- Пользовательские переменные --------
extern int MaxDeep=2000;//глубина отрисовки индикатора 
// --- Вспомогательные переменные ----------
int    TickCounter=0;//счётчик тиков
int    myBars=0;
int    counted_bars=0;//количество уже посчитанных баров

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
        SetIndexStyle(0,DRAW_LINE);
        SetIndexBuffer(0,ExtMapBuffer1);
        SetIndexEmptyValue(0,0.0);//начинаем с пустого значения
        return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit(){
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){
        /*
                На новом баре индикаторый буффер сдвигается сам, но поскольку мы делаем тиковый нидикатор, то
                нам придётся вручную сдвигать буффер на каждом новом тике за исключением первого тика нового
                бара
        */
        if(isNewBar()==true){//двигать не надо, терминал сдвинул сам
     TickCounter++;//на каждом тике увеличиваем счётчик тиков
     ExtMapBuffer1[0]=Ask;
     
        }
        else{//иначе бар старый и мы должны сдвинуть массивы вручную
                TickCounter++;//на каждом тике увеличиваем счётчик тиков
                ShiftArray();//сдвигаем значения массива на 1
                ExtMapBuffer1[0]=Ask;
    
  }
  return(0);
}
//+------------------------------------------------------------------+
//-------- Пользовательские подпрограммы -----------------------------
//+------------------------------------------------------------------+
/*
  Индикаторы, встроенные в терминал сдивигают буферный массив сами. Нам же придётся написать для этого отдельную функцию.
  Поэтому нижеследующая функция ShiftArray() именно это и делает - сдвигает значения массива на 1 при поступлении нового тика. 
*/
// ---------------------- ShiftArray() -----------------------
// Функция сдвигает массив 
//--------------------------
void ShiftArray(){
  if(TickCounter>2*MaxDeep){//если число тиков превысило допуск в 2 раза, то обрезаем лишние тики
                for(int i=TickCounter;i>=MaxDeep;i--){
                        ExtMapBuffer1[i]=0.0;
                }
    TickCounter=MaxDeep;
  }
        int ArrSize=ArraySize(ExtMapBuffer1);
        for(int i=ArrSize-1;i>0;i--){//Иначе производим сдвиг
                ExtMapBuffer1[i]=ExtMapBuffer1[i-1];
        }
}
/*
 Нам пришлось ввести новую глобальную переменную TickCounter,
 чтобы знать на какую глубину сдвигать значения массива.
 Но мы забыли, что при появлении нового бара индикаторный массив сдвигается автоматически.
 Добавим обработку события «Новый бар»:
*/
//+------------------------------------------------------------------+
//| функция isNewBar() - возвращает признак нового бара                                              |
//+------------------------------------------------------------------+
bool isNewBar(){
  bool res=false;
  if(myBars!=Bars){
    res=true;
    myBars=Bars;
  }   
        return(res);
}
//------------------------------------------------------------
 
Vitaly Murlenko #:

Предположим, нам нужен индикатор, который в подвале рисует тики. Поскольку значения индикаторного буффера автоматически сдвигаются на новой свече, то как раз в этот момент значения индикаторного буффера сдвигать не нужно - терминал их сдвинул сам. Но если новый бар не пришёл. а пришёл лишь очередной тик, то для отрисовки индикатора нужно сдвинуть на 1 значения в индикаторном буффере. Вот пример, который даёт одну из иллюстраций того, зачем моет понадобиться функция определения нового бара.

просто забудьте про новый бар, мне это и тот самый автор сказал однажды

 
lynxntech #:

просто забудьте про новый бар, мне это и тот самый автор сказал однажды

человек который продает на новом баре, какую цель он придумывает? это место номер один как его по разнице вынести

 
lynxntech #:

просто забудьте про новый бар, мне это и тот самый автор сказал однажды

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