移動平均線のクロスで取引するEAのサンプルコード (MT4)

 


ごきげんよう、FX貴族です。
いまEA作りを学んでいる人や
これから学びたい!という人向けに、

もっと基本的なテクニカルである、
移動平均線のクロスを利用したEAの
サンプルコードをご紹介します。

コピペして使えますので、
ぜひ試してみてくださいね。

このまま使う人は少ないと思いますが、
実際のトレードでの利用に際しては
ご自身の責任でお願いします。


#property strict
#property version "1.00"
#property copyright "FX-KIZOKU"
//+------------------------------------------------------------------+
// 基本設定
//+------------------------------------------------------------------+
input string Comment = "GOLDEN_CROSS_SAMPLE_v1.00"; //コメント
input double Lots = 0.1; //取引するロット数
input int Magic = 20230422; //マジックナンバー
input int FastMAPeriod = 10; //短期移動平均線の期間
input int SlowMAPeriod = 20; //長期移動平均線の期間
input int MaxSpread = 30; //許容する最大スプレッド(points)
//+------------------------------------------------------------------+
// 現在のポジション状況を確認
//+------------------------------------------------------------------+
int CheckPos() {
   int buys=0,sells=0;
   for(int i=0;i<OrdersTotal();i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
   if(buys>0) return(buys);
   else       return(-sells);
}
//+------------------------------------------------------------------+
// 新規注文
//+------------------------------------------------------------------+
void ChechForOpen() {
   double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double FastMA2 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   if (CheckPos() == 0 && Volume[0] <= 10 && MarketInfo(Symbol(),MODE_SPREAD) <= MaxSpread) {
      int Ticket;
      if(FastMA1 > SlowMA1 && FastMA2 < SlowMA2) {
         Ticket = OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0, Comment, Magic, 0, Green); 
      }
      if(FastMA1 < SlowMA1 && FastMA2 > SlowMA2) {
         Ticket = OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0, Comment, Magic, 0, Red); 
      }
   }
}
//+------------------------------------------------------------------+
// ポジションの決済
//+------------------------------------------------------------------+
void CheckForClose() {
   double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double FastMA2 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   if (CheckPos() != 0) {
      for(int i=0;i<OrdersTotal();i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      if(OrderType()==OP_BUY) {
         if(FastMA1 < SlowMA1 && FastMA2 > SlowMA2) {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,0,White))
               Print("OrderClose error ",GetLastError());
           }
        }
      if(OrderType()==OP_SELL) {
         if(FastMA1 > SlowMA1 && FastMA2 < SlowMA2) {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,0,White))
               Print("OrderClose error ",GetLastError());
           }
        }
      }
   }
}
//+------------------------------------------------------------------+
// 価格が動いたら以下の内容を実行
//+------------------------------------------------------------------+
void OnTick() {
   CheckForClose();
   ChechForOpen();
}


コメント