arttrader_v1_5





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//
// Arthur Matteson's Trading Machine, version 1.5
// EA written in MQL4 for MetaTrader4 on 9/13/2006
// Meant for EUR/USD on the hourly timeframe (H1)
//

//
// These parameters give a 43.5% profit on "Every tick" for EUR/USD
//  from 7/13/2006 to 9/12/2006 (MT4 release 197, H1 timeframe):
//
//#define NUM_LOTS 1.0
//#define EMA_SPEED 11.0
//#define BIG_JUMP 30.0
//#define DOUBLE_JUMP 55.0
//#define STOP_LOSS 20.0
//#define EMERGENCY_LOSS 50.0
//#define TAKE_PROFIT 25.0
//#define SLOPE_SMALL 5.0
//#define SLOPE_LARGE 8.0
//#define MINUTES_BEGIN 25.0
//#define MINUTES_END 25.0
//#define SLIP_BEGIN 0.0
//#define SLIP_END 0.0
//#define MIN_VOLUME 0.0
//#define SLIPPAGE 3.0
//#define ADJUST 1.0
//


// Variables that can be changed outside the program code, even optimized
extern double NUM_LOTS=1.0;        // How many lots to deal with (may be less than one)
extern double EMA_SPEED=11.0;      // The period for the averager
extern double BIG_JUMP=30.0;       // Check for too-big candlesticks (avoid them)
extern double DOUBLE_JUMP=55.0;    // Check for pairs of big candlesticks
extern double STOP_LOSS=20.0;      // A smart stop-loss
extern double EMERGENCY_LOSS=50.0; // The trade's stop loss in case of program error
extern double TAKE_PROFIT=25.0;    // The trade's take profit
extern double SLOPE_SMALL=5.0;     // The minimum EMA slope to enter a trade
extern double SLOPE_LARGE=8.0;     // The maximum EMA slope to enter a trade
extern double MINUTES_BEGIN=25.0;  // Wait this long to determine candlestick lows/highs
extern double MINUTES_END=25.0;    // Wait this long to determine candlestick lows/highs
extern double SLIP_BEGIN=0.0;      // An allowance between the close and low/high price
extern double SLIP_END=0.0;        // An allowance between the close and low/high price
extern double MIN_VOLUME=0.0;      // If the previous volume is not above this, exit the trade
extern double SLIPPAGE=3.0;        // This is for the OrderSend command
extern double ADJUST=1.0;          // A strange but functional imaginary spread adjustment


int start()
{
  int i, ticket;
  double ema_old, ema_new, ema_slope;
  double begin_buy_chance, begin_sell_chance;
  double end_buy_chance, end_sell_chance;
  static double open_price;

  begin_buy_chance=0; begin_sell_chance=0;
  end_buy_chance=0; end_sell_chance=0; ticket=0;

  // Find the existing order, if there is one
  if(OrdersTotal()>0) {
    if(OrderType()==OP_BUY) {
      // If ticket=+1, this means a long order is in progress
      ticket=1;
    }
    if(OrderType()==OP_SELL) {
      // If ticket=-1, this means a short order is in progress
      ticket=-1;
    }
  }

  // Find the exponentially-weighted average, and its derivative
  ema_old=iMA(NULL, PERIOD_H1, EMA_SPEED, 0, MODE_EMA, PRICE_OPEN, 1);
  ema_new=iMA(NULL, PERIOD_H1, EMA_SPEED, 0, MODE_EMA, PRICE_OPEN, 0);
  ema_slope=(ema_new-ema_old)/Point;

  // Are conditions correct to go long?
  if(ema_slope>=SLOPE_SMALL) {
    if(ema_slope<=SLOPE_LARGE) {
      if((Minute()>MINUTES_BEGIN)&&(Close[0]<=Open[0])&&(Close[0]<=Low[0]+(SLIP_BEGIN*Point))) {
        begin_buy_chance=1;
      }
    }
  }

  // Are conditions correct to go short?
  if(ema_slope<=-SLOPE_SMALL) {
    if(ema_slope>=-SLOPE_LARGE) {
      if((Minute()>MINUTES_BEGIN)&&(Close[0]>=Open[0])&&(Close[0]>=High[0]-(SLIP_BEGIN*Point))) {
        begin_sell_chance=1;
      }
    }
  }

  // Was there a sudden jump?  Ignore it...
  if((MathAbs(Open[1]-Open[0])/Point)>=BIG_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[2]-Open[1])/Point)>=BIG_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[3]-Open[2])/Point)>=BIG_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[4]-Open[3])/Point)>=BIG_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[5]-Open[4])/Point)>=BIG_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[2]-Open[0])/Point)>=DOUBLE_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[3]-Open[1])/Point)>=DOUBLE_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[4]-Open[2])/Point)>=DOUBLE_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }
  if((MathAbs(Open[5]-Open[3])/Point)>=DOUBLE_JUMP) {
    begin_buy_chance=0;
    begin_sell_chance=0;
  }

  // Implement a stop-loss
  if(ticket>0) {
    if(((Close[0]-open_price)/Point)<=-STOP_LOSS) {
      if((Minute()>MINUTES_END)&&(Close[0]>=Open[0])&&(Close[0]>=High[0]-(SLIP_END*Point))) {
        end_buy_chance=1;
      }
    }
  }

  // Implement a stop-loss
  if(ticket<0) {
    if(((open_price-Close[0])/Point)<=-STOP_LOSS) {
      if((Minute()>MINUTES_END)&&(Close[0]<=Open[0])&&(Close[0]<=Low[0]+(SLIP_END*Point))) {
        end_sell_chance=1;
      }
    }
  }

  // Prevent duplicate orders
  if(ticket>0) begin_buy_chance=0;
  if(ticket<0) begin_sell_chance=0;

  // Was there no volume last time?  If so, end the trade...
  if(Volume[1]<=MIN_VOLUME) {
    if(ticket>0) end_buy_chance=1;
    if(ticket<0) end_sell_chance=1;
  }

  // Was a long-exit signaled?
  if(end_buy_chance>=1) {
    ticket=0;
    OrderClose(OrderTicket(), NUM_LOTS, Bid, SLIPPAGE, Teal);
  }

  // Was a short-exit signaled?
  if(end_sell_chance>=1) {
    ticket=0;
    OrderClose(OrderTicket(), NUM_LOTS, Ask, SLIPPAGE, BlueViolet);
  }

  // Was a long-enter signaled?
  if(begin_buy_chance>=1) {
    ticket=OrderSend(Symbol(), OP_BUY, NUM_LOTS, Ask, SLIPPAGE, Ask-EMERGENCY_LOSS*Point, Ask+TAKE_PROFIT*Point, "Long", 16384, 0, Lime);
    OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
    open_price=Open[0]-(ADJUST*Point)+(Bid-Ask);
  }

  // Was a short-enter signaled?
  if(begin_sell_chance>=1) {
    ticket=OrderSend(Symbol(), OP_SELL, NUM_LOTS, Bid, SLIPPAGE, Bid+EMERGENCY_LOSS*Point, Bid-TAKE_PROFIT*Point, "Short", 16384, 0, Red);
    OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
    open_price=Open[0]+(ADJUST*Point)+(Ask-Bid);
  }

  return(0);
}



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains tick volumes of each bar


Indicator Curves created:


Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself
It automatically opens orders when conditions are reached

Other Features:

BackTest : USDJPY on H1

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

BackTest : USDCHF on H1

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

BackTest : EURUSD on H1

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

BackTest : USDCAD on H1

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

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for arttrader_v1_5


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

Pair: Period: