Navigation:Home > Content >

FractalScalp_v7.5.1.mq4

Time: 2012-01-22 | Download file:FractalScalp_v7.5.1.mq4

//+---------------------------------------------------------------------------+
//|                                                           FractalScalp v7 |
//|                                        Copyright © 2010, Хлыстов Владимир |
//|v0 Ставки при пробитии фракталов                                           |
//|   перенос SL по уровню портфельного безубытка                             |
//|   перенос TP на уровень портфельного профита                              |
//|v3 Удаление ордеров при большой просадке                                   |
//|v4 коэффициент мартингейла                                                 |
//|v5 закрытие ордеров достигших общего профита и имеющих большое общее время |
//|v7 фильтр времени работы советника          |
//|v7.2 ограничитель количества сделок в одном направлении                    |
//|v7.3 добавлены 2 переменные: CloseProfit и OrdersCloseProfit               |
//|     если общее кол-во ордеров больше OrdersCloseProfit, то все они        |
//|     закрываются при достижении общего профита CloseProfit                 |
//|v7.4 добавлен stoploss                                                     |
//|---------------------------------------------------------------------------+
#property copyright "Copyright © 2010, Vladimir Hlystov"
#property link      "cmillion@narod.ru"
//+------------------------------------------------------------------ 
extern double LOT          = 0.01;  //может быть любой, но если = 0 то лот рассчитывается автоматически по LOTrisk
extern int    LOTrisk      = 5;     //если LOT=0, то LOT=процент от депозита
extern int    Delta        = 0;     //отступ выставления отложенного ордера пунктов от фрактала 
extern int    stoploss     = 0;     //если=0, то SL отключен
extern int    takeprofit   = 20 ;   //TP
extern double K_lot        = 2.0;   //Коэффициент увеличения лота
extern double Maxlot       = 3.0;   //ограничение максимального лота
extern int    MaxRisk      = 10;    //закрывать ордера если лосс достиг MaxRisk процент от депозита
//------------------------------------------------------------------- TrailingStop
extern int    TrailingStop = 0;     //close the warrant if the loss has reached MaxRisk percentage of the deposit
extern int    Fr.or.Candl  = 1;     //если= 0, то трейлинг по фракталам 
                                    //если= 1, то трейлинг по свечам 
color         WhiteColor   = Silver;//цвет вывода информации 
extern int    Magic        = 0;
extern bool   DrawInfo     = true;
extern int   AllTimeStopOrders = 50000;//закрытие ордеров достигших общего профита и имеющих большое общее время 
extern int     RestDay_I            = 0 ,    //weekday (0-Sunday,1,2,3,4,5,6)
               RestDay_II           = 0 ,    //weekday (0-Sunday,1,2,3,4,5,6)
               TimeStart            = 0 ,
               TimeEnd              = 20;
extern int    MaxOrders             = 15;    //ограничитель количества сделок в одном направлении
extern double CloseProfit           = 10.0;  //если общее кол-во ордеров больше OrdersCloseProfit, то все они
extern int    OrdersCloseProfit     = 10;     //закрываются при достижении общего профита CloseProfit 
extern int    MAperiod              = 25;
extern int    MAmethod              = 0; //SMA 0 Простое скользящее среднее, EMA 1 Экспоненциальное скользящее среднее, SMMA 2 Сглаженное скользящее среднее, LWMA 3 Линейно-взвешенное скользящее среднее 

