//+------------------------------------------------------------------+
//|                                            TomNielsEma-v1.00.mq4 |
//|                                                              Tom |
//|                                                                / |
//+------------------------------------------------------------------+
#property copyright "Tom"
#property link      "/"
#property version   "1.00"
#property strict

//--- input parameters
//uniek nummer om de tades te herkennen, 0 = manueel
input int      Magic=5678;
input string   VER="TomNiels-v1.00";    
//het paar waarop getrade wordt
input string   Pair="EURUSD";
//percentage van de balans als initiële trade      
input double   percentage=0.1;
//minimaal aantal te kopen lots initiële trade
input double   minimaallot=0.01;
//maximaal aantal te kopen lots initiële trade
input double   maximaallot=1.25;
//open geen trades als het margelevel hieronder is
input double   MinMargeLevel=300.0;
//om welk uur de dagelijkse trade doen? 
input int      uurtrade=0;

      datetime VorigeTrade=0;


int OpenOrder(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic,datetime expiration, color arrow_color)
{ // OpenOrder
  int orders=0;
  if (NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_LEVEL),2)>MinMargeLevel || NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_LEVEL),2)==0.0 
     )
  {
    orders=OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);
  }
  else
  {
    Alert("Niet genoeg marge om te openen: ",DoubleToStr(NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_LEVEL),2),2),"%");
  }
  return(orders);
} // OpenOrder

//+------------------------------------------------------------------+
  

int aantalbuys(string symbool, int magicnumber)
  // telt het aantal openstaande buys van dit symbool met dit magicnumber
  { // functie aantalbuys
   int totalbuy=0;
   int total=OrdersTotal();
   int i;
   
   for(i=total-1; i>=0; i--)
     { // for
      if(OrderSelect(i, SELECT_BY_POS))
        { // if OrderSelect
         if(OrderSymbol()==symbool)
           { // als het een order is van huidige symbool
            if(OrderType()==OP_BUY && OrderMagicNumber()==magicnumber)
              { // als het een buy van ons is
               totalbuy=totalbuy+1;
              } // het was een buy van ons
           } // het was een order van ons symbool
        } // er was een OrderSelect
     } // for
   return(totalbuy);  
  } // functie aantalbuys

//+------------------------------------------------------------------+


int aantalsells(string symbool, int magicnumber)
  // telt het aantal openstaande sells van dit symbool met dit magicnumber
  { // functie aantalsells
   int totalsell=0;
   int total=OrdersTotal();
   int i;
   
   for(i=total-1; i>=0; i--)
     { // for
      if(OrderSelect(i, SELECT_BY_POS))
        { // if 
         if(OrderSymbol()==symbool)
           { // als het een order is van ons symbool
            if(OrderType()==OP_SELL && OrderMagicNumber()==magicnumber)
              { // als het een sell van ons is
               totalsell=totalsell+1;
              }  // het was een sell van ons
           } // het was een order van ons symbool
        } // er was een OrderSelect
     } // for
   return(totalsell);  
  } // functie aantalsells
//+------------------------------------------------------------------+


void sluitbuys(string symbool, int magicnumber)
// sluit alle buys van dit symbool met dit magicnumber
  { // functie sluitbuys
   int i,ticket;
   int total=OrdersTotal();

   for(i=total-1; i>=0; i--)
     { // for
      if(OrderSelect(i, SELECT_BY_POS))
        { // if OrderSelect
         ticket=OrderTicket();
         if(OrderSymbol()==symbool)
           { // als het een order is van huidige symbool
            if(OrderType()==OP_BUY && OrderMagicNumber()==magicnumber)
              { // als het een buy van ons is
                if (OrderSelect(ticket,SELECT_BY_TICKET))
                {
                  if (OrderClose(ticket,OrderLots(),MarketInfo(symbool,MODE_BID),0,clrBlue)) {}
                }
              }  // het was een buy van ons
           } // het was een order van huidig sysmbool
        } // er was een OrderSelect
     } // for
  } // functie sluitbuys

