Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени на изучение MQL5? Закажи приложение у разработчика!
SvSerg
61
SvSerg 2012.07.12 13:03 
Здравствуйте ув. программисты!
Не владею навыками программирования, но пытаюсь изучить mql4 и написать советника на основе индикатора "ZigZag".
Задача программы найти паттерн ABCDE, и если CDЕ находится в пределах диапазона AB, то при определённых условиях открывается сделка, а если рынок пробил AB, то паттерн отменяется и программа ищет следующий.
Написал функцию поиска экстремумов ABCD, но теперь не могу понять как сказать программе что бы она запомнила AB, ведь функция ищет 5 последних экстремумов и при появлении следующих экстремумов ЗигЗага более ранние AB теряются.
Надо чтобы программа записала А и В и при их пробитии их удалила.
Уже больше недели думаю.
Если кто знает как, то помогите пожалуйста.

#property copyright ""
#property link      ""

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

int start()
  {

    double A = GetExtremumZZPrice(NULL, 0, 5, ExtDepth, ExtDeviation, ExtBackstep);
    double B = GetExtremumZZPrice(NULL, 0, 4, ExtDepth, ExtDeviation, ExtBackstep);/
    double C = GetExtremumZZPrice(NULL, 0, 3, ExtDepth, ExtDeviation, ExtBackstep);// Пред предыдущий экстремум зз
    double D = GetExtremumZZPrice(NULL, 0, 2, ExtDepth, ExtDeviation, ExtBackstep);/ Предыдущий экстремум зз
    double E = GetExtremumZZPrice(NULL, 0, 1, ExtDepth, ExtDeviation, ExtBackstep);// текущий экстремум зз
    


  }
//+---------------- Функция поиска экстремумов ЗигЗага-------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=0, int dv=0, int bs=0) {
if (sy=="" || sy=="0") sy=Symbol();
double zz;
int i, k=iBars(sy, tf), ke=0;

for (i=0; i<k; i++) {
zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
if (zz!=0) {
ke++;
if (ke>ne) return(zz);
}}}


Рустам
3603
Рустам 2012.07.12 13:10  
Очень много бесполезной работы на каждом тике. Достаточно с приходом каждого нового бара запоминать значения и номер бара экстремумов ЗЗ в глобальном массиве, и считывать их потом когда надо.
SvSerg
61
SvSerg 2012.07.12 13:26  
Спасибо за ответ! Это получается номер бара и его параметры останутся и некуда не денутся, а после их пробоя как их удалить?
Рустам
3603
Рустам 2012.07.12 13:44  
Обнулить данную ячейку массива, или, лучше в этом случае вести два масива, записывая во второй номера уже пробитых экстремумов.
SvSerg
61
SvSerg 2012.07.12 14:21  
FAQ:
Обнулить данную ячейку массива, или, лучше в этом случае вести два масива, записывая во второй номера уже пробитых экстремумов.

Если долго мучиться что нибудь получится.
Viktor
228
Viktor 2012.07.12 14:24  
А зачем что-то удалять?

Можно просто закольцевать массив и помнить только индекс последнего экстремума.
Записывая новое значение, стирается старое, изменяется индекс.

Минимум действий. Ничего лишнего.
Рустам
3603
Рустам 2012.07.12 14:30  
Ну, ну ... а динамическую длинну массива тоже окольцовывать ? проще ввести еще одно измерение, и в него писать флаг пробитости.
Viktor
228
Viktor 2012.07.12 15:29  

//+---------------- Функция поиска экстремумов ЗигЗага-------------------------+
"A-B-C-D-E" находятся в "кольцевом буфере". Массив из пяти ячеек.
Экстремумы проверяются на каждом баре. Нашел - записал.

Индекс, при этом, меняется от 0 до 4. Если дошел до 5, то обнуляется. И т.д.
Я речь веду только об этом "куске".

",,, не могу понять как сказать программе что бы она запомнила AB,,,"
Условие "CDЕ находится в пределах диапазона AB" может проверяться в самой функции.
При выполнении условия, функция может об этом просто сообщить, любым способом.
И/или поместить A-B куда надо, для работы с ними.

Дальше не знаю.
Если "старые пределы" надо хранить до "их пробития", это одно.
Если появление "новых пределов" отменяет "старые пределы", это другое.

SvSerg
61
SvSerg 2012.07.12 16:23  
prorab:

//+---------------- Функция поиска экстремумов ЗигЗага-------------------------+
"A-B-C-D-E" находятся в "кольцевом буфере". Массив из пяти ячеек.
Экстремумы проверяются на каждом баре. Нашел - записал.

Индекс, при этом, меняется от 0 до 4. Если дошел до 5, то обнуляется. И т.д.
Я речь веду только об этом "куске".

",,, не могу понять как сказать программе что бы она запомнила AB,,,"
Условие "CDЕ находится в пределах диапазона AB" может проверяться в самой функции.
При выполнении условия, функция может об этом просто сообщить, любым способом.
И/или поместить A-B куда надо, для работы с ними.

Дальше не знаю.
Если "старые пределы" надо хранить до "их пробития", это одно.
Если появление "новых пределов" отменяет "старые пределы", это другое.


Образовались 2 экстр-ма зигзага АВ, в этом отрезке могут быть хоть сколько экстр-ов зигзага с ними функция и работает, но после пробития АВ паттерн становится не рабочим и всё заново.

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

Короче говоря решается с помощью массива.

Спасибо!

SvSerg
61
SvSerg 2012.07.21 20:35  

Посмотрел по статистике, паттерн образуется не больше чем из 15-ти екстремумов, занёс их в массив, теперь можно сравнивать.

Спасибо всем кто принимал участие!

double ArrZZ[15];

int start()
  {

    int h = 0;
    for(int i=0; i>=0; i++){
      ArrZZ[h]=iCustom(NULL, 0, "ZigZag",12,5,3,0,i);
      if (ArrZZ[h]>0) h++;
      else if(h == 15) break;
    }
      Alert(ArrZZ[2]);     
   
   return(0);
  }
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий