MT5エキスパートアドバイザー EA08_CCI.mq5

システムの概要

 CCI(コモディティ・チャンネル・インデックス)は
ドナルド・ランバートによって1980年頃に考案された
テクニカル指標です。
計算式は次のようになります。
 1. TP = (HIGH + LOW + CLOSE) / 3
  HIGH :バーの高値、LOW:バーの安値、CLOSE:バーの終わり値
 2. SMA (TP, N) = SUM (TP, N) / N
 SUM (TP, N) :N期間のTPの合計をN期間で割った値
 3. D = TP - SMA (TP, N)
 4. SMA (D, N) = SUM (D, N) / N
  SUM (D, N):N期間のDの合計N期間で割った値
 5. M = SMA (D, N) * 0,015
 6. CCI = M / D

このCCIのシグナルと併せ、指数移動平均で終わり値がクロスしたときに売買を行うようにします。
 
 EM08_CCI.mq5  のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。

ダウンロード

 ソースファイルはExpertsフォルダーに格納します。Expertsフォルダーの開き方は、
メタエディタのナビゲータでExpertsを選択し、マウスの右ボタンをクリックします。
そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。

 コンパイルすると問題がなければ次のように表示されます。
0 error(s), 0 warning(s), compile time: 23677 msec  1 1


プログラムの変更箇所

 
  コードは以前作ったEA08_WPR.mq5を変更していますが、変更箇所は次のようになっています。

----------
変更コード
input int      C_Period=11;

int C_Handle;

double    CCI[3];

----------
int OnInit()の変更コード

C_Handle=iCCI(_Symbol,_Period,C_Period,PRICE_CLOSE);

if(C_Handle==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR2");
      return(INIT_FAILED);
     }
----------
void OnDeinit(const int reason)の変更コード
 
IndicatorRelease(C_Handle);  

----------
void OnTick()の変更コード

 if(CopyBuffer(C_Handle,MAIN_LINE,0,3,CCI)<0)  return;
   Comment("  CCI  =  ",CCI[1]);

 int sig=0;
   if(CCI[0]>=  100 && CCI[1]<  100) sig =-1;
   if(CCI[0]<= -100 && CCI[1]> -100) sig = 1;
  
//-------------------
iCCIの使用方法
int  iCCI( 
   string              symbol,            
   ENUM_TIMEFRAMES     period,             
   int                 ma_period,          
   ENUM_APPLIED_PRICE  applied_price       
   );
 
Parameters
 
symbol:通貨ペア設定(_Symbol)
period:通貨ペアの時間足設定(_Period)
ma_period:計算期間(C_Period) 
applied_price:適用価格(PRICE_CLOSE)

プログラムコード

 

  EA08_CCI.mq5  のプログラムコードは以下のようになります。
赤字の部分は変更箇所です。
#property copyright "T.S"
#property link      "http://mt5myprogrammingts.blogspot.com"
#property version   "1.00"

#include <Trade/Trade.mqh>

//--- input parameters
input int      Stop=50;
input int      Take=85;
input int      Magic=1001;
input double   Lots=1.;
input int      Slipage=10;
//---------------------------
input int      MA_Period=3;
input int      C_Period=11;

int maH;
double maV[3];

int C_Handle;

double    CCI[3];

double sclose;
int STP,TKP,SL;
//+---------------------------+
// Expert initialization function   
//+---------------------------+
int OnInit()
  {
//---
   maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
   C_Handle=iCCI(_Symbol,_Period,C_Period,PRICE_CLOSE); 
   
//--- What if handle returns Invalid Handle

   if(maH==INVALID_HANDLE)
     {
      Print("Indicators error1 ");
      return(INIT_FAILED);
     }

//---
   if(C_Handle==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR2");
      return(INIT_FAILED);
     }
//---      
   STP = Stop;
   TKP = Take;
   SL  = Slipage;
   if(_Digits==5 || _Digits==3) //EURUSD=5
     {
      STP = STP*10;
      TKP = TKP*10;
      SL  = Slipage*10;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+----------------------------+
// Expert deinitialization function     
//+----------------------------+
void OnDeinit(const int reason)
  {
//---
   IndicatorRelease(maH);
   IndicatorRelease(C_Handle);
   Comment("");

  }
//+-----------------------------+
// Expert tick function        
//+-----------------------------+
void OnTick()
  {
//------------------------------
   MqlTick l_pr;
   MqlRates mrate[2];
//------------------------------

   if(!SymbolInfoTick(_Symbol,l_pr))
     {
      Print("the latest price  error");
      return;
     }

   if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }

//-----
   if(CopyBuffer(maH,0,0,3,maV)<0)  return;
   if(CopyBuffer(C_Handle,MAIN_LINE,0,3,CCI)<0)  return;
   Comment("  CCI  =  ",CCI[1]);
//-----   

   bool Buy_sig =false;
   bool Sell_sig=false;

   if(PositionSelect(_Symbol)==true)
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_sig=true;
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_sig=true;
        }
     }

   sclose=mrate[0].close;

   bool Buy_S1=(sclose>maV[1]);

   int sig=0;
   if(CCI[0]>=  100 && CCI[1]<  100) sig =-1;
   if(CCI[0]<= -100 && CCI[1]> -100) sig = 1;

   if(Buy_S1 && sig==1)
     {
      if(Buy_sig )  return;
      if(Sell_sig) return;

      double l= Lots;
      double p=NormalizeDouble(l_pr.ask,_Digits);
      double s = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
      double t = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);

      CTrade m_trade;
      m_trade.SetExpertMagicNumber(Magic);
      m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,l,p,s,t,"");
     }

   bool Sell_S1=(sclose<maV[1]);

   if(Sell_S1 && sig==-1)
     {
      if(Sell_sig) return;
      if(Buy_sig)  return;

      double l = Lots;
      double p = NormalizeDouble(l_pr.bid,_Digits);
      double s = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
      double t = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);

      CTrade m_trade;
      m_trade.SetExpertMagicNumber(Magic);
      m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,l,p,s,t,"");
     }
  }
//END

注意事項:プログラムはあくまでFX個人投資家の学習のための、
デモ口座によるMQL5売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。
リアルトレードではテストしておりません。