//+------------------------------------------------------------------+
//|                                                 e-LemanTrend.mq4 |
//|                          Copyright © 2010, D. Zhebrak aka Necron |
//|                                                  www.mqlcoder.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, D.Zhebrak aka Necron"
#property link      "www.mqlcoder.ru"
#property link      "mailto: mqlcoder@yandex.ru"
#define   version   "1.0.0.3"
#define   Ea_Name   "e_LemanTrend"
#include <stdlib.mqh>
extern string i_property="Íàñòðîéêè èíäèêàòîðà LeManTrend";
extern int     Min       = 13;
extern int     Midle     = 21;
extern int     Max       = 34;
extern int     PeriodEMA = 3;
extern string e_property="Íàñòðîéêà ñîâåòíèêà";
extern int     MagicNumber=20100802;            //ìàãè÷åñêèé íîìåð ýêñïåðòà
extern double  Lot=0.1;                         //ëîò äëÿ òîðãîâëè
extern int     StopLoss=34;                     //ñòîï-ëîññ, -1 - íå óñòàíàâëèâàåì
extern int     TakeProfit=55;                   //òåéê-ïðîôèò, -1 - íå óñòàíàâëèâàåì
extern int     TrailingStop=21;                 //òðåéëèíã-ñòîï â ïóíêòàõ
extern int     TrailingStep=10;                 //øàã òðåéëèíã-ñòîïà
int      OrdersNum=0,
         Ticket=0,
         err=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Create.Label("copyright","www.mqlcoder.ru",Gray,10,10,3,10); 
   if(!IsTesting() && !IsDemo())
    {
     Alert("Ýêñïåðò "+Ea_Name+" íå ïðåäíàçíà÷åí äëÿ ðàáîòû íà ðåàëüíîì òîðãîâîì ñ÷åòå. \n",
            "Îáðàòèòåñü ê ðàçðàáîò÷èêó: www.mqlcoder.ru \n",
            "mailto: mqlcoder@yandex.ru");
     return(-1);           
    }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   if(ObjectFind("copyright")!=-1) ObjectDelete("copyright"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- 
   static int bt;
   
   if(init()==-1)
    {
     Print("Îøèáêà èíöèàëèçàöèè òîðãîâîãî ýêñïåðòà "+Ea_Name+"");
     return(-1);
    }
   OrdersNum=Orders.Total(Symbol(),-1,MagicNumber);
   
   if(OrdersNum>0)
    {
     TrailingStop();
    }  
  
   if(bt==Time[0])return(-1);
   
   if(OrdersNum>0)
    {
     if(Signal()==-1) Order.Close(OP_BUY);
     if(Signal()== 1) Order.Close(OP_SELL);  
    }  
   if(OrdersNum<1)
    {
     if(Signal()==1)
      {
       Ticket=OrderSend(Symbol(),OP_BUY,Lot,-nd(Ask,Symbol()),3,Get.SL(OP_BUY),Get.TP(OP_BUY),Ea_Name,MagicNumber,0,Lime);
       if(Ticket<0)
        {
         err=GetLastError();
         Print("Îøèáêà îòêðûòèÿ OP_BUY #"+err+": "+ErrorDescription(err)+"");
        }
      }
     if(Signal()==-1)
      {
       Ticket=OrderSend(Symbol(),OP_SELL,Lot,nd(Bid,Symbol()),3,Get.SL(OP_SELL),Get.TP(OP_SELL),Ea_Name,MagicNumber,0,Red);
       if(Ticket<0)
        {
         err=GetLastError();
         Print("Îøèáêà îòêðûòèÿ OP_SELL #"+err+": "+ErrorDescription(err)+"");
        }
      } 
    }
   bt=Time[0];
//----
   return(0);
  }
//+------------------------------------------------------------------+
//---- ô. âîçâðàùàåò 1 åñëè ïîÿâèëñÿ ñèãíàë íà ïîêóïêó è -1 åñëè ïîÿâèëñÿ ñèãíàë íà ïðîäàæó
int Signal()
 {
  double value1[2], value2[2];
  int _return=0;
   
   value1[0]=iCustom(Symbol(),0,"LeManTrend",Min,Midle,Max,PeriodEMA,0,1);
   value1[1]=iCustom(Symbol(),0,"LeManTrend",Min,Midle,Max,PeriodEMA,0,2); 
   value2[0]=iCustom(Symbol(),0,"LeManTrend",Min,Midle,Max,PeriodEMA,1,1);
   value2[1]=iCustom(Symbol(),0,"LeManTrend",Min,Midle,Max,PeriodEMA,1,2);
  
   if(value1[1]<value2[1] && value1[0]>value2[0]) _return=1;
   if(value1[1]>value2[1] && value1[0]<value2[0]) _return=-1;
  
  return(_return);
 }
