EMA_WMA_trend

Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Indicators Used
Moving average indicatorFractals
0 Views
0 Downloads
0 Favorites
EMA_WMA_trend
//+------------------------------------------------------------------+
//|                                                EMA_WMA_trend.mq4 |
//|                               Copyright © 2010, Õëûñòîâ Âëàäèìèð |
//|                                                cmillion@narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, http://cmillion.narod.ru"
#property link      "cmillion@narod.ru"
//--------------------------------------------------------------------
extern int     MA_Slow_Open         = 5,        //ïåðèîä MA äëÿ îòêðûòèÿ îðäåðà
               MA_Fast_Open         = 2,        //ïåðèîä MA äëÿ îòêðûòèÿ îðäåðà
               MA_Slow_trend        = 33,       //ïåðèîä MA äëÿ îïðåäåëåèÿ òðåíäà
               MA_Fast_trend        = 13,       //ïåðèîä MA äëÿ îïðåäåëåèÿ òðåíäà
               stoploss             = 0,
               takeprofit           = 200,
               risk                 = 10,       //ïðîöåíò ñâîáîäíûõ ñðåäñòâ äëÿ ðàñ÷åòà ïëàâàþùåãî îðäåðà
               Magic                = 777;
extern double  Lot                  = 0.1;      //åñëè Lot=0, òî ëîò ðàñ÷èòûâàåòñÿ îò ñâîáîäíûõ ñðåäñòâ
extern string  ïàðàìåòðû.òðåéëèíãà  = "0-îòêë 1-ïî ñâå÷àì 2-ïî ôðàêò áîëüøå2-ïî ïóíêòàì";
extern int     TrailingStop         = 120;      //åñëè= 0, òî òðåéëèíã îòêëþ÷åí
extern int     deltaFR              = 0;        //îòñòóï îò ôðàêòàëà èëè ñâå÷è
extern bool    òîëüêî_ïðîôèòíûå     = true;     //òðàëèòü òîëüêî ïðèáûëüíûå îðäåðà
extern bool    òîëüêî_áåçóáûòîê     = false;    //òðàëë òîëüêî â áåçóáûòîê
extern double  Step                 = 5;        //øàã èçìåíåíèÿ ñòîïîâ
extern int     TimeStart            = 0 ,       //÷àñ íà÷àëà ðàáîòû
               TimeEnd              = 24,       //÷àñ îêîí÷àíèÿ ðàáîòû
               MaxOrders            = 1;        //ìàêñèìàëüíîå êîëëè÷åñòâî îäíîâðåìåííî îòêðûòûõ îðäåðîâ
//--------------------------------------------------------------------
double SL,TP,LOT;
int TimeBar,slippage,STOPLEVEL;
//--------------------------------------------------------------------
int init()
{
   Comment("EMA_WMA_trend","\n","Copyright © 2010 cmillion@narod.ru");
   Step=Step*Point;
   if (Digits==5 || Digits==3) slippage=30;
}
//--------------------------------------------------------------------
int start()
{
   bool TradeTime;
   double S0,F0,S1,F1,MA_TrednS,MA_TrednF;
   int Tredn;
   if (TimeHour(TimeCurrent()) >=TimeStart  && TimeHour(TimeCurrent()) < TimeEnd) TradeTime=1;
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (TrailingStop!=0) TrailingStop();
   if (TimeBar==Time[0]) return(0);
   if (MA_Slow_trend!=0) MA_TrednS = iMA(NULL,0,MA_Slow_trend,0,MODE_EMA, PRICE_OPEN,0);
   if (MA_Fast_trend!=0) MA_TrednF = iMA(NULL,0,MA_Fast_trend,0,MODE_LWMA,PRICE_OPEN,0);
   S0 = iMA(NULL,0,MA_Slow_Open,0,MODE_EMA, PRICE_OPEN,0);
   F0 = iMA(NULL,0,MA_Fast_Open,0,MODE_LWMA,PRICE_OPEN,0);
   S1 = iMA(NULL,0,MA_Slow_Open,0,MODE_EMA, PRICE_OPEN,1);
   F1 = iMA(NULL,0,MA_Fast_Open,0,MODE_LWMA,PRICE_OPEN,1);
   if (MA_TrednS < MA_TrednF) Tredn= 1;
   if (MA_TrednS > MA_TrednF) Tredn=-1;
   if (S0 < F0 && S1 > F1)
   {
      TimeBar=Time[0];                            
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
      if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*  Point,Digits); else SL = 0;
      LOT = LOT(risk,1);
      CLOSEORDER(-1);
      if (Tredn>-1 && TradeTime && ORDERS( 1) < MaxOrders) OPENORDER ( 1);
   }
   if (S0 > F0 && S1 < F1)
   {
      TimeBar=Time[0];                            
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
      if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*  Point,Digits); else SL = 0;
      LOT = LOT(risk,1);
      CLOSEORDER( 1);
      if (Tredn<1 && TradeTime && ORDERS(-1) < MaxOrders) OPENORDER (-1);
   }