//+------------------------------------------------------------------+


void sluitsells(string symbool, int magicnumber)
// sluit alle sells van dit symbool met dit magicnumber
  { // functie sluitsells
   int i,ticket;
   int total=OrdersTotal();

   for(i=total-1; i>=0; i--)
     { // for
      if(OrderSelect(i, SELECT_BY_POS))
        { // if OrderSelect
         ticket=OrderTicket();
         if(OrderSymbol()==symbool)
           { // als het een order is van huidige symbool
            if(OrderType()==OP_SELL && OrderMagicNumber()==magicnumber)
              { // als het een sell van ons is
                if (OrderSelect(ticket,SELECT_BY_TICKET))
                {
                  if (OrderClose(ticket,OrderLots(),MarketInfo(symbool,MODE_ASK),0,clrRed)) {}
                }
              }  // het was een sell van ons
           } // het was een order van huidig sysmbool
        } // er was een OrderSelect
     } // for
  } // functie sluitsells

double BepaalLotSize()
{
  double lot=NormalizeDouble(AccountBalance()*percentage/10000,2);
  if (lot<minimaallot) {lot=minimaallot;}
  if (lot>maximaallot) {lot=maximaallot;}
  return (lot);
}
  
void TakeProfit(string pair, int magic, double ma)
{
  if ((Ask+Bid)/2>ma)
  {
    sluitbuys(pair,magic);
  }
  else
  {
    sluitsells(pair,magic);
  }
}
  
void StopLoss(string pair, int magic, double ma)
{
  if ((Ask+Bid)/2<ma)
  {
    sluitbuys(pair,magic);
  }
  else
  {
    sluitsells(pair,magic);
  }
}  
  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  // elke tick stoploss nakijken
  double emalang0=iMA(Pair,PERIOD_D1,8,0,MODE_EMA,PRICE_CLOSE,0);
  StopLoss(Pair,Magic,emalang0);
  if (-1*NormalizeDouble(AccountInfoDouble(ACCOUNT_PROFIT),2)>NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE),2)*2/100)
  {
    sluitbuys(Pair,Magic);
    sluitsells(Pair,Magic);
  }


  if (TimeHour(TimeCurrent())==uurtrade)
  if (TimeCurrent()>VorigeTrade+3600) //Niet tijdens hetzelfde uur nogmaals checken
  {
    VorigeTrade=TimeCurrent();

    double lot=BepaalLotSize();
    double emakort=iMA(Pair,PERIOD_D1,5,0,MODE_EMA,PRICE_CLOSE,1);
    double emalang=iMA(Pair,PERIOD_D1,8,0,MODE_EMA,PRICE_CLOSE,1);
    double emakort1=iMA(Pair,PERIOD_D1,5,0,MODE_EMA,PRICE_CLOSE,2);
    double emalang1=iMA(Pair,PERIOD_D1,8,0,MODE_EMA,PRICE_CLOSE,2);
    double sma=iMA(Pair,PERIOD_D1,100,0,MODE_SMA,PRICE_CLOSE,0);

    if (Ask>sma)
    if (aantalbuys(Pair,Magic)==0)
    {
      if (emakort>emalang)
      if (emakort1<emalang1)
      {
        OpenOrder(Pair,OP_BUY,lot,Ask,0,0,0,VER,Magic,0,clrBlue);
        sluitsells(Pair,Magic);
      }
    }
    
    if (Bid<sma)
    if (aantalsells(Pair,Magic)==0)
    {
      if (emakort<emalang)
      if (emakort1>emalang1)
      {
        OpenOrder(Pair,OP_SELL,lot,Bid,0,0,0,VER,Magic,0,clrRed);
        sluitbuys(Pair,Magic);
      }
    }
  }


//---
  }
//+------------------------------------------------------------------+

