simple_ma-adx_ea_en

Author: Copyright 2010, MetaQuotes Software Corp.
Price Data Components
Orders Execution
It automatically opens orders when conditions are reached
Indicators Used
Movement directional indexMoving average indicator
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
simple_ma-adx_ea_en
ÿþ//+------------------------------------------------------------------+

//|                                                  My_First_EA.mq5 |

//|                        Copyright 2010, MetaQuotes Software Corp. |

//|                                              http://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2010, MetaQuotes Software Corp."

#property link      "http://www.mql5.com"

#property version   "1.00"

//--- input parameters

input int      StopLoss=30;      // Stop Loss

input int      TakeProfit=100;   // Take Profit

input int      ADX_Period=8;     // ADX Period

input int      MA_Period=8;      // Moving Average Period

input int      EA_Magic=12345;   // EA Magic Number

input double   Adx_Min=22.0;     // Minimum ADX Value

input double   Lot=0.1;          // Lots to Trade

// Other parameters

int adxHandle; // handle for our ADX indicator

int maHandle;  // handle for our Moving Average indicator

double plsDI[],minDI[],adxVal[]; // Dynamic arrays to hold the values of +DI, -DI and ADX values for each bars

double maVal[];     // dynamic array to hold the values of Moving Average for each bars

MqlRates pRates[];  // dynamic array to hold the values of current Rates

int STP,TKP;         // To be used for Stop Loss & Take Profit values



//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- get handle for ADX indicator

   adxHandle=iADX(NULL,0,ADX_Period);

//--- get the handle for Moving Average indicator

   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);

//--- what if handle returns Invalid Handle

   if(adxHandle<0 || maHandle<0)

     {

      Alert("Error Creating Handles for indicators - error: ",GetLastError(),"!!");

     }

//--- let us handle brokers that offers 5 digit prices instead of 4

   STP = StopLoss;

   TKP = TakeProfit;

   if (_Digits==5 || _Digits==3)

     {

      STP = STP*10;

      TKP = TKP*10;

     }

//--- let's serialize the buffers copied

   ArraySetAsSeries(adxVal,true);

   ArraySetAsSeries(maVal,true);

   

   ArraySetAsSeries(minDI,true);

   ArraySetAsSeries(plsDI,true);



//--- let us serialize the closed price arrays

   ArraySetAsSeries(pRates,true);



   return(0);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//--- release our indicator handles

   IndicatorRelease(adxHandle);

   IndicatorRelease(maHandle);

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//--- do we have enough bars to work with

   if(Bars(_Symbol,_Period)<80) // if total bars is less than 80 bars

     {

      Alert("We have less than 80 bars!!");

      return;

     }  

//--- we will use the static Old_Time variable to serve the bar time.

//--- at each OnTick execution we will check the current bar time with the saved one.

//--- if the bar time isn't equal to the saved time, it indicates that we have a new tick.



   static datetime Old_Time;

   datetime New_Time[1];

   bool IsNewBar=false;



//--- copying the last bar time to the element New_Time[0]

   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

   if(copied>0) // ok, the data has been copied successfully

     {

      if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time

        {

         IsNewBar=true;   // if it isn't a first call, the new bar has appeared

         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);

         Old_Time=New_Time[0];            // saving bar time

        }

     }

   else

     {

      Alert("Error in copying historical times data, error =",GetLastError());

      ResetLastError();

      return;

     }



//--- EA should only check for new trade if we have a new bar

   if(IsNewBar==false)

     {

      return;

     }

 

//--- do we have enough bars to work with

   int Mybars=Bars(_Symbol,_Period);

   if(Mybars<60) // if total bars is less than 60 bars

     {

      Alert("We have less than 60 bars, EA will now exit!!");

      return;

     }



//--- define some MQL5 Structures we will use for our trade

   MqlTick latest_price;      // To be used for getting recent/latest price quotes

   MqlTradeRequest mrequest;  // To be used for sending our trade requests

   MqlTradeResult mresult;    // To be used to get our trade results

   MqlRates mrate[];          // To be used to store the prices, volumes and spread of each bar

   

   ZeroMemory(mrequest);

   ZeroMemory(mresult);

/*

     Let's make sure our arrays values for the Rates, ADX Values and MA values 

     is store serially similar to the timeseries array

*/

//--- the rates arrays

   ArraySetAsSeries(mrate,true);

//--- the ADX DI+values array

   ArraySetAsSeries(plsDI,true);

//--- the ADX DI-values array

   ArraySetAsSeries(minDI,true);

//--- the ADX values arrays

   ArraySetAsSeries(adxVal,true);