return(0);
}
//--------------------------------------------------------------------
void CLOSEORDER(int ord)
{
   bool error=true;
   int err,nn;
   while(true)
   {
      for (int j = OrdersTotal()-1; j >= 0; j--)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
               if (OrderType()==OP_BUY && ord== 1) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,Blue);
                  if (error) Comment("Çàêðûò îðäåð N ",OrderTicket(),"  ïðèáûëü ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
               if (OrderType()==OP_SELL && ord==-1) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,Red);
                  if (error) Comment("Çàêðûò îðäåð N ",OrderTicket(),"  ïðèáûëü ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
               if (!error) 
               {
                  err = GetLastError();
                  if (err<2) continue;
                  if (err==129) 
                  {  Comment("Íåïðàâèëüíàÿ öåíà ",TimeToStr(TimeCurrent(),TIME_SECONDS));
                     Sleep(5000);
                     RefreshRates();
                     continue;
                  }
                  if (err==146) 
                  {
                     if (IsTradeContextBusy()) Sleep(2000);
                     continue;
                  }
                  Comment("Îøèáêà ",err," çàêðûòèÿ îðäåðà N ",OrderTicket(),
                          "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
            }
         }
      }
      int n=0;
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
               if (OrderType()==OP_BUY  && ord== 1)n++;
               if (OrderType()==OP_SELL && ord==-1)n++;
            }
         }  
      }
      if (n==0) break;
      nn++;
      if (nn>10) {Comment("Íå óäàëîñü çàêðûòü âñå ñäåëêè, îñòàëîñü åùå ",n);break;}
      Sleep(1000);
      RefreshRates();
   }
}
//--------------------------------------------------------------------
void OPENORDER(int ord)
{
   int error, err;
   while (true)
   {
      if (ord== 1) error=OrderSend(Symbol(),OP_BUY, LOT,NormalizeDouble(Ask,Digits),slippage,SL,TP,"EMA WMA",Magic,0,Blue);
      if (ord==-1) error=OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),slippage,SL,TP,"EMA WMA",Magic,0,Red);
      if (error!=-1 || err >5) return;
      else 
      {  err = GetLastError();
         if (err<2) continue;
         if (err==129) 
         {  Comment("Íåïðàâèëüíàÿ öåíà ",TimeToStr(TimeCurrent(),TIME_SECONDS));
            Sleep(5000);
            RefreshRates();
            continue;
         }
         if (err==146) 
         {
            if (IsTradeContextBusy()) Sleep(2000);
            continue;
         }
         Comment("Îøèáêà ",err," çàêðûòèÿ îðäåðà N ",OrderTicket(),"     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
      }
   }
