e-LemanTrend

Author: Copyright � 2010, D.Zhebrak aka Necron
Price Data Components
Series array that contains close prices for each bar
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
e-LemanTrend
//+------------------------------------------------------------------+
//|                                                 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

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---