//+--------------------------------------------------------------------------+ //| mv-e-DailyRange.mq4 | //| Максим Василенко В. MaxV42 | //| http:// | //| Таймфрейм H1. | //| Версия 1.0: | //+--------------------------------------------------------------------------+ #property copyright "Максим Василенко В. MaxV42" #property link "http://" //+------------------------------------------------------------------+ #include // Библиотека функций для работы с позициями. (Ким Игорь В.) #include // Библиотека функций для работы с ордерами. (Ким Игорь В.) #include // Библиотека функций расчёта размера лота. (Ким Игорь В.) //+------------------------------------------------------------------+ // Внешние параметры советника extern string Exp_Coment1= "--- Внешние параметры советника ---"; extern int MagicNumber = 12345; // MagicNumber extern bool UseTrailing = false; // Использовать трал extern bool Use.Buy = true; // окрывать позиции покупки extern bool Use.Sell = true; // окрывать позиции продажи extern int DailyRange.Buy = 100; // дистанция в пунктах от дневного High[0] для открытия позиции Buy extern int DailyRange.Sell = 138; // дистанция в пунктах от дневного Low[0] для открытия позиции Sell extern int SessionTrade.Begin = 21; // Начало торговой сесии extern int SessionTrade.Finish = 21; // Завершение торговой сесии extern bool Use.SessionFilter = true; // Вкл/выкл временного фильтра торговли extern string Exp_Coment2= "0-простой трал, 1-использовать 1-st Level Stop/Reverse и 1-st Level Stop/Reverse"; extern int Trailing.Type = 0; // 0 - простой трал, 1 - использовать "1-st Level Stop/Reverse" и "1-st Level Stop/Reverse" extern string Exp_Coment3= "0-StopLoss и TakeProfit не используются"; extern int StopLoss.Buy = 86; // Стоп лосс в пунктах extern int TakeProf.Buy = 130; // Тейк проф в пунктах extern int StopLoss.Sell = 142; // Стоп лосс в пунктах extern int TakeProf.Sell = 146; // Тейк проф в пунктах //+------------------------------------------------------------------+ // параметры технических индикаторов int nBars=0; //+------------------------------------------------------------------+ int init() { // expert initialization function return(0); } //+------------------------------------------------------------------+ int deinit() { // expert deinitialization function return(0); } //+------------------------------------------------------------------+ int start() { // expert start function // новый бар не появился if(!isNewBar()) return; // ----- Торговая функция Trade(Criterion()); return(0); } //+------------------------------------------------------------------+ int Criterion() { // Функция вычисления торговых критериев. bool IsOpenBuy =ExistPositions(NULL, OP_BUY, MagicNumber, 0); // флаг существования рыночных Buy-ордеров bool IsOpenSell=ExistPositions(NULL, OP_SELL, MagicNumber, 0); // флаг существования рыночных Sell-ордеров datetime dSessionTrade.Begin=StrToTime(TimeToStr(Time[0],TIME_DATE)+" "+DoubleToStr(SessionTrade.Begin,0)+":00"); datetime dSessionTrade.Finish=StrToTime(TimeToStr(Time[0],TIME_DATE)+" "+DoubleToStr(SessionTrade.Finish,0)+":00"); //--------------------------------------------------------- 1 -- // условие для покупки if(Use.Buy && !IsOpenBuy && // (iHigh(Symbol(),PERIOD_D1,0)-MarketInfo(Symbol(),MODE_ASK))/Point>DailyRange.Buy) { // // ----- фильтр по времени торговли НЕ включен if(!Use.SessionFilter) return(10); // ----- фильтр по времени торговли включен if(Time[0]>=dSessionTrade.Begin && Time[0]<=dSessionTrade.Finish) { return(10); } } // условие для закрытия Buy по столоссу if( IsOpenBuy && DistMarketAndPos(NULL, OP_BUY, MagicNumber)<=StopLoss.Buy*(-1) && StopLoss.Buy>0 ) return(11); // условие для закрытия Buy по тейкпрофиту if( IsOpenBuy && DistMarketAndPos(NULL, OP_BUY, MagicNumber)>=TakeProf.Buy && TakeProf.Buy>0 ) return(11); //--------------------------------------------------------- 2 -- // условие для продажи if(Use.Sell && !IsOpenSell && // (MarketInfo(Symbol(),MODE_BID)-iLow(Symbol(),PERIOD_D1,0))/Point>DailyRange.Sell) { // // ----- фильтр по времени торговли НЕ включен if(!Use.SessionFilter) return(20); // ----- фильтр по времени торговли включен if(Time[0]>=dSessionTrade.Begin && Time[0]<=dSessionTrade.Finish) { return(20); } } // условие для закрытия Sell по столоссу if( IsOpenSell && DistMarketAndPos(NULL, OP_SELL, MagicNumber)<=StopLoss.Sell*(-1) && StopLoss.Sell>0 ) return(21); // условие для закрытия Sell по тейкпрофиту if( IsOpenSell && DistMarketAndPos(NULL, OP_SELL, MagicNumber)>=TakeProf.Sell && TakeProf.Sell>0 ) return(21); return(0); } void Trade(int TradeSignal) { // Торговая функция // TradeSignal - тип торговой операции: // 10 - открытие Buy // 20 - открытие Sell // 11 - закрытие Buy // 21 - закрытие Sell // 0 - значимых критериев нет bool IsOpenBuy =ExistPositions(NULL, OP_BUY, MagicNumber, 0); // флаг существования рыночных Buy-ордеров bool IsOpenSell=ExistPositions(NULL, OP_SELL, MagicNumber, 0); // флаг существования рыночных Sell-ордеров switch(TradeSignal) { //--------------------------------------------------------- 1 -- case 10: // Торговый критерий = Buy if(IsOpenSell) ClosePosFirstProfit(NULL, OP_SELL, MagicNumber); // Закрыть все Sell OpenPosition(NULL, OP_BUY, GetSizeLot(), 0, 0, MagicNumber, ""); // Открыть Buy break; // Поторговали - уходим //--------------------------------------------------------- 2 -- case 11: // Торг. крит. = закрытие Buy ClosePosFirstProfit(NULL, OP_BUY, MagicNumber); // Закрыть все Buy break; // Поторговали - уходим //--------------------------------------------------------- 2 -- case 20: // Торговый критерий = Sell if(IsOpenBuy) ClosePosFirstProfit(NULL, OP_BUY, MagicNumber); // Закрыть все Buy OpenPosition(NULL, OP_SELL, GetSizeLot(), 0, 0, MagicNumber, ""); // Открыть Sell break; // Поторговали - уходим //--------------------------------------------------------- 4 -- case 21: // Торг. крит. = закрытие Sell ClosePosFirstProfit(NULL, OP_SELL, MagicNumber); // Закрыть все Sell break; // Поторговали - уходим //--------------------------------------------------------- 5 -- case 0: // Удержание открытых позиций if(IsOpenSell || IsOpenBuy) { if(UseTrailing) { if(Trailing.Type==0) SimpleTrailing(NULL, -1, MagicNumber); // Простой трал позиций } } break; // Поторговали - уходим } return; } //+---------------------------------------------------------------------------+ bool isNewBar() { // Функция возвращает true, если появиться новый бар, иначе false if(nBars!=Bars) { nBars=Bars; return(true); } return(false); }