return;
}   
//--------------------------------------------------------------------
double LOT(int risk,int ord)
{
   if (Lot!=0) return(Lot);
   double MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
   LOT = AccountFreeMargin()*risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/ord;
   if (LOT>MarketInfo(Symbol(),MODE_MAXLOT)) LOT = MarketInfo(Symbol(),MODE_MAXLOT);
   if (LOT<MINLOT) LOT = MINLOT;
   if (MINLOT<0.1) LOT = NormalizeDouble(LOT,2); else LOT = NormalizeDouble(LOT,1);
   return(LOT);
}
//--------------------------------------------------------------------
void TrailingStop()
{
   ObjectDelete("SL Buy");
   ObjectDelete("SL-");
   ObjectDelete("SL Sell");
   ObjectDelete("SL+");
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP;
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
            OSL   = OrderStopLoss();
            OOP   = OrderOpenPrice();
            Ticket = OrderTicket();
            if (tip==OP_BUY)             
            {
               StLo = NormalizeDouble(SlLastBar(1,Bid,TrailingStop),Digits);        
               if (StLo <= OOP && òîëüêî_ïðîôèòíûå) continue;
               if (OSL  >= OOP && òîëüêî_áåçóáûòîê) continue;
               if (StLo-Step > OSL)
               {  error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Comment("Error order ",Ticket," TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
               }
            }                                         
            if (tip==OP_SELL)        
            {
               StLo = NormalizeDouble(SlLastBar(-1,Ask,TrailingStop),Digits);  
               if (StLo==0) continue;        
               if (StLo >= OOP && òîëüêî_ïðîôèòíûå) continue;
               if (OSL  >= OOP && òîëüêî_áåçóáûòîê) continue;
               if (StLo+Step < OSL || OSL==0 )
               {  error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White);
                  Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Comment("Error order ",Ticket," TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
double SlLastBar(int tip,double price, int tral)
{
   double fr;
   int i;
   if (tral>2 && tral>=STOPLEVEL)
   {
      if (tip==1) fr = Bid - tral*Point;  
      else        fr = Ask + tral*Point;  
   }
   else
   {
      if (tral==2)
      {
         if (tip== 1)
         for (i=1; i<100; i++) 
         {
            fr = iFractals(NULL,0,MODE_LOWER,i);
            if (fr!=0) {fr-=deltaFR*Point;if (price-STOPLEVEL*Point > fr) break;}
            else fr=0;
         }
         if (tip==-1)
         for (i=1; i<100; i++) 
         {
            fr = iFractals(NULL,0,MODE_UPPER,i);
            if (fr!=0) {fr+=deltaFR*Point;if (price+STOPLEVEL*Point < fr) break;}
            else fr=0;
         }
      }
      if (tral==1)
      {
         if (tip== 1)
         for (i=1; i<100; i++) 
         {
            fr = iLow(NULL,0,i)-deltaFR*Point;
            if (fr!=0) if (price-STOPLEVEL*Point > fr) break;
            else fr=0;
         }
         if (tip==-1)
         for (i=1; i<100; i++) 
         {
            fr = iHigh(NULL,0,i)+deltaFR*Point;
            if (price+STOPLEVEL*Point < fr) break;
            else fr=0;
         }
      }
   }
   if (tip== 1)
   {
      ObjectCreate("SL Buy",OBJ_ARROW,0,Time[0]+Period()*120,fr,0,0,0,0);                     
      ObjectSet   ("SL Buy",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SL Buy",OBJPROP_COLOR, Blue);
      ObjectCreate("SL-",OBJ_ARROW,0,Time[0]+Period()*120,price-STOPLEVEL*Point,0,0,0,0);                     
      ObjectSet   ("SL-",OBJPROP_ARROWCODE,4);
      ObjectSet   ("SL-",OBJPROP_COLOR, Blue);
   }
   if (tip==-1)
   {
      ObjectCreate("SL Sell",OBJ_ARROW,0,Time[0]+Period()*120,fr,0,0,0,0);
      ObjectSet   ("SL Sell",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SL Sell", OBJPROP_COLOR, Red);
      ObjectCreate("SL+",OBJ_ARROW,0,Time[0]+Period()*120,price+STOPLEVEL*Point,0,0,0,0);                     
      ObjectSet   ("SL+",OBJPROP_ARROWCODE,4);
      ObjectSet   ("SL+",OBJPROP_COLOR, Red);
   }
   return(fr);
}
//--------------------------------------------------------------------
int ORDERS(int tip)
{
   int N_Sell,N_Buy;
   for (int i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if (OrderSymbol()==Symbol())
         {
            if (OrderType()==OP_BUY ) N_Buy++;
            if (OrderType()==OP_SELL) N_Sell++;
         }
      }   
   }
if (tip== 0) return(N_Buy+N_Sell);
if (tip== 1) return(N_Buy);
if (tip==-1) return(N_Sell);
}                  
//--------------------------------------------------------------------

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 ---