Download MetaTrader 5

Any Help With This Simple Crossover EA?

To add comments, please log in or register
Freelance service: the safe way to order a trading robot. Try it!
asb31
11
asb31 2013.10.19 05:07 

Trying to get this EA to work... new to MQL5. Basically, I'm trading on simple MA crossovers based on risk to account balance (USDEUR on 1 HR time frame). Any help is appreciated.... thanks!

//+------------------------------------------------------------------+
//|                                                    ThaCarter.mq5 |
//|                                                John Wayne        |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "John Wayne"
#property version   "1.00"
#include <Trade\Trade.mqh>

int lasttrade = 2; //set later to 0 if sell, 1 if buy, 2 if none
CTrade trade;

extern double Lots = 0.0;//Fixed lotsize, 0.0: using AutoLot based on risk%
extern double MaxLots = 50.0;//50
extern double RiskWill = 10;//

bool posopen;//boolean for position open

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(bool& posopen, int& lasttrade)
  {
  
   int arrsize = 10;
   double SSMA[];
   double LSMA[];
  
   int sh = iMA("EURUSD",PERIOD_H1,5,0,MODE_SMA,PRICE_TYPICAL);//handle for short period SMA
   int lh = iMA("EURUSD",PERIOD_H1,15,0,MODE_SMA,PRICE_TYPICAL);//handle for long period SMA
   CopyBuffer(sh, 0, 0, arrsize, SSMA);//copy last 10 values of short period to SSMA
   ArraySetAsSeries(SSMA, true);
   CopyBuffer(lh, 0, 0, arrsize, LSMA);//copy last 10 values of long period to LSMA
   ArraySetAsSeries(LSMA, true);
  

  
   double askp = SymbolInfoDouble("EURUSD",SYMBOL_ASK);//ask price
   double bidp = SymbolInfoDouble("EURUSD",SYMBOL_BID);//bid price
  
   //Is a position open?
  
  
   if (PositionsTotal()<1){
   posopen = false;
   }
   else
   {
   posopen = true;
   }
  
   //No positions, so look for a buy once cross-over happens
   if (posopen=false){
  
   double longsum = 0; //used for sum of long positions
   double shortsum = 0; //used for sum of short positions
  
   //loop through size of array (except for current value) to find totals of arrays
   int arraysize = ArraySize(SSMA);
  
   for (int counter = 1; counter == arraysize; counter++)
   {
   longsum = longsum + LSMA[counter];
   shortsum = shortsum + SSMA[counter];
   }
  
   //Which total is larger?
   if (shortsum>longsum){//if shortsum is greater, it may be a precursor to a sell if current SSMA is less than LSMA
  
   if (SSMA[0]<LSMA[0]){
  
   SellExecute(RiskWill);
   lasttrade = 0;
   }
   }
  
   if (shortsum<longsum){//if shortsum is less, it may be a precursor to a buy if current LSMA is less than SSMA
  
   if (SSMA[0]>LSMA[0]){
  
   BuyExecute(RiskWill);
   lasttrade = 1;
   }
   }
  
   }
   //Positions are open, close on cross-over
   if(posopen = true){
  
   if (lasttrade == 0){//last trade was a sell, so short must cross long high or other criteria to be specified later
  
   if (SSMA[0]>LSMA[0]){
   PositionSelect("EURUSD");//forces closure
   int i=PositionsTotal();
   while (i>=1)
     {
      if (trade.PositionClose(PositionGetSymbol(i))) i--;
     }
  
   }
   }
   if (lasttrade == 1){//last trade was a buy, so short must cross long low or other criteria to be specified later
  
   if (LSMA[0]>SSMA[0]){
   PositionSelect("EURUSD");//forces closure
   int i=PositionsTotal();
   while (i>=1)
     {
      if (trade.PositionClose(PositionGetSymbol(i))) i--;
     }
  
   }
   }
   }
  
  }
//+------------------------------------------------------------------+


//SELLEURUSD
void SellExecute(double RiskWill)
{
double totallots = CalcLotsVolume(RiskWill);
trade.PositionOpen("EURUSD",ORDER_TYPE_BUY,totallots,SymbolInfoDouble("EURUSD",SYMBOL_BID),0,0);
}

