mt4 EAのロジック抜きの枠組みサンプルコード[備忘録]

EA(Expert Advisor)
スポンサーリンク

EA作成の基本となる、EAの基本構造のサンプルコードです。

MetaEditorにはじめから入っているMovingAverage.mql4を参考に骨組みだけ抜き出しました。

※注意!
以下のサンプルコードは私が実際にEAを作成するときに使用するコードの一部分ではありますが完全な動作保証をするものではありません。
読者様が以下のコードを使用して実際に自動売買された際のいかなる損害についても当サイトは保証できません。
予めご了承ください。 PCoROOM izu
<スポンサーリンク>

#property copyright   "PCoROOM"
#property link        "https://pcoroom.com/"
#property description "EA Sample"

#define MAGICMA  123456
//--- インプット
input double Lots          =0.1;    //0.1ロット

//+------------------------------------------------------------------+
//| 保有ポジションの数を計算                                            |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   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()==MAGICMA)    
        {
         if(OrderType()==OP_BUY)  buys++;                        
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }

//+------------------------------------------------------------------+
//| 判断とオーダー                                                   |
//+------------------------------------------------------------------+

void CheckForOpen()
  {
  int res;
  
   //新しいローソク足が生成されたときのみトレードする。
   if(Volume[0]>1) return;
//---売り条件
         if(売り条件を入れる)
         {
            res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);  //オーダー
            return;
         }

//---買い条件

         if(買い条件を入れる)
         {
            res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);  //オーダー
            return;
         }  

  }

//+------------------------------------------------------------------+
//| 手仕舞い                              |
//+------------------------------------------------------------------+
void CheckForClose()
  {

//新しいローソク足が生成されたときのみトレードする。
   if(Volume[0]>1) return;
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //--- オーダータイプの確認と手仕舞い
      if(OrderType()==OP_BUY)
        {
         if(買いポジションの手仕舞い条件)
         {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
         break;
         }
        }
      if(OrderType()==OP_SELL)
        {
         if(売りポジションの手仕舞い条件)
         {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
         break;
         }
        }
     }
//---
  }

//+------------------------------------------------------------------+
//| OnTick function メイン                                           |
//+------------------------------------------------------------------+
void OnTick()            //メイン構造
  {
//--- check for history and trading
   if(Bars<200 || IsTradeAllowed()==false)
      return;
//--- オーダー数チェックと売買判断、手仕舞い
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();  //売買判断を呼び出す
   else CheckForClose();                                         //手仕舞い判断を呼び出す
//---
  }
//+------------------------------------------------------------------+

このEA構造の基本はレートが更新されるたびに呼び出されるOntick()の中で売買の判断とオーダーをするCheckForClose()と手仕舞いの判断をするCheckForClose()を呼び出すことになっています。

細かい条件としてローソクの数が200以下でのトレード禁止、ローソク足のはじめでのみトレードが設定されています。

この基本枠組みに売買条件を設定していく、つまりCheckForOpen(),CheckForClose()内のif()に条件を記入することによってEAを作っていくことができます。

タイトルとURLをコピーしました