//+------------------------------------------------------------------+ // 05.09.2011 #property copyright "Vladislav Semenov" //разработано под 5-значную систему (для 4-х значной поделить на 10:TakeProfit,StopLoss,TrailingStop,shum,dopusk //протестировано на eurusd H1 и M30 за 2011г., за 2010г. - сливает //Стоят параметры на Н1, для М30: shum=180, TrailingStop=150,min=5, остальное как для Н1 //-------------------------------------------------Внешние переменные------------------------------------------------- extern double Prots = 0.4; // Уровень риска extern double TakeProfit = 2000; // Уровень фиксации прибыли в пипсах,не должен срабатывать, прибыль по тралу extern double StopLoss = 2000; // Уровень фиксации убытков в пипсах, не должен срабатывать, выход по тралу extern double TrailingStop = 30; //Скользящий тейк-профит, ноль чтобы отключить его extern int bar_kol = 2; // Столько баров живет позиция extern bool autoStopLoss = true;//на след.баре TakeProfit будет равен цене открытия сделки (безубыток) extern bool MaxHistoryCheck=false;//Если вкл.-использует всю историю, иначе-только последний ордер (включить,если торгуете не только по этому советнику) extern int min = 7; // позиция открывается в первые х минут,за оставшееся время предпологаем, что будет откат extern double shum = 150;// на эту величину в пипсах должна уйти цена от цены открытия бара extern double dopusk = 0; // длина противоположной тени не должна превышать это значение extern int open_hour = 0; //С этого часа разрешено открывать сделки extern int stop_hour = 24; //После этого часа запрещается открывать сделки extern int magic = 56565; extern int Slip = 10;// Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу) //-------------------------------------------------------------------------------------------------------------------- int start() // { int cnt, total,i; total = OrdersTotal(); //Включение/отключение проверки всей истории------------------------ if (MaxHistoryCheck==true) //Включена проверка всей истории { int k_history=0; } //проверяются все сделки с самой первой else k_history=(OrdersHistoryTotal());//проверяется только последняя сделка (ускоряет процесс оптимизации и работы советника) // нарастающий лот double Lots, Lotik; Lotik=MathFloor(AccountFreeMargin()*Prots/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);// Лоты if (Lotik >= 5) Lots=5; if (Lotik < 5) Lots = Lotik; //----------------------------------------------------------------------------------------- // Запрет на торговлю,если на этом баре была открыта сделка int op = 0; // вводим переменную, она равна 1, если была открыта или закрыта позиция на баре, иначе 0 for(i = k_history; i <= OrdersHistoryTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); if( iBarShift(NULL,NULL, OrderOpenTime() ) ==0 ) // op=1; } //--------------------------------------------------1)Открытие позиции на покупку------------------------------------- if(total<1 && Hour()>=open_hour && Hour()<=stop_hour && (TimeCurrent()-Time[0])<=min*60 ) // Нет открытых ордеров+ограничение по времени { if ( op==0 && High[0]<=(Open[0]+dopusk*Point) && (Open[0]-NormalizeDouble(Ask,Digits))>=shum*Point ) { OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), Slip, NormalizeDouble((Bid - StopLoss*Point),Digits), NormalizeDouble((Ask + TakeProfit*Point),Digits), "buy", magic, 0, Green); } //1б)Проверка на возможность открыть короткую позицию if ( op==0 && Low[0]>=(Open[0]-dopusk*Point) && (NormalizeDouble(Bid,Digits)-Open[0])>=shum*Point ) { OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid,Digits), Slip, NormalizeDouble((Ask + StopLoss*Point),Digits), NormalizeDouble((Bid - TakeProfit*Point),Digits), "sell", magic, 0, Red); } return(0); } //----------------------------------------------2)Закрытие позиций через бар на безубыток----------------------------------------------- for(cnt = 0; cnt < total; cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol()==Symbol()) // проверка открытых позиций { //2а)Закрытие на безубыток длинной позиции if(OrderType() == OP_BUY) // открыта длинная позиция { if ( autoStopLoss == true && iBarShift(NULL,NULL, OrderOpenTime() ) ==1 && NormalizeDouble(Bid,Digits) >=OrderOpenPrice() ) { OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), Slip, Violet); // закрытие позиции return(0); } } else //2в)Закрытие на безубыток короткой позиции { if ( autoStopLoss == true && iBarShift(NULL,NULL, OrderOpenTime() ) ==1 && NormalizeDouble(Ask,Digits) <=OrderOpenPrice() ) { OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), Slip, Violet); // закрытие позиции return(0); } } } } //---------------------------------------------------3)Закрытие позиций ----------------------------------------------- for(cnt = 0; cnt < total; cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol()==Symbol()) // проверка открытых позиций { //3а)Закрытие длинной позиции if(OrderType() == OP_BUY) // открыта длинная позиция { if ( iBarShift(NULL,NULL, OrderOpenTime() ) >=bar_kol //условие закрытия по времени ) { OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), Slip, Violet); // закрытие позиции return(0); } //3б)Трейлинг-стоп на длинной позиции if(TrailingStop > 0) { if(NormalizeDouble((Bid - OrderOpenPrice()),Digits) > NormalizeDouble(Point*TrailingStop,Digits)) { if(NormalizeDouble(OrderStopLoss(),Digits) < (NormalizeDouble((Bid - Point*TrailingStop ),Digits)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble((Bid-Point*TrailingStop),Digits), OrderTakeProfit(), 0, Green); return(0); } } } } else //3в)Закрытие короткой позиции { if ( iBarShift(NULL,NULL, OrderOpenTime() ) >=bar_kol //условие закрытия по времени ) { OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), Slip, Violet); // закрытие позиции return(0); } //3г)Трейлинг-стоп на короткой позиции if(TrailingStop > 0) { if((NormalizeDouble(OrderOpenPrice(),Digits) - NormalizeDouble(Ask,Digits)) > NormalizeDouble(Point*TrailingStop,Digits)) { if((NormalizeDouble(OrderStopLoss(),Digits) > (NormalizeDouble(Ask,Digits) + NormalizeDouble(Point*TrailingStop,Digits))) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble((Ask + Point*TrailingStop),Digits), OrderTakeProfit(), 0,Red); return(0); } } } //---------------------------------------------------------------------------------------------------------------------- } } } return(0); } //+--------------------------------------------------------------------------------------------------------------------+