//BUYEURUSD
void BuyExecute(double RiskWill)
{
double totallots = CalcLotsVolume(RiskWill);
trade.PositionOpen("EURUSD",ORDER_TYPE_BUY,totallots,SymbolInfoDouble("EURUSD",SYMBOL_ASK),0,0);
}

//---------- CalcLotsVolume ---------------------------
double CalcLotsVolume(double RiskPercent)
{
   double SendLots;//The actual Lotsize that will be sent with the order
   double MaxLot;//Broker's Maximum permitted amount of a lot.
   double MinLot;//Broker's Step for changing lots, e.g 0.01.
   double LotStep;//Broker's Minimum permitted amount of a lot.
   if (Lots > 0.0) SendLots = NormalizeLot(Lots);//The manual LotSize, bounded by broker's specs
   else {//Calculate AutoLot:
      MaxLot = SymbolInfoDouble("EURUSD", SYMBOL_VOLUME_MAX);
      MinLot = SymbolInfoDouble("EURUSD", SYMBOL_VOLUME_MIN);
      LotStep = SymbolInfoDouble("EURUSD", SYMBOL_VOLUME_STEP);
      double MargInit;
      SendLots = NormalizeDouble(MathFloor(AccountInfoDouble(ACCOUNT_BALANCE) * RiskPercent / 1000000 ), 2);
      if (SendLots < MinLot) SendLots = MinLot;//Broker's absolute minimum Lot
      if (SendLots > MaxLot) SendLots = MaxLot;//Broker's absolute maximum Lot
   }
   if (SendLots > MaxLots) SendLots = MaxLots;//Never exceed our manualy set limit
   return (SendLots);
}
//-----------------------------------------------------
//---------- NormalizeLot -----------------------------
double NormalizeLot(double Lots)
{
   double NormalizedLot;//The final LotSize, bounded by broker's specs
   double InverseLotStep;
   double LotStep = SymbolInfoDouble("EURUSD", SYMBOL_VOLUME_STEP);
   double MinLot  = SymbolInfoDouble("EURUSD", SYMBOL_VOLUME_MIN);
   double MaxLot  = SymbolInfoDouble("EURUSD", SYMBOL_VOLUME_MAX);
   if (MinLot  == 0.0) MinLot = 0.1;//In case MarketInfo returns no info
   if (MaxLot  == 0.0) MaxLot = 5;  //In case MarketInfo returns no info
   if (LotStep == 0.0) InverseLotStep = 1 / MinLot;//In case MarketInfo returns no info
   else InverseLotStep = 1 / LotStep;  
   NormalizedLot = MathFloor(Lots * InverseLotStep) / InverseLotStep;  
   if (NormalizedLot < MinLot) NormalizedLot = MinLot;//Broker's absolute minimum Lot
   if (NormalizedLot > MaxLot) NormalizedLot = MaxLot;//Broker's absolute maximum Lot
   return (NormalizedLot);
}
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Account Properties - Documentation on MQL5
Dua Yong Rew
5424
Dua Yong Rew 2013.10.19 05:11  
if you can post the codes with the src button. it makes reading your codes easier.
tbittle13
3
tbittle13 2013.10.19 07:35  
void OnTick(bool& posopen, int& lasttrade) 
Looks like them parameters isn't workin too well
Alain Verleyen
Moderator
30735
Alain Verleyen 2013.10.19 10:16  

I edited your first post and removed the second one.

Pasi Hakamaki
4711
Pasi Hakamaki 2013.10.19 17:22  

There seems to be a lot wrong with your code. For example you can replace extern with input to make variable changeable by user. I suggest you read Automated Trading Language Documentation It will help you here.

Good luck!

Umar Ismail
10485
Umar Ismail 2013.10.20 08:40  
//SELLEURUSD
void SellExecute(double RiskWill)
{
double totallots = CalcLotsVolume(RiskWill);
trade.PositionOpen("EURUSD",ORDER_TYPE_BUY,totallots,SymbolInfoDouble("EURUSD",SYMBOL_BID),0,0);
}

ORDER_TYPE_BUY
ORDER_TYPE_SELL
Icarus
192
Icarus 2013.10.25 14:47  
if (posopen=false){
Is that correct?
Alain Verleyen
Moderator
30735
Alain Verleyen 2013.10.25 16:02  
Icarus:
Is that correct?

Certainly not, it should be :

if (posopen==false){
To add comments, please log in or register