//+------------------------------------------------------------------+ //| 5minMA.mq4 | //| I_D | //| http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D" #property link "http://www.mymmk.com/ Софт для управления капиталом" #define magic 3904900 extern int iSl = 6; // стоплосс открываемых позиций (напр., 6) extern int iToBE = 6; // расстояние от открытия, на котором стоплосс переносим в безубыток (напр., 6) extern int iTP = 10; // тейкпрофит открываемых позиций (напр., 10) extern int iSMA50Diff = 3; // кол-во точек (баров) на SMA50, по которым считаем угол наклона extern double dAngleMACritical = 15; // значение наклона SMA21 по углам наклона, при превышении которого можно торговать extern int iIndent = 1; // отступ от тени свечи для выставлени ордера extern double dLot = 0.1; // рабочий лот //+------------------------------------------------------------------+ //| Взято с http://strateg.org.ua/tactics/070407.php | //| На чарт накладываем 50SMA, 21EMA & 10EMA; расчитываем угол нак- | //| лона 50SMA и накладываем на него 21EMA. Дожидаемся пересечения | //| (21EMA и 10EMA) 50SMA; далее дожидаемся, пока 21EMA на нём | //| выйдет за пределы коридора -0,1..0,1; далее ждём отката курсом в | //| зону между 21EMA и 10EMA и готовимся к отрытию. | //| Возможные варианты открытия (можно попытаться приспосообить раз- | //| личные виды трейлинга): | //| 1) после пересечения курсом 10EMA устанавливаем пробойный ордер | //| на тени пробивающей свечи в направлении наклона 50SMA и далее, | //| если он не срабатывает, переносим его на аналогичную тень следу- | //| ющей свечи, если условия открытия сохраняются; | //| 2) то же, что №1, но ордер выставляем (для продажи) на низшем | //| из лоу N последних свечей; либо №1, но с отступом от тени в Х п.;| //| 3) можно попробовать трейлинг по АТР; | //| 4) "зональный" трейлинг (производный от Баришпольца); | //| 5) другой вариант. | //| При открытии стоплосс в 6 п. + спрэд; перенос в б.у. при +6 п. | //| (т.е. на расстоянии в 6 п. + спрэд; тейкпрофит 10 п. + спрэд. | //| Если после открытия позиции курс пересекает 21EMA, устанавлива- | //| ем тейкпрофит на безубыток. | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { if ((iSl<1) || (iTP<1) || (iToBE>=iTP) || (iToBE<=MarketInfo(Symbol(),MODE_STOPLEVEL)) || (iSMA50Diff<2) || (dAngleMACritical<10) || (iIndent<0)) { Print("StopLoss (",iSl,") or TakeProfit (",iTP,") are incorrect. Expert 5min.ex4 is stopped."); return(0); } return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int n, i; // счетчики int iOpenTradesN = 0; // кол-во открытых позиций int iPendingTradesN = 0; // кол-во отложенных ордеров double dBid, dAsk; // текущие значения Бид и Аск double dToOpen = 0; // стоп ордер (экстремум последней свечи) double dMA50a = 0; // SMA50 на баре №1 (также нужно для определения угла наклона) double dMA50b = 0; // double dEMA21 = 0; // экспоненциальное среднее периода 21 double dEMA10 = 0; // экспоненциальное среднее периода 10 double dSMA50Angle = 0; // угол наклона SMA50 string s2ndCurr = 0; // служебная переменная для расчета угла наклона double dMultiply = 0; // служебная переменная для расчета угла наклона double dAngleValSum = 0; // сумма 21 одного значения углов SMA50 (делаем вручную МА) double dEMA21Angle = 0; // ЕМА21 по значениям угла наклона SMA50 double dOpenPrice = 0; // планируемый курс открытия ордера // если есть открытые позиции, сопровождаем их for (i=0;i=(iToBE + MarketInfo(OrderSymbol(),MODE_SPREAD))*Point) { if (OrderStopLoss()!=OrderOpenPrice()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),OrderExpiration(),Red)) { Print("Failed to move stoploss of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); Comment("Failed to move stoploss of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); } } } // * если стоплосс не в безубытке, и курс пересекает 21EMA, ставим тейкпрофит на безубыток if (OrderStopLoss()!=OrderOpenPrice()) { dEMA21 = iMA(OrderSymbol(),0,21,0,MODE_EMA,PRICE_CLOSE,0); if (dBid<=dEMA21) { if (OrderTakeProfit()!=OrderOpenPrice()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice(),OrderExpiration(),Red)) { Print("Failed to move takeprofit of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); Comment("Failed to move takeprofit of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); } } } } // счетчик открытых позиций iOpenTradesN++; } if (OrderType()==OP_SELL) { // * если позиция только открылась, установим стоплосс и тейкпрофит if ((OrderStopLoss()==0) || (OrderTakeProfit()==0)) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+(iSl+MarketInfo(OrderSymbol(),MODE_SPREAD))*Point,OrderOpenPrice()-(iTP+MarketInfo(OrderSymbol(),MODE_SPREAD))*Point,OrderExpiration(),Blue)) { Print("Failed to set stoploss and takeprofit of position #",OrderTicket(),". Err: ",GetLastError()); Comment("Failed to set stoploss and takeprofit of position #",OrderTicket(),". Err: ",GetLastError()); } } // * перенос в безубыток при +6 п. dAsk = MarketInfo(OrderSymbol(),MODE_ASK); if (OrderOpenPrice() - dAsk>=(iToBE + MarketInfo(OrderSymbol(),MODE_SPREAD))*Point) { if (OrderStopLoss()!=OrderOpenPrice()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),OrderExpiration(),Blue)) { Print("Failed to move stoploss of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); Comment("Failed to move stoploss of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); } } } // * если стоплосс не в безубытке, и курс пересекает 21EMA, ставим тейкпрофит на безубыток if (OrderStopLoss()!=OrderOpenPrice()) { dEMA21 = iMA(OrderSymbol(),0,21,0,MODE_EMA,PRICE_CLOSE,0); if (dAsk>=dEMA21) { if (OrderTakeProfit()!=OrderOpenPrice()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice(),OrderExpiration(),Blue)) { Print("Failed to move takeprofit of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); Comment("Failed to move takeprofit of position #",OrderTicket()," to breakeven. Err: ",GetLastError()); } } } } // счетчик открытых позиций iOpenTradesN++; } } // если открытых позиций нет, то ищем ситуацию для входа if (iOpenTradesN==0) { for (i=1;i<22;i++) { // находим значение ЕМА21 по точкам - углам наклона SMA50 // расчитаем угол наклона SMA50 между последним закрывшимся баром и баром iSMA50Diff позиций назад // для этого нам необходимо знать: а) курс SMA50 на последнем закрывшемся баре ([1]); б) курс SMA50 // iSMA50Diff баров назад; в) собственно iSMA50Diff dMA50a = iMA(Symbol(),0,50,0,MODE_SMA,PRICE_CLOSE,i); dMA50b = iMA(Symbol(),0,50,0,MODE_SMA,PRICE_CLOSE,i+iSMA50Diff); // домножим на 100 для пар с йеной и на 10000 - для остальных s2ndCurr = StringSubstr(Symbol(),3,3); if (s2ndCurr=="JPY") dMultiply = 100.0; else dMultiply = 10000; if (dMA50a!=dMA50b) { if (dMA50a>dMA50b) dSMA50Angle = MathArctan((dMA50a-dMA50b)/iSMA50Diff*(180.0/3.14159))*dMultiply; if (dMA50adAngleMACritical) || (dEMA21AngledAngleMACritical) { if ((dEMA21>dMA50a) && (dEMA10>dEMA21)) { Comment("Waiting for the buy situation."); Print("Waiting for the buy situation."); // удалим все селл-стоп ордера (при наличии таковых) // и закроем короткие позиции for (i=0;idOpenPrice) { // если так, ордер модифицируем if (!OrderModify(OrderTicket(),dOpenPrice,dOpenPrice-(iSl+MarketInfo(OrderSymbol(),MODE_SPREAD))*Point,dOpenPrice+(iTP+MarketInfo(OrderSymbol(),MODE_SPREAD))*Point,0,Red)) { Comment("Failed to modify order #",OrderTicket()," open price. Err.: ",GetLastError()); Print("Failed to modify order #",OrderTicket()," open price. Err.: ",GetLastError()); } } iPendingTradesN++; } } // если бай стоп-ордеров нет, выставляем if (iPendingTradesN==0) { dOpenPrice = High[1] + (iIndent + MarketInfo(Symbol(),MODE_SPREAD))*Point; if (OrderSend(Symbol(),OP_BUYSTOP,dLot,dOpenPrice,3,dOpenPrice-(iSl+MarketInfo(Symbol(),MODE_SPREAD))*Point,dOpenPrice+(iTP+MarketInfo(Symbol(),MODE_SPREAD))*Point,NULL,magic,0,Red)<0) { Comment("Failed to set buy stop order. Err.: ",GetLastError()); Print("Failed to set buy stop order. Err.: ",GetLastError()); } Print("dOpenPrice: ",dOpenPrice,", SL: ",dOpenPrice-(iSl+MarketInfo(Symbol(),MODE_SPREAD))*Point); } } } } // Ситуация на продажу if (dEMA21Angle=dEMA10) { // выставляем sell stop на low[1] с отступом в iIndent пунктов // перебираем ордера, ищем sell stop for (i=0;i