MetaTrader自動売買でウハウハ

MetaTrader自動売買でウハウハ

MetaTraderで自動売買なんてことしてみます。

Amebaでブログを始めよう!
さて、最初のEAを作成してみました。

最初なので、極めてシンプルなルールでつくりました。

<ルール(買いの場合。売りは逆)>
・10期間移動平均線(SMA)を完全に上抜けした場合(※)、次の始値で買いを仕掛ける。
※完全に上抜けとは、安値も移動平均線を越えること。
・10期間移動平均線(SMA)を安値が下回った場合、次の始値で仕切る。

作成したコードはこちら↓

//+------------------------------------------------------------------+
//|                                                          MA1.mq4 |
//|                                        Copyright ゥ 2012, Namihei |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright ゥ 2012, Namihei"
#property link      ""

#include <stdlib.mqh>

#define MAGICNUMBER   1234
#define COMMENT "MA1"

extern int MA_Period = 10;
extern double Lots = 0.01;
extern int Slippage = 10;

//+------------------------------------------------------------------+
//| Function Definitions                                             |
//+------------------------------------------------------------------+
int subEntrySignalCheck()
{
  double totalpos = 0;
  int retflg = 0;
   
  totalpos = subTotalTrade();

  double MA_Current = iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_CLOSE,1);
  double MA_Previous = iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_CLOSE,2);
   
  if(totalpos ==0)
  {
    if(MA_Previous < High[2] && Low[2] < MA_Previous)
    {
      if(MA_Current < Low[1])
      {
        retflg = 1;
      }
      else if(MA_Current > High[1])
      {
        retflg = -1;
      }
    }
    if(MA_Previous > High[2])
    {
      if(MA_Current < Low[1])
      {
        retflg = 1;
      }
    }
    if(MA_Previous < Low[2])
    {
      if(MA_Current > High[1])
      {
        retflg = -1;
      }
    }
  }
      

  return(retflg);
}

int subExitSignalCheck()
{
  double totalpos = 0;
  int retflg = 0;
   
  totalpos = subTotalTrade();

  double MA_Current = iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_CLOSE,1);  
   
  
  if(totalpos > 0 && MA_Current >= Low[1]) retflg = -1;
  if(totalpos < 0 && MA_Current <= High[1]) retflg = 1;
   
  return(retflg);
}


double subTotalTrade()
{
  int cnt;
  double total = 0.0;

  for(cnt=0; cnt < OrdersTotal(); cnt++)
  {
    if(OrderSelect(cnt, SELECT_BY_POS) == false) break;
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICNUMBER)
    {
      switch(OrderType())
      {
        case OP_BUY:
          total = total+OrderLots();
          break;
        case OP_SELL:
          total = total-OrderLots();
          break;
        case OP_BUYLIMIT:
          total = total+OrderLots();
          break;
        case OP_SELLLIMIT:
          total = total-OrderLots();
          break;
        case OP_BUYSTOP:
          total = total+OrderLots();
          break;
        case OP_SELLSTOP:
          total = total-OrderLots();
          break;
            
      }
    }
  }
  return(total);
}



int subOpenOrder(int type)
{
  int
      ticket = 0,
      err = 0,
      c = 0,
      NumberOfTries = 5;
         
   
  if(type==OP_BUY)
   {
    for(c=0;c<NumberOfTries;c++)
   {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,COMMENT,MAGICNUMBER,0,Blue);
              
      err=GetLastError();
      if(err==0)
      { 
        break;
      }
      else
      {
        if(err==4 || err==137 ||err==146 || err==136) //Busy errors
        {
          Sleep(5000);
          continue;
        }
        else //normal error
        {
          break;
        }  
      }
    }   
  }
  if(type==OP_SELL)
  {   
    for(c=0;c<NumberOfTries;c++)
    {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,COMMENT,MAGICNUMBER,0,Red);
      err=GetLastError();
      if(err==0)
      { 
        break;
      }
      else
      {
        if(err==4 || err==137 ||err==146 || err==136) //Busy errors
        {
          Sleep(5000);
          continue;
        }
        else //normal error
        {
          break;
        }  
      }
    }   
  }  
  return(ticket);
}



void subCloseOrder()
{
  int cnt, 
     total = 0;

  total = OrdersTotal();
  for(cnt=total-1;cnt>=0;cnt--)
  {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == false) break;

    if(OrderSymbol()==Symbol() &&
      OrderMagicNumber()==MAGICNUMBER)
    {
      if(IsTradeAllowed() == true)
      {
        RefreshRates();
        OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Violet);
        break;
      }
    }
  }      
}


void subCheckError(int ticket, string Type)
{
  if(ticket>0) 
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(Type + " order opened : ",OrderOpenPrice());
  }
  else Print("Error opening " + Type + " order : ", ErrorDescription(GetLastError()));
}



//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
  int ticket = 0;
   
  //entry
  if(subEntrySignalCheck()>0)
  {
    subCloseOrder();
    ticket = subOpenOrder(OP_BUY);
    subCheckError(ticket,"BUY");
  }
   
  if(subEntrySignalCheck()<0)
  {
    subCloseOrder();
    ticket = subOpenOrder(OP_SELL);
    subCheckError(ticket,"SELL");
  }
   
  //Exit
  if(subExitSignalCheck()!=0)
  {
    subCloseOrder();    
  }
  return(0);
  }
//+------------------------------------------------------------------+



結果は・・・、

ProfitFactorが0.92!!!
まぁ、予想していましたが笑


これでは到底使えない涙

チャートを開いてみると、
とってもちゃぶついてますねぇ。


ちゃぶつきの全てを排除することは不可能ですが、
何らかのフィルターをかけてちゃぶつきを避ける様に改良が必要ですね・・・。

それと、ポジションサイジングやトレイリングなど仕切りに関するところも
検討が必要ですね。