//+------------------------------------------------------------------+ //| MyFractals.mq4 | //| I_D | //| Софт для управления капиталом: http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D / Юрий Дзюбан" #property link "http://www.mymmk.com/ Софт для управления капиталом" #define magic 3904900 // импортируем библиотеку функций для различных видов трейлинга #import "TrailingAll_10.ex4" void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss); void TrailingByFractals(int ticket,int tmfrm,int frktl_bars,int indent,bool trlinloss); void TrailingStairs(int ticket,int trldistance,int trlstep); void TrailingUdavka(int ticket,int trl_dist_1,int level_1,int trl_dist_2,int level_2,int trl_dist_3); void TrailingByTime(int ticket,int interval,int trlstep,bool trlinloss); void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss); void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2,int pf_level_3,int ls_level_1,int ls_level_2,int ls_level_3,bool trlinloss); void TrailingByPriceChannel(int iTicket,int iBars_n,int iIndent); void TrailingByMA(int iTicket,int iTmFrme,int iMAPeriod,int iMAShift,int MAMethod,int iApplPrice,int iShift,int iIndent); void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff,bool bTrlinloss); // импортируем библиотеку с функцией для расчета лота по тактике Фиксированный % #import "MM_FxPrcnt.ex4" double MM_FxPrcnt(double dPrcnt,double dSl,string sSymbol); // импортируем библиотеку с функцией для расчета лота по тактике "На все" #import "MM_AllM.ex4" double MM_AllM(string sSymbol); #import "MM_OptimalF.ex4" double MM_OptimalF(int iTrades,string sSymbol,double dBe4FLot,double dDecrF,double dSl); #import //---- input parameters extern int iTrlBars = 5; static datetime dPrevtime = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { if (Bars<100) { Print("There are less than 100 bars (",Bars," on the chart. Traiding is not allowed."); return(0);} return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (dPrevtime == Time[0]) return(0); else { // корректируем ордера раз в период dPrevtime = Time[0]; // переменные: int i; double lastbuyhigh; double lastbuystop; double lastselllow; double lastsellstop; int buys, sells; // pending orders int allopens; // open orders // находим ближайшие фракталы на покупку (экстремум - вверх) и на продажу (экстремум - вниз) // фрактал на покупку for(i=1;i=High[i+2]) && (High[i+1]>=High[i+3])) { lastbuyhigh = High[i+1] + (3 + MarketInfo(Symbol(),MODE_SPREAD))*Point; lastbuystop = Low[iLowest(Symbol(),0,1,4,i)] - 1*Point; break; } } // фрактал на продажу for(i=1;iLow[i+1]) && (Low[i+1]<=Low[i+2]) && (Low[i+1]<=Low[i+3])) { lastselllow = Low[i+1] - 3*Point; lastsellstop = High[iHighest(Symbol(),0,2,4,i)] + (1+MarketInfo(Symbol(),MODE_SPREAD))*Point; break; } } // если последний закрывшийся бар "пробивает" (превышает - для фракталов на покупку или ниже - на продажу) // (покупка) экстремум последнего фрактала, то: а) если закрывается выше экстремума - выставляем бай стоп // на хай пробивающего данного бара, б) если закрывается ниже экстремума - селл стоп на лоу пробивающего бара, // тейк - на средину диапазона // для начала - просто фильтруем входы от тех, в которых пробивающая свеча закрывается ниже экстремума if ((High[1]>=lastbuyhigh) && (Close[1]>=lastbuyhigh)) { // если уже есть такие ордера и сейчас условия лучше, правим, иначе выставляем allopens = 0; buys = 0; for (i=0;i0) //OrderSend(Symbol(),OP_BUYSTOP,GlobalVariableGet("fxprcnt_lot"),High[1]+(3+MarketInfo(Symbol(),MODE_SPREAD))*Point,3,lastbuystop,0,NULL,magic,0,Red); // !!! ПРИМЕР ВЫЗОВА ФУНКЦИИ ДЛЯ РАСЧЕТА ЛОТА ПО ТАКТИКЕ "На все" !!! // (функции закомментированы - лот считает предыдущая функция) // Достаточно указать символ валютной пары (Symbol() или буквально - "EURUSD") (необходим для оценки маржевых // требований при открытии позиции. Расчитанное значение помещается в глобальную переменную терминала allm_lot. // Чтобы считать её значение, необходимо воспользоваться функцией GlobalVariableGet(allm_lot). // в данном случае функция закомментирована, поскольку лот расчитывается по тактике Фикс.% //MM_AllM(Symbol()); //if (GlobalVariableGet("allm_lot")>0) //OrderSend(Symbol(),OP_BUYSTOP,GlobalVariableGet("allm_lot"),High[1]+(3+MarketInfo(Symbol(),MODE_SPREAD))*Point,3,lastbuystop,0,NULL,magic,0,Red); /// !!! ПРИМЕР ВЫЗОВА ФУНКЦИИ ДЛЯ РАСЧЕТА ЛОТА ПО ТАКТИКЕ ОПТИМАЛЬНЫЙ % !!! //MM_OptimalF(6,Symbol(),0.1,0,High[1]+(3+MarketInfo(Symbol(),MODE_SPREAD))*Point-lastbuystop); MM_OptimalF(6,Symbol(),0.1,0,0.005); if (GlobalVariableGet("optf_lot")>0) //OrderSend(Symbol(),OP_BUYSTOP,GlobalVariableGet("optf_lot"),High[1]+(3+MarketInfo(Symbol(),MODE_SPREAD))*Point,3,lastbuystop,0,NULL,magic,0,Red); OrderSend(Symbol(),OP_BUYSTOP,GlobalVariableGet("optf_lot"),High[1]+(3+MarketInfo(Symbol(),MODE_SPREAD))*Point,3,High[1]-(50+MarketInfo(Symbol(),MODE_SPREAD))*Point,0,NULL,magic,0,Red); } } if ((Low[1]<=lastselllow) && (Close[1]<=lastselllow)) { // если уже есть такие ордера и сейчас условия лучше, правим, иначе выставляем allopens = 0; sells = 0; for (i=0;iOrderOpenPrice()) OrderModify(OrderTicket(),Low[1]-3*Point,lastsellstop,0,0,Blue); sells++; } if (OrderType()==OP_SELL) allopens++; } // если байстопов==0, выставляем if ((sells==0) && (allopens==0)) { // Для продажи вызов функции MM_FxPrcnt() отличается от покупки лишь расчетом стоплосса - в данном // случае находим его как "курс_стоплосса - курс_открытия" //MM_FxPrcnt(10,lastsellstop-Low[1]-3*Point,Symbol()); //if (GlobalVariableGet("fxprcnt_lot")>0) //OrderSend(Symbol(),OP_SELLSTOP,GlobalVariableGet("fxprcnt_lot"),Low[1]-3*Point,3,lastsellstop,0,NULL,magic,0,Blue); //MM_AllM(Symbol()); //if (GlobalVariableGet("allm_lot")>0) //OrderSend(Symbol(),OP_SELLSTOP,GlobalVariableGet("allm_lot"),Low[1]-3*Point,3,lastsellstop,0,NULL,magic,0,Blue); //MM_OptimalF(6,Symbol(),0.1,0,lastsellstop-Low[1]-3*Point); MM_OptimalF(6,Symbol(),0.1,0,0.005); if (GlobalVariableGet("optf_lot")>0) //OrderSend(Symbol(),OP_SELLSTOP,GlobalVariableGet("optf_lot"),Low[1]-3*Point,3,lastsellstop,0,NULL,magic,0,Blue); OrderSend(Symbol(),OP_SELLSTOP,GlobalVariableGet("optf_lot"),Low[1]-3*Point,3,Low[1]+50*Point,0,NULL,magic,0,Blue); } } // действия по закрытию бара (1 раз / бар) for (i=0;i