Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 15330
- Рейтинг:
- Опубликован:
- 2013.05.28 06:18
- Обновлен:
- 2014.04.21 14:55
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
//+------------------------------------------------------------------+ //| Copyright © 2010 | //| | //| | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Gold #property indicator_color2 LightBlue //---- input parameters extern int BarsBefore=2; // Баров до... extern int BarsAfter=2; // Баров после extern int Width=2; // Размер значка extern int BarsToProcess=100; // Количество баров для поиска //---- buffers double FractUpBuffer1[]; double FractDnBuffer2[]; string sy, Prefix, NameIND; int tf; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_ARROW,EMPTY,0); SetIndexBuffer(0,FractUpBuffer1); SetIndexArrow(0,119); SetIndexLabel(0,"Fractal Up"); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW,EMPTY,0); SetIndexBuffer(1,FractDnBuffer2); SetIndexArrow(1,119); SetIndexLabel(1,"Fractal Dn"); SetIndexEmptyValue(1,0.0); //---- NameIND="Pattern_v1_01"; IndicatorShortName(NameIND+"_"+GetNameTF(Period())); Prefix=NameIND+"_"+GetNameTF(Period()); // Префикс для имён объектов sy=Symbol(); tf=Period(); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { // -------- Блок удаления всех объектов, построенных на графике -------- string Name_Del[1]; int Quant_Del=0; int Quant_Objects=ObjectsTotal(); int LenPref=StringLen(Prefix); ArrayResize(Name_Del,Quant_Objects); for(int k=0; k<Quant_Objects; k++) { string Obj_Name=ObjectName(k); string Head=StringSubstr(Obj_Name,0,LenPref); if (Head==Prefix) { Quant_Del+=1; Name_Del[Quant_Del-1]=Obj_Name; } } for(int i=0; i<Quant_Del; i++) ObjectDelete(Name_Del[i]); // ----- Конец блока удаления всех объектов, построенных на графике ----- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i, k, j, limit; //---- if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if(limit>BarsToProcess) limit=BarsToProcess; // if (limit>0) FindUpFractals(BarsBefore, BarsAfter); FindDnFractals(BarsBefore, BarsAfter); //---- return(0); } //============================================================================== // --------------------------------- Функции ----------------------------------+ //============================================================================== int FindDnFractals(int nl, int nr) { int i, k, nb; double fractal; datetime tm; string nm; bool fl, fr; int delta=SetDistance(Period()); for (i=BarsToProcess; i>0; i--) { fl=false; FractDnBuffer2[i]=0; if (Open[i]<Close[i]) { for (k=1; k<=nl; k++) { if (Open[i+k]>Close[i+k]) fl=true; else { fl=false; break; } } if (!fl || Open[i+nl+1]>Close[i+nl+1]) continue; fr=false; for (k=0; k<nr; k++) { if (Open[i-k]<Close[i-k]) fr=true; else { fr=false; break; } } if (!fr || Open[i-nr]<Close[i-nr] || iBarShift(sy,tf,Time[i-nr])==0) continue; if (Low[i]<Low[i+1]) { fractal=Low[i]; nb=i; tm=Time[i];} else { fractal=Low[i+1]; nb=i+1; tm=Time[i+1]; } FractDnBuffer2[nb]=fractal; nm=Prefix+"_Down_Fractal_"+nl+"/"+nr+"_"+TimeToStr(tm); fractal=MathMin(Low[i], Low[i+1]); SetArrow(218, LightBlue, nm, tm, fractal-delta*Point, Width); WindowRedraw(); } } return(0); } //+----------------------------------------------------------------------------+ int FindUpFractals(int nl, int nr) { int i, k, nb; double fractal; datetime tm; string nm; bool fl, fr; int delta=SetDistance(Period()); for (i=BarsToProcess; i>0; i--) { fl=false; FractUpBuffer1[i]=0; if (Open[i]>Close[i]) { for (k=1; k<=nl; k++) { if (Open[i+k]<Close[i+k]) fl=true; else { fl=false; break; } } if (!fl || Open[i+nl+1]<Close[i+nl+1]) continue; fr=false; for (k=0; k<nr; k++) { if (Open[i-k]>Close[i-k]) fr=true; else { fr=false; break; } } if (!fr || Open[i-nr]>Close[i-nr] || iBarShift(sy,tf,Time[i-nr])==0) continue; if (High[i]>High[i+1]) { fractal=High[i]; nb=i; tm=Time[i];} else { fractal=High[i+1]; nb=i+1; tm=Time[i+1]; } FractUpBuffer1[nb]=fractal; nm=Prefix+"_Up_Fractal_"+nl+"/"+nr+"_"+TimeToStr(tm); fractal=MathMax(High[i], High[i+1]); SetArrow(217, PaleGoldenrod, nm, tm, fractal+4*delta*Point, Width); WindowRedraw(); } } return(0); } //+----------------------------------------------------------------------------+ string GetNameTF(int TimeFrame=0) { switch (TimeFrame) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("Daily"); case PERIOD_W1: return("Weekly"); case PERIOD_MN1: return("Monthly"); default: return("UnknownPeriod"); } } //+----------------------------------------------------------------------------+ int SetDistance(int TimeFrame) { switch (TimeFrame) { case PERIOD_M1: return(1); case PERIOD_M5: return(1); case PERIOD_M15: return(2); case PERIOD_M30: return(3); case PERIOD_H1: return(4); case PERIOD_H4: return(4); case PERIOD_D1: return(4); case PERIOD_W1: return(4); case PERIOD_MN1: return(4); default: return(0); } } //+----------------------------------------------------------------------------+ void SetArrow(int cd, color cl, string nm, datetime t1=0, double p1=0, int sz=0) { if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0, 0); ObjectSet(nm, OBJPROP_TIME1 , t1); ObjectSet(nm, OBJPROP_PRICE1 , p1); ObjectSet(nm, OBJPROP_ARROWCODE, cd); ObjectSet(nm, OBJPROP_COLOR , cl); ObjectSet(nm, OBJPROP_WIDTH , sz); } //+----------------------------------------------------------------------------+
Выше исходный код индикатора.
Суть в комбинации баров. Настройки могут быть следующими:
Вверх - Бай:- Бычьи = 0, Значение
- Медвежьи = 0, Значение
- Цвет
- Толщина линии
- Медвежьи = 0, Значение
- Бычьи = 0, Значение
- Цвет
- Толщина линии
Например, 1 бар вверх и 2 вниз, 1 вверх и 3 вниз, далее 1/4, 1/5, 1/6, 1/7 и т.д. для Селл. Для Бай - 1 бар вниз и 2 бара вверх, 1 вниз и 3 вверх, дальше 1/4, 1/5 и т.д.
Например, возьмем комбинацию баров 3 вверх и 7 вниз ( 3/7 сокращенно ) для Селл. Берем значение наивысшей цены 3-его бара и наинизшую цену 7-ого бара и рисуем фрактал.
Дальше можно написать советник по этому индикатору и проверить результат.

Восстановление потерянных стрелочек и линий открытых и закрытых позиций для MetaTrader 4

Индикатор сортирует инструменты по дневной волатильности

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

скрипт частичного закрытия ордеров при пересечении ценой горизонтальной линии