StepMAExpert_v1[1].1

Author: Copyright � 2005, TrendLaboratory Ltd.
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Indicator of the average true rangeMoving average indicator
0 Views
0 Downloads
0 Favorites
StepMAExpert_v1[1].1
//+------------------------------------------------------------------+
//|                                            StepMAExpert_v1.1.mq4 |
//|                           Copyright © 2005, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                       E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#include <stdlib.mqh>
#include <Tracert.mqh>

//---- input parameters
extern string     Expert_Name = "---- StepMAExpert_v1 ----";

extern int        Magic=1007;
extern int        Slippage=6;
extern bool       Trace = false;          // Trace Switch

extern string     Main_Parameters = " Trade Volume & Trade Method";
extern double     Lots = 0.1;
extern bool       TrailingStop = false;   // Trailing Stop Switch   
extern bool       SwingTrade = false;     // Swing Trade Switch
extern bool       FirstStop=false;        // First Stop Switch
extern bool       PendingOrder=false;     // PendingOrder/InstantExecution Switch
extern double     PendOrdGap=10;          // Gap from High/Low for Pending Orders
extern double     ZeroLossLevel=0;        // Zero Loss Level in points

extern string     Calc_Parameters = " StepMA Parameters ";
extern int        Length=10;              // ATR Period	
extern double     Kv=1.0;                 // Sensivity Factor
extern double     StepSize=0;             // Constant Step Size (if need)
extern bool       HighLow=false;          // High/Low Mode Switch (more sensitive)
extern double     Delta=0;                // Breakout Depth in points
extern double     ExitDelta=30;
extern double     Ks=1.0;                 // StopLoss Factor

extern string     MM_Parameters = " MoneyManagement by L.Williams ";
extern bool       MM=false;               // ÌÌ Switch
extern double     Risk=0.15;              // Risk Factor
extern double     LossMax=1000;           // Maximum Loss by 1 Lot


