Помогите описать кусочек кода. Хочу прикрутить уровни Фибоначи к зигзагу. Логика простая, на коррекции входим в продажи или покупки. Так же смотрим на последнее движение зигзага. Проблема в описании экстремумов зигзага. У зигзага экстремум формируется не чаще чем раз в пять свечей, а в моем коде все как то криво!
Прошу помощи в общем кому не сложно помочь!
вот код: for(int i=5;i<=20;i++)
{
if(Low1>lowM15[i]){Low1=lowM15[i];}
if(highM15[i]-Low1>(highM15[1]-Low1)*0.12){indLow1=i;break;}
}
for(int i=indLow1;i<=indLow1+40;i++)
{
if(High2<highM15[i]){High2=highM15[i];}
if((High2-Low1)*0.12<High2-lowM15[i]){break;}
}
}
if((High2-Low1)*0.39<highM15[1]-Low1){Sell=true;}
На картинках условия для входа.
1. Вставляйте код правильно, а не в виде простыни текста.
2. Всегда в редакторе применяйте стилизатор - Вы сразу будете видеть свои ошибки:
for(int i=5;i<=20;i++) { if(Low1>lowM15[i]) { Low1=lowM15[i]; } if(highM15[i]-Low1>(highM15[1]-Low1)*0.12) { indLow1=i;break; } } for(int i=indLow1;i<=indLow1+40;i++) { if(High2<highM15[i]) { High2=highM15[i]; } if((High2-Low1)*0.12<High2-lowM15[i]) { break; } } } if((High2-Low1)*0.39<highM15[1]-Low1) { Sell=true; }
Как только код будет исправным, можно будет дальше его наполнять.
1. Вставляйте код правильно, а не в виде простыни текста.
2. Всегда в редакторе применяйте стилизатор - Вы сразу будете видеть свои ошибки:
Как только код будет исправным, можно будет дальше его наполнять.
Насчет скобочки я согласен. Я просто вырвал кусок кода из тела программы... у меня сложность в расчете эктремумов зигзага, что бы наложить на них уровни фибо. у индикатора зигзаг задается количество свечь в которых индикатор не может нарисовать две вершины. Я в принципе рассчитал движение на 12 процентов, но как задать количество свеч?
Насчет скобочки я согласен. Я просто вырвал кусок кода из тела программы... у меня сложность в расчете эктремумов зигзага, что бы наложить на них уровни фибо. у индикатора зигзаг задается количество свечь в которых индикатор не может нарисовать две вершины. Я в принципе рассчитал движение на 12 процентов, но как задать количество свеч?
Есть пример работы с фракталами:
... Способы привязки объектов. В приведенном там скрипте показано, как получать значения индикатора iFractals на последних 1000 барах и как потом вывести на график по десять последних фракталов вверх и вниз.
Сейчас как раз работаю с ZZ, сделал функцию по вершинам.
input int ExtDepth=48; input int ExtDeviation= 5; input int ExtBackstep = 3; int handle_ZZ=0; double ZigZagVizual[]; // визуализация зиг-зага double ZigZagHighs[]; // верхние переломы зиг-зага double ZigZagLows[]; // нижние переломы зиг-зага double ZZ_High_Price[]; //Максимальная цена отрезка datetime ZZ_High_Time[]; //Время образования максимальной цены вершины double ZZ_Low_Price[]; //Минимальная цена отрезка datetime ZZ_Low_Time[]; //Время образования минимальной цены вершины double ZZ_Start_Price[]; //Начальная цена отрезка datetime ZZ_Start_Time[]; //Время начала отрезка double ZZ_Stop_Price[]; //Конечная (текущая для последнего) цена отрезка datetime ZZ_Stop_Time[]; //Время окончания отрезка int ZZ_Vektor[]; //Вектор направления отрезка int OnInit() { handle_ZZ=iCustom(Symbol(),PERIOD_CURRENT,"Examples\\ZigZag_",ExtDepth,ExtDeviation,ExtBackstep); if(handle_ZZ==INVALID_HANDLE) { PrintFormat("Failed to create handle of the handle_ZZ indicator for the symbol %s/%s, error code %d", Symbol(),EnumToString(Period()),GetLastError()); return(INIT_FAILED); } return(INIT_SUCCEEDED); } void OnTick() { ZZ(); Print ("ZZ_Start_Price=",ZZ_Start_Price[0]," ZZ_Stop_Price=",ZZ_Stop_Price[0]); Print ("ZZ_Start_Time=",ZZ_Start_Time[0]," ZZ_Stop_Time="+ZZ_Stop_Time[0]); } void ZZ() { ArrayFree(ZigZagHighs); ArrayFree(ZigZagLows); ArrayFree(ZigZagVizual); // Скопируем верхние и нижние переломы зиг-зага в буферы: int BarTotal=Bars(Symbol(),PERIOD_CURRENT); CopyBuffer(handle_ZZ,1,0,BarTotal,ZigZagHighs); CopyBuffer(handle_ZZ,2,0,BarTotal,ZigZagLows); // Скопируем визуализацию переломов зиг-зага в буферы: CopyBuffer(handle_ZZ,0,0,BarTotal,ZigZagVizual); // Увеличим размер буферов до количества баров int arrSize=MathMax(ArraySize(ZigZagHighs),ArraySize(ZigZagLows)); ArrayFree(ZZ_High_Price); ArrayFree(ZZ_High_Time); ArrayFree(ZZ_Low_Price); ArrayFree(ZZ_Low_Time); ArrayResize(ZZ_High_Price,arrSize); ArrayResize(ZZ_High_Time,arrSize); ArrayResize(ZZ_Low_Price,arrSize); ArrayResize(ZZ_Low_Time,arrSize); //--Уберем промежутки между ZZ int A=0; int B=0; double ZZ_High=0.0; double ZZ_Low=0.0; for(int i=arrSize-1; i>0; i--) { ZZ_High=ZigZagHighs[i]; ZZ_Low=ZigZagLows[i]; if(ZZ_High>0 && ZigZagVizual[i]>0) { ZZ_High_Price[A]=ZZ_High; ZZ_High_Time[A]=iTime(Symbol(),PERIOD_CURRENT,BarTotal-i-1); A++; } if(ZZ_Low>0 && ZigZagVizual[i]>0) { ZZ_Low_Price[B]=ZZ_Low; ZZ_Low_Time[B]=iTime(Symbol(),PERIOD_CURRENT,BarTotal-i-1); B++; } } //--Узнаем максимальное число отрезков int arrSizeOtrezok=MathMax(A*2,B*2)+1; ArrayFree(ZZ_Start_Price); ArrayFree(ZZ_Start_Time); ArrayFree(ZZ_Stop_Price); ArrayFree(ZZ_Stop_Time); ArrayResize(ZZ_Start_Price,arrSizeOtrezok); ArrayResize(ZZ_Start_Time,arrSizeOtrezok); ArrayResize(ZZ_Stop_Price,arrSizeOtrezok); ArrayResize(ZZ_Stop_Time,arrSizeOtrezok); ArrayFree(ZZ_Vektor); ArrayResize(ZZ_Vektor,arrSizeOtrezok); int VektorLast=0; //--Вектор последнего отрезка //--Определим вектор последнего отрезка if(ZZ_High_Time[0]>ZZ_Low_Time[0]) VektorLast=1; if(ZZ_High_Time[0]<ZZ_Low_Time[0]) VektorLast=-1; Print(VektorLast); bool Chetniy=false; double ChetniyN=0; for(int i=0; i<arrSizeOtrezok-1; i++) { Chetniy=true; ChetniyN=i; if(i>0 && NormalizeDouble(ChetniyN/2,0)-ChetniyN/2>0)Chetniy=false; if(VektorLast==1) { if(Chetniy==false)//2 { int N=(i-1)/2; ZZ_Start_Price[i-1]=ZZ_Low_Price[N]; ZZ_Start_Time[i-1]=ZZ_Low_Time[N]; ZZ_Stop_Price[i-1]=ZZ_High_Price[N]; ZZ_Stop_Time[i-1]=ZZ_High_Time[N]; ZZ_Vektor[i-1]=1; ZZ_Start_Price[i]=ZZ_High_Price[N+1]; ZZ_Start_Time[i]=ZZ_High_Time[N+1]; ZZ_Stop_Price[i]=ZZ_Low_Price[N]; ZZ_Stop_Time[i]=ZZ_Low_Time[N]; ZZ_Vektor[i]=-1; } } if(VektorLast==-1) { if(Chetniy==false)//2 { int N=(i-1)/2; ZZ_Start_Price[i-1]=ZZ_High_Price[N]; ZZ_Start_Time[i-1]=ZZ_High_Time[N]; ZZ_Stop_Price[i-1]=ZZ_Low_Price[N]; ZZ_Stop_Time[i-1]=ZZ_Low_Time[N]; ZZ_Vektor[i-1]=-1; ZZ_Start_Price[i]=ZZ_Low_Price[N+1]; ZZ_Start_Time[i]=ZZ_Low_Time[N+1]; ZZ_Stop_Price[i]=ZZ_High_Price[N]; ZZ_Stop_Time[i]=ZZ_High_Time[N]; ZZ_Vektor[i]=1; } } }
Сейчас как раз работаю с ZZ, сделал функцию по вершинам.
Если можно, то прокомментируйте что делает этот код, и как его использовать?
Если можно, то прокомментируйте что делает этот код, и как его использовать?
Обновил код выше (правда пока нет возможности проверить) - надеюсь там понятней.
Код определяет время и цену начала и окончания отрезков ЗЗ и их вектор направленности.
Использовать для любых целей, в том числе для построения фибо сетки.
Так как код основан на логике, последовательности направления векторов "+1/-1/+1/-1", то в случае выкрутасов стандартного ЗЗ "+1/+1/-1/+1" - могут быть сбои. Но, это бывает не столь часто, поэтому пока для меня не столь критично, зато работать может с любым ЗЗ.
Добавлю, забыл отметить, что номер отрезка с права налево идет, и все это хранится в массиве.
PS не забываем вызов функции ZZ();
Расчет лучше делать по необходимости, конечно...
Когда то я решал подобную задачу для ZigZag: https://www.mql5.com/ru/code/18319
Думаю, что Вам это поможет.
Удачи.
- голосов: 21
- 2017.05.22
- Valeriy Medvedev
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите описать кусочек кода. Хочу прикрутить уровни Фибоначи к зигзагу. Логика простая, на коррекции входим в продажи или покупки. Так же смотрим на последнее движение зигзага. Проблема в описании экстремумов зигзага. У зигзага экстремум формируется не чаще чем раз в пять свечей, а в моем коде все как то криво!
Прошу помощи в общем кому не сложно помочь!
вот код: for(int i=5;i<=20;i++)
{
if(Low1>lowM15[i]){Low1=lowM15[i];}
if(highM15[i]-Low1>(highM15[1]-Low1)*0.12){indLow1=i;break;}
}
for(int i=indLow1;i<=indLow1+40;i++)
{
if(High2<highM15[i]){High2=highM15[i];}
if((High2-Low1)*0.12<High2-lowM15[i]){break;}
}
}
if((High2-Low1)*0.39<highM15[1]-Low1){Sell=true;}
На картинках условия для входа.