//+------------------------------------------------------------------+ //| TrailingByFractals.mq4 | //| I_D | //| http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D" #property link "http://www.mymmk.com/" #property library //+------------------------------------------------------------------+ //| ТРЕЙЛИНГ ПО ФРАКТАЛАМ | //| Функции передаётся тикет позиции, количество баров в фрактале, | //| и отступ (пунктов) - расстояние от макс. (мин.) свечи, на | //| которое переносится стоплосс (от 0), trlinloss - тралить ли в | //| зоне убытков | //+------------------------------------------------------------------+ void TrailingByFractals(int ticket,int tmfrm,int frktl_bars,int indent,bool trlinloss) { int i, z; // counters int extr_n; // номер ближайшего экстремума frktl_bars-барного фрактала double temp; // служебная переменная int after_x, be4_x; // свечей после и до пика соответственно int ok_be4, ok_after; // флаги соответствия условию (1 - неправильно, 0 - правильно) int sell_peak_n, buy_peak_n; // номера экстремумов ближайших фракталов на продажу (для поджатия дл.поз.) и покупку соответсвенно // проверяем переданные значения if ((frktl_bars<=3) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) { Print("Трейлинг функцией TrailingByFractals() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } temp = frktl_bars; if (MathMod(frktl_bars,2)==0) extr_n = temp/2; else extr_n = MathRound(temp/2); // баров до и после экстремума фрактала after_x = frktl_bars - extr_n; if (MathMod(frktl_bars,2)!=0) be4_x = frktl_bars - extr_n; else be4_x = frktl_bars - extr_n - 1; // если длинная позиция (OP_BUY), находим ближайший фрактал на продажу (т.е. экстремум "вниз") if (OrderType()==OP_BUY) { // находим последний фрактал на продажу for (i=extr_n;i=iLow(Symbol(),tmfrm,i-z)) { ok_be4 = 1; break; } } for (z=1;z<=after_x;z++) { if (iLow(Symbol(),tmfrm,i)>iLow(Symbol(),tmfrm,i+z)) { ok_after = 1; break; } } if ((ok_be4==0) && (ok_after==0)) { sell_peak_n = i; break; } } // если тралить в убытке if (trlinloss==true) { // если новый стоплосс лучше имеющегося (в т.ч. если стоплосс == 0, не выставлен) if (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration()); } // если тралить только в профите, то else // если новый стоплосс лучше имеющегося И курса открытия if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderOpenPrice())) OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration()); } // если короткая позиция (OP_SELL), находим ближайший фрактал на покупку (т.е. экстремум "вверх") if (OrderType()==OP_SELL) { // находим последний фрактал на продажу for (i=extr_n;i