Господа программисты, есть разминка для мозга.
Есть чудесный индикатор MTF_Fractal_KAE. Но он использует данные простейшего индикатора фракталов iFractals(). Для расширения возможностей индикатора MTF_Fractal_KAE нужно заменить iFractals() кодом не менее чудесного индюка Fractals_Light_KAE.
Самостоятельные потуги результата не дали.
Если ещё и удастся создать буфер Buy и буфер Sell для хранения цены фракталов ближайших к текущей цене выше-ниже, то будет шикарно.
Пробой ближайшего фрактала говорит о смене тенденции, а остальные фракталы будут являться ликвидностью, за которой цена обязательно сходит.
MTF_Fractal_KAE.mq4 (10 Kb)
Fractals_Light_KAE.mq4 (6 Kb)
С уважением, КАЕ.
Комментарии (3)
35 AM2 Сообщений: 16672 - Андрей
Типа того, что я написал, но правильно не работает.Где я пЛОХ?
<code>//+------------------------------------------------------------------+ //| MTF Fractal KAE_v2.mq4 | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 clrRed // Up_Fractal_Color #property indicator_color2 clrBlue // Down_Fractal_Color enum Wight { Three_Bars, Five_Bars, Seven_Bars, }; extern int Fractal_Timeframe = 0; extern Wight FractalsWight = Five_Bars; //extern int LevelDelta = 5; extern bool Show_Validation_Candle = false; extern bool Show_Line = true; extern int HistoryBars = 2000; double UpBuffer[], DnBuffer[], refchk, tempref, level; int barc; double Current; //+------------------------------------------------------------------+ //| INIT | //+------------------------------------------------------------------+ int init() { SetIndexBuffer(0,UpBuffer); SetIndexStyle(0,DRAW_ARROW, DRAW_ARROW, 1); SetIndexArrow(0,119); SetIndexBuffer(1,DnBuffer); SetIndexStyle(1,DRAW_ARROW, DRAW_ARROW, 1);SetIndexArrow(1,119); return(0); } //+------------------------------------------------------------------+ //| DEINIT | //+------------------------------------------------------------------+ int deinit() { for (int i = ObjectsTotal(); i >= 0; i--) if (StringSubstr(ObjectName(i),0,12) == "MTF_Fractal_KAE") ObjectDelete(ObjectName(i)); return(0); } //+------------------------------------------------------------------+ //| START | //+------------------------------------------------------------------+ int start() { int i, c, dif; tempref = iHigh(Symbol(), Fractal_Timeframe, 1) + iHigh(Symbol(), Fractal_Timeframe, 51) + iHigh(Symbol(), Fractal_Timeframe, 101); if (barc != Bars || IndicatorCounted() < 0 || tempref != refchk) { barc = Bars; refchk = tempref; } else return(0); if (Fractal_Timeframe <= Period()) Fractal_Timeframe = Period(); dif = Fractal_Timeframe/Period(); if (HistoryBars > Bars) HistoryBars = Bars-10; for(i = 0; i < HistoryBars; i++) { if (iBarShift(NULL,Fractal_Timeframe,Time[i]) < 2) { UpBuffer[i] = 0; DnBuffer[i] = 0; continue; } if(FractalsWight==Three_Bars) { //----Fractals up Current=High[i]; if(Current>High[i+1] && Current>=High[i-1]) UpBuffer[i]=Current; //----Fractals down Current=Low[i]; if(Current<Low[i+1] && Current<=Low[i-1]) DnBuffer[i]=Current; } if(FractalsWight==Five_Bars) { //----Fractals up Current=High[i]; if(Current>High[i+1] && Current>High[i+2] && Current>=High[i-1] && Current>=High[i-2]) UpBuffer[i]=Current; //----Fractals down Current=Low[i]; if(Current<Low[i+1] && Current<Low[i+2] && Current<=Low[i-1] && Current<=Low[i-2]) DnBuffer[i]=Current; } if(FractalsWight==Seven_Bars) { //----Fractals up Current=High[i]; if(Current>High[i+3] && Current>High[i+2] && Current>High[i+1] && Current>=High[i-1] && Current>=High[i-2] && Current>=High[i-3]) UpBuffer[i]=Current; //----Fractals down Current=Low[i]; if(Current<Low[i+3] && Current<Low[i+2] && Current<Low[i+1] && Current<=Low[i-1] && Current<=Low[i-2] && Current<=Low[i-3]) DnBuffer[i]=Current; } } //--- if (Show_Line) { for(i = 0; i < HistoryBars; i++) { if (UpBuffer[i] > 0) { level = UpBuffer[i];//+LevelDelta*Point; for (c = i; c > 0; c--) { if ((Open[c] < level && Close[c] > level) || (Open[c] > level && Close[c] < level)) break; if (Open[c] <= level && Close[c] <= level && Open[c-1] >= level && Close[c-1] >= level) break; if (Open[c] >= level && Close[c] >= level && Open[c-1] <= level && Close[c-1] <= level) break; } DrawLine ("H", i, c, level, 0, clrBlue, 0, 2); if (Show_Validation_Candle) UpBuffer[i-2*dif] = level; i += dif; } //--- } for(i = 0; i < HistoryBars; i++) { if (DnBuffer[i] > 0) { level = DnBuffer[i];//-LevelDelta*Point; for (c = i; c > 0; c--) { if ((Open[c] < level && Close[c] > level) || (Open[c] > level && Close[c] < level)) break; if (Open[c] <= level && Close[c] <= level && Open[c-1] >= level && Close[c-1] >= level) break; if (Open[c] >= level && Close[c] >= level && Open[c-1] <= level && Close[c-1] <= level) break; } DrawLine ("L", i, c, level, 0, clrRed, 0, 2); if (Show_Validation_Candle) DnBuffer[i-2*dif] = level; i += dif; } } } return(0); } //+------------------------------------------------------------------+ //| DRAW LINE | //+------------------------------------------------------------------+ void DrawLine (string dir, int i, int c, double lev, bool back, color col, int width, int style) { ObjectCreate("MTF_Fractal_"+dir+i,OBJ_TREND,0,0,0,0,0); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_TIME1,iTime(Symbol(),Period(),i)); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_PRICE1,lev); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_TIME2,iTime(Symbol(),Period(),c)); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_PRICE2,lev); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_RAY,0); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_BACK,back); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_COLOR,col); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_WIDTH,width); ObjectSet ("MTF_Fractal_"+dir+i,OBJPROP_STYLE,style); } //+------------------------------------------------------------------+ </code>Вроде просто, а линии рисует не на всех фракталах. Хотя по коду должен рисовать на всех. Причем, падла, не рисует самые «сладкие». Да и вообще рисует не так, как оригинал.
И что вы можете сказать про дополнительные два буфера хранения ближайших фракталов ниже и выше текущей цены? Если это возможно, то можно ли их значения вывести на график типа:
Фрактал ниже — 0.96744
фрактал выше — 1.00435
Тут возникает дилемма. Если индюк бы рисовал линии по каждому фракталу, то цену бы брали по линии. А так по фракталу. Дело в том, что ближайшие фракталы рассматриваются как уровни для пробоя. Остальные — как цель для ТР. Так вот LevelDelta я бы применял, только для фракталов пробоя. Т.е. ближайших сверху-снизу.
С уважением, КАЕ. Редактирован: 26 ноября 2022, 19:57
8 kvashnin007 Автор Сообщений: 757 - Андрей
Без уважения, КАЕ.
8 kvashnin007 Автор Сообщений: 757 - Андрей
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий