Williama_EA[2]





//+------------------------------------------------------------------+
//|                                        Williama PriceTrapper.mq4 |
//|                        Based on the great strategie of Williama  |
//|                  Coded by Naufrage, All rights granted to you :) |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Coded by Raphy, All rights granted to you :)"
#property link      ""
#include <stdlib.mqh>
#include <stderror.mqh> 

//---- input parameters
extern int       pips=15; // number of pips between each level
extern double    lots=0.01;
extern int       NbLevels=3; // Number of levels of the pending orders (for each target, buy and sell)
extern int       ProfitTarget=0; //Minimum profit target, in pips. Whatever happen, at least this profit is made (unless we run out of free margin...).

int Magic=17663;
double   myPoint;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

     myPoint = SetPoint(Symbol());
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int ticket, err, cpt, profit, total, BuyGoalProfit, SellGoalProfit;
   double BuyGoal=0, SellGoal=0, spread=(Ask-Bid)/myPoint;
//----
//   total=OrdersTotal();
   total = CalculateCurrentOrders(Symbol(), Magic);
   if(total<1) //we can set up a new "price catcher"
   {
      if(AccountFreeMargin()<(10000*lots))
      {
         Print("Not enough free margin to begin");
         return(0);
      }
      SellGoal=Ask-(NbLevels+1)*pips*myPoint;
      BuyGoal=Ask+(NbLevels+1)*pips*myPoint;
      for(cpt=1;cpt<=NbLevels;cpt++)
      {
         ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,Ask+cpt*pips*myPoint,2,SellGoal,BuyGoal,"InitialSetup",Magic,0,Green);
         if(ticket==0)
         {
            err = GetLastError();
            Print("Error opening BUYSTOP order : (" + err + ") " + ErrorDescription(err)); 
            return(0); 
         }
         ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,Bid-cpt*pips*myPoint,2,BuyGoal+spread*myPoint,SellGoal-spread*myPoint,"InitialSetup",Magic,0,Green);
         if(ticket==0)
         {
            err = GetLastError();
            Print("Error opening SELLSTOP order : (" + err + ") " + ErrorDescription(err)); 
            return(0); 
         } 
      }
    } // initial setup done
    else
    {
      OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
      cpt=0;
      while(OrderType()!=OP_BUY && OrderType()!=OP_BUYSTOP)
      {
         OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES);
         cpt++;
      }
      BuyGoal=OrderTakeProfit();
      SellGoal=OrderStopLoss();
      // check if pending orders must be canceled
      if(Ask>=BuyGoal || (Ask<=SellGoal))
      {
         for(cpt=0;cpt<total;cpt++)
         {
            OrderSelect(cpt,SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) OrderDelete(OrderTicket());
         }
         return(0);
      }
      else if((Ask+pips*myPoint)<=BuyGoal && (Ask-pips*myPoint)>=SellGoal)
      // now we check if profit will be made no matter which goal is reached, and add pending orders if necessary
      {
         //first, check profit if the BuyGoal is reached
         profit=0;
         for(cpt=0;cpt<total;cpt++)
         {
            OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            {
               if(OrderType()==OP_BUY) profit+=(BuyGoal-OrderOpenPrice())/myPoint;
               if(OrderType()==OP_SELL) profit-=((BuyGoal+spread*myPoint)-OrderOpenPrice())/myPoint;
               if(OrderType()==OP_BUYSTOP && OrderOpenPrice()>Ask) profit+=(BuyGoal-OrderOpenPrice())/myPoint;
            }
         }
         cpt=1;
         BuyGoalProfit=profit;
         while(profit<ProfitTarget)
         {
            if((Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*myPoint)<(BuyGoal-cpt*pips*myPoint))
            {
               ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyGoal-cpt*pips*myPoint,2,SellGoal,BuyGoal,"",Magic,0,Green);
               if(ticket==0)
               {
                  err = GetLastError();
                  Print("Error opening BUYSTOP order : (" + err + ") " + ErrorDescription(err)); 
                  return(0); 
               }
               profit+=cpt*pips;
            }
            cpt++;
            if(cpt>NbLevels) cpt=1;
         }
         // then, check profit if SellGoal is reached
         profit=0;
         for(cpt=0;cpt<total;cpt++)
         {
            OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            {
               if(OrderType()==OP_BUY) profit-=(OrderOpenPrice()-SellGoal)/myPoint;
               if(OrderType()==OP_SELL) profit+=(OrderOpenPrice()-(SellGoal-spread*myPoint))/myPoint;
               if(OrderType()==OP_SELLSTOP && OrderOpenPrice()<Bid) profit+=(OrderOpenPrice()-(SellGoal-spread*myPoint))/myPoint;
            }
         }
         cpt=1;
         SellGoalProfit=profit;
         while(profit<ProfitTarget)
         {
            if((Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*myPoint)>(SellGoal+cpt*pips*myPoint))
            {
               ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,(SellGoal-spread*myPoint)+cpt*pips*myPoint,2,BuyGoal+spread*myPoint,SellGoal-spread*myPoint,"",Magic,0,Green);
               if(ticket==0)
               {
                  err = GetLastError();
                  Print("Error opening SELLSTOP order : (" + err + ") " + ErrorDescription(err)); 
                  return(0); 
               }
               profit+=cpt*pips;
            }
            cpt++;
            if(cpt>NbLevels) cpt=1;
         }
      }
     }
   string sComment   = "";
   string sep         = "----------------------------------------\n";
   string nl         = "\n";
   sComment = "Williama EA v.0.1" + nl;
   sComment = sComment + "Lots=" + DoubleToStr(lots,2) + nl;
   sComment = sComment + "Buy Goal= " + DoubleToStr(BuyGoal,4) + nl; 
   sComment = sComment + "Buy Goal Profit (in pips)=" + BuyGoalProfit + nl + nl;
   sComment = sComment + "Sell Goal= " + DoubleToStr(SellGoal,4) + nl; 
   sComment = sComment + "Sell Goal Profit (in pips)=" + SellGoalProfit + nl + nl;
   sComment = sComment + "Pips of each level=" + pips + nl;
   sComment = sComment + "Number of levels for each goal: " + NbLevels + nl;
   sComment = sComment + "Spread= " + DoubleToStr(spread,1) + nl;
   sComment = sComment + sep;  
   Comment(sComment);
//----
   return(0);
  }
  
double SetPoint(string mySymbol)
{
   double mPoint, myDigits;
   
   myDigits = MarketInfo (mySymbol, MODE_DIGITS);
   if (myDigits < 4)
      mPoint = 0.01;
   else
      mPoint = 0.0001;
   
   return(mPoint);
}

int CalculateCurrentOrders(string mySymbol, int MagicNumber)
  {
   int buys = 0, sells = 0, num = 0;
   for(int i=0;i<OrdersTotal();i++)
     {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!= mySymbol) continue;
      if (OrderMagicNumber()!= MagicNumber) continue;
      if(OrderType() == OP_BUY)  buys++;
      if(OrderType() == OP_SELL) sells++;
      if(OrderType() == OP_BUYSTOP)  buys++;
      if(OrderType() == OP_SELLSTOP) sells++;
     }
     
   num = buys + sells;
   return(num);
  }

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



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders

Other Features:


BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:1.25 Total Net Profit:275.37

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:1.29 Total Net Profit:168.37

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:1.23 Total Net Profit:150.52

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:1.29 Total Net Profit:443.93

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:1.10 Total Net Profit:85.68

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:1.07 Total Net Profit:39.86

Request Backtest for Williama_EA[2]


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: