エキスパート: CExpertに基づいた売買のみのEA

 

CExpertに基づいた売買のみのEA:

CExpertサブクラスは売買注文のみを出すことを可能にし、MACDの例を持ってその使用法を示します。

買/売のみの一般的なエキスパートアドバイザー 

作者: Jose

 
とても分かりやすい。
 

著者失礼。逆張りなし、ロット選択可能なEA。

ロット選択可能なEALongShortExpertMACD.mq 5の変更:

//+------------------------------------------------------------------+
//|LongShortExpertMACD.mq5
//| Copyright 2009-2013, MetaQuotes Software Corp.
//| https://login.mql5.com/en/users/jlwarrior
//+------------------------------------------------------------------+
#property copyright "2009-2013, MetaQuotes Software Corp - 2013, jlwarrior"
#property link      "https://login.mql5.com/en/users/jlwarrior"
#property version   "1.00"
//+------------------------------------------------------------------+
| インクルード|
//+------------------------------------------------------------------+
#include <Expert\LongShortExpertModified.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| 入力|
//+------------------------------------------------------------------+
//--- 専門家のための入力
input string Inp_Expert_Title            ="Long/Short ExpertMACD";
int          Expert_MagicNumber          =10981;
bool         Expert_EveryTick            =false;
input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //ショート/ロング/両ポジション可

//--- デフォルトのMACDExpert入力
input int    Inp_Signal_MACD_PeriodFast  =12;                       // 高速MACD期間
input int    Inp_Signal_MACD_PeriodSlow  =24;                       // スローMACDの期間
input int    Inp_Signal_MACD_PeriodSignal=9;                        // シグナルMACDの期間
input double Inp_Money_Lot               =0.5;                      // ロット値
input int    Inp_Signal_MACD_TakeProfit  =50;                       // テイクプロフィット値
input int    Inp_Signal_MACD_StopLoss    =20;                       // ストップ・ロス値
//+------------------------------------------------------------------+
//| グローバルエキスパートオブジェクト|
//+------------------------------------------------------------------+
CLongShortExpertModified ExtExpert;  //特殊なデザインのCExpertサブクラス
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- エキスパートの初期化
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- 失敗
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }   
   // どのポジションを許可するかを制御する特定のパラメータ
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

//--- シグナル・オブジェクトの作成
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- 失敗
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- エキスパートにシグナルを追加する(自動的に削除される))。
   if(!ExtExpert.InitSignal(signal))
     {
      //--- 失敗
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- シグナル・パラメーターを設定する
   signal.PeriodFast(Inp_Signal_MACD_PeriodFast);
   signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow);
   signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal);
   signal.TakeLevel(Inp_Signal_MACD_TakeProfit);
   signal.StopLevel(Inp_Signal_MACD_StopLoss);   
//--- シグナル・パラメーターのチェック
   if(!signal.ValidationSettings())
     {
      //--- 失敗
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- 後続オブジェクトの作成
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- 失敗
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- エキスパートに末尾を追加する(自動的に削除される))。
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- 失敗
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- 後続パラメータを設定する
//--- 末尾のパラメータをチェックする
   if(!trailing.ValidationSettings())
     {
      //--- 失敗
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- 貨幣オブジェクトの作成
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- 失敗
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- エキスパートに資金を追加する(自動的に削除される))。
   if(!ExtExpert.InitMoney(money))
     {
      //--- 失敗
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- お金のパラメータを設定する 
   money.Lots(Inp_Money_Lot);
//--- マネー・パラメーターをチェックする
   if(!money.ValidationSettings())
     {
      //--- 失敗
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- 必要なすべての指標を調整する
   if(!ExtExpert.InitIndicators())
     {
      //--- 失敗
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- 成功
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパートの初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| 関数イベント・ハンドラ "tick"|
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| 機能-イベント・ハンドラ "trade"|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| 関数イベントハンドラ "timer"|
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

逆張りなしのEALongShortExpertModified.mqhの 変更:

//+------------------------------------------------------------------+
//|LongShortExpertModified.mqh
//|著作権 2013, jlwarrior||日本語
//| https://login.mql5.com/en/users/jlwarrior
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//+------------------------------------------------------------------+
//| ロング/ショート、または両方のポジションを制御するための列挙。
||オープン可能|
//+------------------------------------------------------------------+
//--- 
enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };
//+------------------------------------------------------------------+
//| クラス CLongShortExpertModified.|
//| 目的:ロング/ショート/両方のポジションをオープンできるようにする。
//| Derives from class CExpert (modifies only Open / Reverse methods)|
//+------------------------------------------------------------------+
class CLongShortExpertModified : public CExpert
  {
protected:
   ENUM_AVAILABLE_POSITIONS m_positions;
public:
                     CLongShortExpertModified(void);
                    ~CLongShortExpertModified(void);
   virtual bool      CheckOpen(void);
   void SetAvailablePositions(ENUM_AVAILABLE_POSITIONS newValue){m_positions=newValue;};
  };
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CLongShortExpertModified ::CLongShortExpertModified(void) : m_positions(BOTH_POSITION)
  {
  }
//+------------------------------------------------------------------+
//| デストラクタ|
//+------------------------------------------------------------------+
CLongShortExpertModified ::~CLongShortExpertModified(void)
  {
  }
//+------------------------------------------------------------------+
| 許可されたポジションのオープンをチェック|
//+------------------------------------------------------------------+
bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         // 新規のロング・ポジションのみをチェックする
      case SHORT_POSITION:
         return CheckOpenShort();        //新規のショート・ポジションのみをチェックする
      default:
         return CExpert::CheckOpen();    //デフォルトの動作
     }
  }
//+------------------------------------------------------------------+
 
ロング×ショートの銘柄コードを入力する欄はどこですか?