//---- ô. âîçâðàùàåò êîëè÷åñòâî îðäåðîâ ýêñïåðòà 
int Orders.Total(string sym, int ty, int mn) 
 {
  int i=0, 
      k=OrdersTotal()-1,
      num=0;
   
   for (i=k;i>=0;i--) 
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      {
       if(OrderSymbol()==sym||sym=="") 
        {
         if(OrderType()==ty||ty<0) 
          {
           if(OrderMagicNumber()==mn||mn<0) num++;
          }
        }
      }
    }
  return(num);
 }
//---- ô. âîçâðàùàåò çíà÷åíèå Point ñ ó÷åòîì âîçìîæíîãî ïÿòèçíàêà 
double PointX(string _Symbol)
 {  
   int dg=MarketInfo(_Symbol,MODE_DIGITS);
   double   PointX = 0,
            po=MarketInfo(_Symbol,MODE_POINT);
   if(dg==5||dg==3) 
     {
      PointX=po*10;
     }
   if(dg==4||dg==2) 
     {
      PointX=po;
     }
   return(PointX);
 }
//---- ô. âîçâðàùàåò íîðìàëèçîâàííóþ öåíó äî Digits îïðåäåëåííîãî ñèìâîëà  
double nd(double v,string _Symbol)
 {
  int dg=MarketInfo(_Symbol,MODE_DIGITS);
  return(NormalizeDouble(v,dg));
 }
//---- ô. ñîçäàåò îáúåêò Label íà ãðàôèêå 
void Create.Label(string name, string txt, color clr, int x, int y,int corner,int FontSize) 
 {
  if (ObjectFind(name)<0) ObjectCreate(name, OBJ_LABEL, 0, 0,0);
  ObjectSetText(name, txt, FontSize);
  ObjectSet(name, OBJPROP_COLOR    , clr);
  ObjectSet(name, OBJPROP_XDISTANCE, x);
  ObjectSet(name, OBJPROP_YDISTANCE, y);
  ObjectSet(name, OBJPROP_CORNER   , corner);
  ObjectSet(name, OBJPROP_FONTSIZE , FontSize);
 }
//---- ô. çàêðûâàåò ïîçèöèè ýêñïåðòà îïðåäåëåííîãî òèïà  
void Order.Close(int ty)
 {
  for(int k=OrdersTotal()-1;k>=0;k--)
   {
    if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol())
       {
        if(OrderMagicNumber()==MagicNumber)
         {
          if(OrderType()==ty||ty<0)
           {
            if(OrderType()==OP_BUY)       OrderClose(OrderTicket(),OrderLots(),nd(Bid,Symbol()),3,Lime);
            else if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),nd(Ask,Symbol()),3,Red);
            else break;
           }
         }
       }
     }
   }
  return; 
 }  
double Get.TP(int ty)
 {
  double _return;
  
  if(ty==OP_BUY)
   {
    if(TakeProfit>0) _return=nd(Ask+TakeProfit*PointX(Symbol()),Symbol());
    else           _return=0;
   }
  else if(ty==OP_SELL)
   {
    if(TakeProfit>0) _return=nd(Bid-TakeProfit*PointX(Symbol()),Symbol());
    else             _return=0;
   } 
  return(_return); 
 } 
double Get.SL(int ty)
 {
  double _return;
  
  if(ty==OP_BUY)
   {
    if(StopLoss>0) _return=nd(Ask-StopLoss*PointX(Symbol()),Symbol());
    else           _return=0;
   }
  else if(ty==OP_SELL)
   {
    if(StopLoss>0) _return=nd(Bid+StopLoss*PointX(Symbol()),Symbol());
    else           _return=0;
   } 
  return(_return); 
 }
void TrailingStop()
 {
  int total=OrdersTotal()-1;
  
  for(int j=total;j>=0;j--)
     {
      if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)  
           {
            if(OrderType()==OP_BUY) 
              {
               if(TrailingStop>0)  
                 {                 
                  if(Bid-OrderOpenPrice()>TrailingStop*PointX(Symbol()) )
                    {
                     if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*PointX(Symbol()))
                       {
                        OrderModify(OrderTicket(),OrderOpenPrice(),nd(Ask-TrailingStop*PointX(Symbol()),Symbol()),OrderTakeProfit(),0,CLR_NONE);
                        return; 
                       }
                    }
                 }
              }
            else if(OrderType()==OP_SELL) 
              {
               if(TrailingStop>0)  
                 {                 
                  if((OrderOpenPrice()-Ask)>(PointX(Symbol())*TrailingStop))
                    {
                     if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*PointX(Symbol()))
                       {
                        OrderModify(OrderTicket(),OrderOpenPrice(),nd(Bid+TrailingStop*PointX(Symbol()),Symbol()),OrderTakeProfit(),0,CLR_NONE);
                        return; 
                       }
                    }
                 }
              }
           }
         }
     }  
  return; 
 }   
             
            
            
Comments