//--- the MA-8 values arrays

   ArraySetAsSeries(maVal,true);



//--- get the last price quote using the MQL5 MqlTick Structure

   if(!SymbolInfoTick(_Symbol,latest_price))

     {

      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");

      return;

     }



//--- get the details of the latest 3 bars

   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)

     {

      Alert("Error copying rates/history data - error:",GetLastError(),"!!");

      ResetLastError();

      return;

     }



//--- copy the new values of our indicators to buffers (arrays) using the handle

   if(CopyBuffer(adxHandle,0,0,3,adxVal)<0 || CopyBuffer(adxHandle,1,0,3,plsDI)<0

      || CopyBuffer(adxHandle,2,0,3,minDI)<0)

     {

      Alert("Error copying ADX indicator Buffers - error:",GetLastError(),"!!");

      ResetLastError();

      return;

     }

   if(CopyBuffer(maHandle,0,0,3,maVal)<0)

     {

      Alert("Error copying Moving Average indicator buffer - error:",GetLastError());

      ResetLastError();

      return;

     }



//--- copy the bar close price for the previous bar prior to the current bar, that is Bar 1

   double p_close=mrate[1].close;  // bar 1 close price



/*

    1. Check for a long/Buy Setup : MA-8 increasing upwards, 

    previous price close above it, ADX > 22, +DI > -DI

*/

//--- declare bool type variables to hold our Buy Conditions

   bool Buy_Condition_1=(maVal[0]>maVal[1]) && (maVal[1]>maVal[2]); // MA-8 Increasing upwards

   bool Buy_Condition_2 = (p_close > maVal[1]);         // previuos price closed above MA-8

   bool Buy_Condition_3 = (adxVal[0]>Adx_Min);          // Current ADX value greater than minimum value (22)

   bool Buy_Condition_4 = (plsDI[0]>minDI[0]);          // +DI greater than -DI



//--- putting all together   

   if(Buy_Condition_1 && Buy_Condition_2)

     {

      if(Buy_Condition_3 && Buy_Condition_4)

        {

         mrequest.action = TRADE_ACTION_DEAL;                                   // immediate order execution

         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);            // latest ask price

         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);  // Stop Loss

         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);  // Take Profit

         mrequest.symbol = _Symbol;                                             // currency pair

         mrequest.volume = Lot;                                                 // number of lots to trade

         mrequest.magic = EA_Magic;                                             // Order Magic Number

         mrequest.type = ORDER_TYPE_BUY;                                        // Buy Order

         mrequest.type_filling = ORDER_FILLING_FOK;                             // Order execution type

         mrequest.deviation=100;                                                // Deviation from current price

         //--- send order

         OrderSend(mrequest,mresult);

         //--- get the result code

         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed

           {

            Alert("A Buy order has been successfully placed with Ticket#:",mresult.order,"!!");

           }

         else

           {

            Alert("The Buy order request could not be completed -error:",GetLastError());

            ResetLastError();           

            return;

           }

        }

     }

/*

    2. Check for a Short/Sell Setup : MA-8 decreasing downwards, 

    previous price close below it, ADX > 22, -DI > +DI

*/

//--- declare bool type variables to hold our Sell Conditions

   bool Sell_Condition_1 = (maVal[0]<maVal[1]) && (maVal[1]<maVal[2]);  // MA-8 decreasing downwards

   bool Sell_Condition_2 = (p_close <maVal[1]);                         // Previous price closed below MA-8

   bool Sell_Condition_3 = (adxVal[0]>Adx_Min);                         // Current ADX value greater than minimum (22)

   bool Sell_Condition_4 = (plsDI[0]<minDI[0]);                         // -DI greater than +DI



//--- Putting all together

   if(Sell_Condition_1 && Sell_Condition_2)

     {

      if(Sell_Condition_3 && Sell_Condition_4)

        {

         mrequest.action=TRADE_ACTION_DEAL;                                    // immediate order execution

         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // latest Bid price

         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss

         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit

         mrequest.symbol = _Symbol;                                            // currency pair

         mrequest.volume = Lot;                                                // number of lots to trade

         mrequest.magic = EA_Magic;                                            // Order Magic Number

         mrequest.type= ORDER_TYPE_SELL;                                       // Sell Order

         mrequest.type_filling = ORDER_FILLING_FOK;                            // Order execution type

         mrequest.deviation=100;                                               // Deviation from current price

         //--- send order

         OrderSend(mrequest,mresult);

         //--- get the result code

         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed

           {

            Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");

           }

         else

           {

            Alert("The Sell order request could not be completed -error:",GetLastError());

            ResetLastError();

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