//-------------------------------------------------------------------
double MAXLOT,MinLot,TPb,TPs,SLb,SLs;
int OkrLOT;
double STOPLEVEL,lot_s,lot_b;
double доход_SELL,доход_BUY;
int TimeOllOpenBuy,TimeOllOpenSell,TimeBarSell,TimeBarBuy;
//-------------------------------------------------------------------
int init()
{
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   MAXLOT = MarketInfo(Symbol(),MODE_MAXLOT);
   if (Maxlot>MAXLOT) Maxlot = MAXLOT; 
   if (MinLot==0.01) OkrLOT = 2;
   if (MinLot >0.01) OkrLOT = 1;
   if (MinLot >0.1 ) OkrLOT = 0;
   if (DrawInfo){
      ObjectCreate("БАЛАНС", OBJ_LABEL, 0, 0, 0);
      ObjectSet("БАЛАНС", OBJPROP_CORNER, 1);      
      ObjectSet("БАЛАНС", OBJPROP_XDISTANCE, 10 ); 
      ObjectSet("БАЛАНС", OBJPROP_YDISTANCE, 25);
      ObjectCreate("доход", OBJ_LABEL, 0, 0, 0);
      ObjectSet("доход", OBJPROP_CORNER, 1);
      ObjectSet("доход", OBJPROP_XDISTANCE, 10 );
      ObjectSet("доход", OBJPROP_YDISTANCE, 55);
      ObjectCreate("доходS", OBJ_LABEL, 0, 0, 0);
      ObjectSet("доходS", OBJPROP_CORNER, 1);
      ObjectSet("доходS", OBJPROP_XDISTANCE, 10 );
      ObjectSet("доходS", OBJPROP_YDISTANCE, 35);
      ObjectCreate("доходB", OBJ_LABEL, 0, 0, 0);
      ObjectSet("доходB", OBJPROP_CORNER, 1);
      ObjectSet("доходB", OBJPROP_XDISTANCE, 10 );
      ObjectSet("доходB", OBJPROP_YDISTANCE, 45);
   }
   return(0);
}
//-------------------------------------------------------------------
int deinit()
{
   return(0);
}
//-------------------------------------------------------------------
int start()
{
   double _ma=NormalizeDouble(iMA(NULL,0,MAperiod,0,MAmethod,PRICE_CLOSE,0), Digits);
   int H,L, error;
   string name,NameLine;
   int SPREAD = MarketInfo(Symbol(),MODE_SPREAD);
   //----------------------------------------------------------------------- время торговли
   int TekHour  = Hour();
   bool Trede;
   if ( TekHour >= TimeStart && TekHour < TimeEnd ) Trede=true; 
   else {Trede=false;Comment("Торговля запрещена по времени","\nModify © 2011, Michelangelo®","\nwww.fxgeneral.com");}
   if (DayOfWeek()==RestDay_I||DayOfWeek()==RestDay_II) 
   {Trede=false;Comment("Торговля запрещена в этот день недели","\nModify © 2011, Michelangelo®","\nwww.fxgeneral.com");}
   //----------------------------------------------------------------------- назначение лотов
   double Lot;
   MAXLOT = NormalizeDouble(AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED)-MinLot,OkrLOT);
   if (MAXLOT<0) MAXLOT=0;
   if (MAXLOT>MarketInfo(Symbol(),MODE_MAXLOT)) MAXLOT=MarketInfo(Symbol(),MODE_MAXLOT);
   if (LOT!=0) 
   {
      if (LOT>MAXLOT) 
      {
         if (LOT FrDn) break;}
      FrDn=0;
   }
   //----------------------------------------------------------------------- проверка установленных стоп ордеров
   double StopOrderUp,StopOrderDn,price,MinBuyOrder=1000000000,MaxSellOrder,OldBuyOrder,OldSellOrder,OldBuyLot,OldSellLot;
   int TicketUp,TicketDn;
   TimeOllOpenBuy=0;TimeOllOpenSell=0;
   for (i=0; i price) MinBuyOrder = price; 
               OldBuyOrder=price;
               OldBuyLot=OrderLots();
               if (DrawInfo&&!IsTesting()){
                  NameLine="ордер Bay  "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з");
                  ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),price ,Time[0],Bid);
                  ObjectSet(NameLine, OBJPROP_COLOR,LightSkyBlue); 
                  ObjectCreate(NameLine+" з",OBJ_ARROW,0,Time[0],Bid,0,0,0,0);
                  ObjectSet(NameLine, OBJPROP_STYLE, STYLE_DOT);// Стиль   
                  ObjectSet(NameLine, OBJPROP_RAY,   false);     // Луч  
                  ObjectSet(NameLine+" з",OBJPROP_ARROWCODE,3);ObjectSet(NameLine+" з",OBJPROP_COLOR,WhiteColor);}  
            }
            if (OrderType()==OP_SELL) 
            {  TimeOllOpenSell = TimeOllOpenSell + TimeCurrent()-OrderOpenTime();
               if (MaxSellOrder < price) MaxSellOrder = price; 
               OldSellOrder=price;
               OldSellLot=OrderLots();
               if (DrawInfo&&!IsTesting()){
                  NameLine="ордер Sell "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з");
                  ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),price ,Time[0],Ask);
                  ObjectSet(NameLine, OBJPROP_COLOR,Pink);
                  ObjectCreate(NameLine+" з",OBJ_ARROW,0,Time[0],Ask,0,0,0,0);
                  ObjectSet(NameLine, OBJPROP_STYLE, STYLE_DOT);// Стиль   
                  ObjectSet(NameLine, OBJPROP_RAY,   false);     // Луч  
                  ObjectSet(NameLine+" з",OBJPROP_ARROWCODE,3);ObjectSet(NameLine+" з",OBJPROP_COLOR,WhiteColor);}
            }
         }
      }   
   }
   //----------------------------------------------------------------------- открытие и перемещение стоп ордеров
   double SL;
   //if (MinBuyOrder>FrUp)//разрешать добавлять ордера только против тренды
   if ((StopOrderUp - Point > FrUp || StopOrderUp==0) && FrUp!=0)      //если ордер BuyStop выше верхнего фрактала, меняем его на новый
   {  if (MathAbs(OldBuyOrder - FrUp)/Point>=SPREAD)                   //не открывать если уже открыт по этой цене
      {
         //Comment("открытие");
         if (TicketUp!=0) 
         {  OrderDelete(TicketUp, Blue);Print("удаление ",TicketUp," StopOrderUp ",StopOrderUp," FrUp ",FrUp);
            Sleep(500);
         }
         if (OldBuyOrder!=0) 
         {
            Lot = NormalizeDouble(OldBuyLot*K_lot,OkrLOT);
            if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную
         }
         if (ORDERS( 1)_ma)
         {
            if (Lot!=0) 
            {
               if (Trede&&TimeBarBuy!=Time[0]) 
               {
                  if (stoploss!=0)   SL = NormalizeDouble(FrUp - stoploss*  Point,Digits); else SL = 0;
                  if (OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble(FrUp, Digits),3,SL,0,NULL,Magic,0,Blue)==-1) 
                              {error=GetLastError();
                               if (error!=146) Alert("Ошибка открытия BUYSTOP ",TxtERROR(error),"   ",Symbol()," Тек.цена ",Ask," Lot ",Lot," FrUp ",FrUp);}
                  else TimeBarBuy=Time[0];
               }
            }
            else Comment(Symbol(),"BUYSTOP недостаточно средств Lot=",Lot," MAXLOT ",MAXLOT,"  MinLot ",MinLot);  
         }
      }
   }
   //if (MaxSellOrder=SPREAD)     //не открывать если уже открыт по этой цене
      {
         if (TicketDn!=0) 
         {  OrderDelete(TicketDn, Red);Print("удаление ",TicketDn," StopOrderDn ",StopOrderDn," FrDn ",FrDn);
            Sleep(500);
         }
         if (OldSellOrder!=0) 
         {
            Lot = NormalizeDouble(OldSellLot*K_lot,OkrLOT);
            if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную
         }
         if (ORDERS(-1) AllTimeStopOrders && доход_SELL+доход_BUY > 0) 
      CloseAllOrders(100);
      
   if (ORDERS(0)  > OrdersCloseProfit &&  доход_SELL+доход_BUY>= CloseProfit) 
      CloseAllOrders(100);
}
//--------------------------------------------------------------------
void TakeProfit()
{
   int tip,Ticket,error;
   bool err;
   double OTP;
   for (int i=0; iSTOPLEVEL)             
            {
               if (TPb > Ask+STOPLEVEL*Point && TPb > OTP) 
               {
                  err=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPb,0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!err) {error=GetLastError();if (error!=146) Alert("Error order ",Ticket," TakeProfit ",TxtERROR(error),"   ",Symbol(),"   TP ",TPb);}
               }
            }                                         
            if (tip==OP_SELL && MathAbs(OTP - TPs)/Point>STOPLEVEL)        
            {
               if (TPs < Bid-STOPLEVEL*Point && (TPs < OTP || OTP == 0))
               {
                  error=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPs,0,White);
                  Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) {error=GetLastError();if (error!=146) Alert("Error order ",Ticket," TakeProfit ",TxtERROR(error),"   ",Symbol(),"   TP ",TPs);}
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
void TrailingStop()
{
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP,TP;
   for (int i=0; i SLb && StLo OSL && SLb!=0)
               {  error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,Digits),TP,0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Alert("Error order ",Ticket," TrailingStop ",
                              TxtERROR(0),"   ",Symbol(),"   SL ",StLo,"   TP ",TP);
               }
            }                                         
            if (tip==OP_SELL)        
            {
               StLo = NormalizeDouble(SlLastBar(-1,Ask+STOPLEVEL*Point,Fr.or.Candl,TrailingStop),Digits);  
               if (StLo==0) continue;
               TP = OrderTakeProfit();
               if (StLo < SLs && StLo>Ask+STOPLEVEL*Point)
               if (StLo < OSL || OSL==0)
               {  error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,Digits),TP,0,White);
                  Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Alert("Error order ",Ticket," TrailingStop ",
                              TxtERROR(0),"   ",Symbol(),"   SL ",StLo,"   TP ",TP);
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
double SlLastBar(int tip,double price, int tipFr, int tral)
{
   double fr;
   int j;
   if (tral!=0)
   {
      if (tip==1) fr = Bid - tral*Point;  
      else fr = Ask + tral*Point;  
   }
   else
   {
      if (tipFr==0)
      {
         if (tip== 1)
         for (j=2; j<100; j++) 
         {
            fr = iFractals(NULL,0,MODE_LOWER,j);
            if (fr!=0) {fr =fr - Delta*Point; if (price > fr) break;}
            else fr=0;
         }
         if (tip==-1)
         for (j=2; j<100; j++) 
         {
            fr = iFractals(NULL,0,MODE_UPPER,j);
            if (fr!=0) {fr =fr + Delta*Point; if (price < fr) break;}
            else fr=0;
         }
      }
      else
      {
         if (tip== 1)
         for (j=1; j<100; j++) 
         {
            fr = iLow(NULL,0,j);
            if (fr!=0) if (price > fr) break;
            else fr=0;
         }
         if (tip==-1)
         for (j=1; j<100; j++) 
         {
            fr = iHigh(NULL,0,j);
            if (price < fr) break;
            else fr=0;
         }
      }
   }
   return(fr);
}
//-------------------------------------------------------------------- вычисление общего (портфельного) TP
void TProfit()
{
   if (takeprofit==0) return(0);
   int b,s;
   double price,price_b,price_s,lot,LOTmax;
   lot_s=0;lot_b=0;SLb=0;SLs=0;доход_SELL=0;доход_BUY=0;
   for (int i=0; iBid-STOPLEVEL*Point) TPs=Bid-STOPLEVEL*Point;
   //--------------------------------------
   if (DrawInfo){ObjectDelete("SLb");ObjectDelete("SLb_");}
   if (b!=0) 
   {  SLb = price_b/lot_b;
      if (DrawInfo){
         ObjectCreate("SLb",OBJ_ARROW,0,Time[0],TPb,0,0,0,0);                     
         ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLb",OBJPROP_COLOR, Blue);
         ObjectCreate("SLb_",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
         ObjectSet   ("SLb_",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLb_",OBJPROP_COLOR, Navy);}
   }
   if (DrawInfo){ObjectDelete("SLs");ObjectDelete("SLs_");}
   if (s!=0) 
   {  SLs = price_s/lot_s;
      if (DrawInfo){
         ObjectCreate("SLs",OBJ_ARROW,0,Time[0],TPs,0,0,0,0);                     
         ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLs",OBJPROP_COLOR, Red);
         ObjectCreate("SLs_",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
         ObjectSet   ("SLs_",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLs_",OBJPROP_COLOR, Maroon);}
   }
   //-------------- баланс
   double Balans = AccountBalance();
   if (DrawInfo)
      {double доход=доход_BUY+доход_SELL;
      color TextColor=Green;
      ObjectSetText("БАЛАНС","  БАЛАНС = "+DoubleToStr(Balans,2)+" |своб "+DoubleToStr(AccountFreeMargin(),2)+" | "+DoubleToStr(MAXLOT,2)+" | "+WindowFirstVisibleBar(),8,"Arial",WhiteColor);
      if (доход<0) TextColor=Red;
      ObjectSetText("доход",StringConcatenate("Общий доход = ",DoubleToStr(доход,2)),8,"Arial",TextColor);
      if (доход_SELL<0) TextColor=Red; else TextColor=Green;
      ObjectSetText("доходS",StringConcatenate(s," SELL ",DoubleToStr(lot_s,OkrLOT)," лот  доход = ",DoubleToStr(доход_SELL,2)," Т ",TimeOllOpenSell),8,"Arial",TextColor);
      if (доход_BUY<0) TextColor=Red; else TextColor=Green;
      ObjectSetText("доходB",StringConcatenate(b," BUY  ",DoubleToStr(lot_b,OkrLOT)," лот  доход = ",DoubleToStr(доход_BUY ,2)," Т ",TimeOllOpenBuy),8,"Arial",TextColor);}
   
   

   if (-(доход_BUY+доход_SELL) > (Balans*MaxRisk/100)) CloseAllOrders(100);
   
/*   if (-доход_BUY  > (Balans*MaxRisk/100)) CloseAllOrders(OP_BUY);
   if (-доход_SELL > (Balans*MaxRisk/100)) CloseAllOrders(OP_SELL);*/
}
//--------------------------------------------------------------------
string TxtERROR(int e)
{
   if (e==0) e = GetLastError();
   switch ( e )
   {                  
      case 0:   return;
      case 1:   return;
      case 2:   return("Общая ошибка  ");
      case 3:   return("неправильные параметры   ");
      case 6:   return("Нет связи с торговым сервером   ");
      case 130: return("Неправильные стопы   ");
      case 131: return("Неправильный объем ");
      case 133: return("Торговля запрещена ");
      case 134: return("Недостаточно денег   ");
      case 136: return("Нет цен ");
      case 146: return("Подсистема торговли занята ");
      case 129: return("Неправильная цена ");
      case 131: return("Неправильный объем ");
      case 4051:return("Недопустимое значение параметра функции ");
      case 4059:return("Функция не разрешена в тестовом режиме");
      case 4063:return("Ожидается параметр типа integer ");
      case 4105:return("Ни один ордер не выбран ");
      case 4107:return("Неправильный параметр цены для торговой функции ");
      case 4108:return("Неверный номер тикета ");
      case 4109:return("Торговля не разрешена. Необходимо включить опцию `Разрешить советнику торговать` в свойствах эксперта.");
      case 4200:return("Объект уже существует ");
      default:  return(StringConcatenate("Error  ",e,"   "));
   }
}
//------------------------------------------------------------------------------------------------------------
int CloseAllOrders(int tip)
{  
   bool error=true;
   int Ошибка,nn;
   while(true)
   {
      string txt;
      for (int j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
               if ((tip==OP_BUY || tip==100) && OrderType()==OP_BUY) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Red);
                  if (error) txt=StringConcatenate(txt,"Закрыт ордер N ",OrderTicket(),"  прибыль ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n");
               }
               if ((tip==OP_SELL || tip==100) && OrderType()==OP_SELL) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Red);
                  if (error) txt=StringConcatenate(txt,"Закрыт ордер N ",OrderTicket(),"  прибыль ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n");
               }
               if (!error) 
               {
                  j--;
                  Ошибка = GetLastError();
                  if (Ошибка<2) continue;
                  if (Ошибка==129) //Неправильная цена
                  {
                     Sleep(5000);
                     RefreshRates();
                     continue;
                  }
                  if (Ошибка==146) //Подсистема торговли занята
                  {
                     if (!IsTesting()) if (IsTradeContextBusy()) Sleep(2000);
                     continue;
                  }
                  txt=StringConcatenate("Ошибка закрытия ордера N ",OrderTicket(),"   ",TxtERROR(Ошибка),"   ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n");
               }
            }
         }
      }
      Comment(txt);
      int n=0;
      txt="";
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == tip || tip==100)) {txt=StringConcatenate(txt,OrderTicket(),"\n"); n++;}
         }  
      }
      if (n==0) break; else {Sleep(2000);Comment("Не все ордера удалены, осталось еще ",n,"\n",txt);}
      nn++;
      if (nn>100) {Comment("не могу закрыть ордер");break;}
   }
   return(0);
}
//+------------------------------------------------------------------+
int ORDERS(int tip)
{
   int N_Sell,N_Buy;
   for (int i=0; i        

Recommend