int      trend=0,TradeSignal=0,ExitSignal=0,matrend=0,Kz=0,mode=0,Type=0;
double   Smin0=0,Smax0=0,Smin1=0,Smax1=0,Price=0;
double   line0=0,line1=0,bsmin1=0,bsmax1=0;
double   BuyStop=0,SellStop=0,ATRmin=10000,ATRmax=0,bsmax2=0,bsmin2=0;
int      b=0,cnt=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int total,ticket;
//---- 
   
   if ( Trace ) SetTrace();
   if (Bars>b)
   {      
   b=Bars;
   
   if(TrailingStop) FirstStop=true; 
   
   double Lotsi=Lots;     
      
   if ( MM ) Lotsi=NormalizeDouble(AccountFreeMargin()*Risk/LossMax,1);   
   if (Lotsi<0.1) Lotsi=0.1;
       
   if(StepSize>0) 
   {
   double Step=Kv*StepSize*Point; 
   }
   else
   {
   double ATR0 = iATR(NULL,0,Length,1);
	ATRmax=MathMax(ATR0,ATRmax);
	ATRmin=MathMin(ATR0,ATRmin);
	Step=0.5*Kv*(ATRmax+ATRmin);
	}  
	  	
	  Smin1=Smin0;
	  Smax1=Smax0;
	  
	  if(HighLow)
	  {	  
	  Smax0=Low[1]+2.0*Step;
	  Smin0=High[1]-2.0*Step;
	  }
	  else
	  {	  
	  Smax0=Close[1]+2.0*Step;
	  Smin0=Close[1]-2.0*Step;
	  }
	  	  
	  if(Close[1]>Smax1) matrend=1; 
	  if(Close[1]<Smin1) matrend=-1;
	  
	  line1=line0; 
	  
	  if(matrend>0)
	  {
	  if(Smin0<Smin1) Smin0=Smin1;
	  line0=Smin0+Step;
	  }
	  else
	  {
	  if(Smax0>Smax1) Smax0=Smax1;
	  line0=Smax0-Step;
	  }	  

	  bsmin2=bsmin1;
	  bsmax2=bsmax1;
	  
	  bsmin1=Smin0;
	  bsmax1=Smax0;

// Trade Signal area	
      if(!SwingTrade) TradeSignal=0; 	
// - BUY      
      if 
      (
      Close[1]>iMA(NULL,0,50,0,MODE_EMA,0,1)
      &&
      line0-line1>Delta*Point
      &&
      line1>0
      && 
      trend<=0
      )  TradeSignal= 1;
// - SELL      
      if 
      (
      Close[1]<iMA(NULL,0,50,0,MODE_EMA,0,1)
      &&
      line1-line0>Delta*Point
      &&
      line1>0
      && 
      trend>=0
      )  TradeSignal= -1;

// Exit Signal area	
       	
// - BUY Orders      
      if 
      (
      Close[1]<iMA(NULL,0,50,0,MODE_EMA,0,1)
      ||
      line1-line0>Delta*Point
      )  ExitSignal= -1;
// - SELL Orders      
      if 
      (
      Close[1]>iMA(NULL,0,50,0,MODE_EMA,0,1)
      ||
      line0-line1>Delta*Point
      )  ExitSignal= 1;
      
      if(SwingTrade) ExitSignal=TradeSignal;
         
// Orders Close area  :              
//-----------------------------
      total=OrdersTotal();
	   for (cnt=0;cnt<total;cnt++)
      { 
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);   
       mode=OrderType();
          if (ZeroLossLevel > 0 && OrderMagicNumber()==Magic)
          {
             if (mode==OP_BUY)
                  {
			         if (Bid-OrderOpenPrice() > Kz*ZeroLossLevel*Point) 
			            {
			            BuyStop=OrderOpenPrice()+((Kz-1)*ZeroLossLevel+1.0)*Point;
			            OrderModify(OrderTicket(),OrderOpenPrice(),BuyStop,0,0,LightBlue);
			            Kz=Kz+1;
			            return(0);
			            }
			         }
               if (mode==OP_SELL)
                  {
                  if (OrderOpenPrice()-Ask > Kz*ZeroLossLevel*Point) 
			            {
			            SellStop=OrderOpenPrice()-((Kz-1)*ZeroLossLevel+1.0)*Point;
			            OrderModify(OrderTicket(),OrderOpenPrice(),SellStop,0,0,Orange);
			            Kz=Kz+1;
			            return(0);
			            }
			         }
           }
                          

     
       if (OrderMagicNumber()==Magic)
       { 
// - BUY Orders         
         if ( ExitSignal<0 )
         {
            if (mode==OP_BUY)
                  {
			         OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
			         }
         }
// - SELL Orders          
         if ( ExitSignal>0 )
	      {
            if (mode==OP_SELL)
			         {
   			      OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
                  }
         }    
      }
    
// Orders Modify Area 
      if (TrailingStop && OrderMagicNumber()==Magic) 
      {
         if ( bsmin1>OrderStopLoss())
         {
            if (mode==OP_BUY)
                  {
			         OrderModify(OrderTicket(),OrderOpenPrice(),bsmin1,0,0,LightGreen);
			         return(0);
                  }
         }
// - SELL Orders          
         if ( bsmax1<OrderStopLoss() )
         {
            if (mode==OP_SELL)
			         {
   			      OrderModify(OrderTicket(),OrderOpenPrice(),bsmax1,0,0,Yellow);	    
                  return(0);
                  }
         }    
      }
// Closing of Pending Orders      
      if(Close[1]<MathMin(iMA(NULL,0,50,0,MODE_EMA,0,1),line0))int PendClose=1; 
      if(Close[1]>MathMax(iMA(NULL,0,50,0,MODE_EMA,0,1),line0))    PendClose=-1;  
      
      if (mode==OP_BUYSTOP && PendClose>0 && OrderMagicNumber()==Magic)
      {
	 	OrderDelete(OrderTicket());
	   return(0);
	   }
	    
      if (mode==OP_SELLSTOP && PendClose<0 && OrderMagicNumber()==Magic) 
	 	{
	 	OrderDelete(OrderTicket());
	   return(0);
	   }      
      }//for (cnt=0;cnt<total;cnt++)
// Orders open area :
// - SELL Orders  		     
		if (total<1)
      {     
		   if ( trend>=0 && TradeSignal<0 ) 
         {  
            if (FirstStop) SellStop=High[1]+Ks*Step/Kv; else SellStop=0;
            if(PendingOrder)
		  	   {
		    	   Type=OP_SELLSTOP;
		    	   Price=Low[1]-PendOrdGap*Point;
		 	   }
		 	   else
		  	   {
		   	   Type=OP_SELL;
		    	   Price=Bid;
		  	   }
		      ticket=OrderSend(Symbol(),Type,Lotsi,Price,Slippage,SellStop,0,"sell",Magic,0,Red);
            Kz=1;
            if(SwingTrade) trend=-1; else {trend=0;}
            if(ticket<0)
            {
            Print("OrderSend failed with error #",GetLastError());
            return(0);
            }
		      return(0);
		   }
// - BUY Orders         
	      if (trend <=0 &&  TradeSignal>0)
	      {
            if (FirstStop) BuyStop=Low[1]-Ks*Step/Kv; else BuyStop=0;
            if(PendingOrder)
		    	{
		    	   Type=OP_BUYSTOP;
		    	   Price=High[1]+PendOrdGap*Point;
		    	}
		    	else
		    	{
		    	   Type=OP_BUY;
		    	   Price=Ask;
		    	}
		    	ticket=OrderSend(Symbol(),Type,Lotsi,Price,Slippage,BuyStop,0,"buy",Magic,0,Blue);
            Kz=1;
            if(SwingTrade) trend=1; else {trend=0;}
            if(ticket<0)
            {
            Print("OrderSend failed with error #",GetLastError());
            return(0);
            }
			   return(0);
         }
      }
      

      
      
      
      
      }//if (Bars>b)
//----                          
 

//----
   return(0);
  }
//+------------------------------------------------------------------+

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