現在のこのEA(エキスパートアドバイザー)は、CExpertクラスを基にして、ロングポジションまたはショートポジション(またはその両方)を選択してオープンできます。
提供されるファイルは2つあります:
- LongShortExpertModified.mqh: このクラスはデフォルトのCExpertを拡張し、CheckOpen()とCheckReverse()メソッドを修正して、希望するオーダーのみを開けるようにします。
- LongShortExpertMACD.mq5: このEAは、組み込みのExpertMACD.mq5クラスを簡単に修正したもので、入力パラメータに基づいて希望するオーダータイプのみを許可します。このEAは、専門家の使い方を明確にするために提供されています。
LongShortExpertModified
このクラスは、以下のenumに基づいて、特定のオーダータイプのみを許可するようにデフォルトのCExpertクラスの動作を修正します:
enum ENUM_AVAILABLE_POSITIONS
{
LONG_POSITION,
SHORT_POSITION,
BOTH_POSITION
};
このenumは、最終的なEAが許可するオーダーのタイプを決定するための入力パラメータとして使用され、内部的に希望するオーダーのみを開くためや、両方のポジションタイプが許可されている場合にのみオーダーの逆転を処理するために使用されます。
そのために、CheckOpen()とCheckReverse()メソッドが書き換えられています:
class CLongShortExpertModified : public CExpert { protected: ENUM_AVAILABLE_POSITIONS m_positions; public: CLongShortExpertModified(void); ~CLongShortExpertModified(void); virtual bool CheckOpen(void); virtual bool CheckReverse(void); void SetAvailablePositions(ENUM_AVAILABLE_POSITIONS newValue){m_positions=newValue;}; };
CheckOpen()は、m_positionsの値に応じてロングまたはショートのポジションのみをチェックするように修正されています:
bool CLongShortExpertModified :: CheckOpen() { switch(m_positions) { case LONG_POSITION: return CheckOpenLong(); //新しいロングポジションのみをチェック case SHORT_POSITION: return CheckOpenShort(); //新しいショートポジションのみをチェック default: return CExpert::CheckOpen(); //デフォルトの動作 } }
CheckReverse()は、両方のポジションタイプが許可されている場合にのみポジションの逆転をチェックするように修正されています:
bool CLongShortExpertModified::CheckReverse() { switch(m_positions) { case LONG_POSITION: case SHORT_POSITION: return false; //逆転は許可されていません default: return CExpert::CheckReverse(); //デフォルトの動作 } }
LongShortExpertMACD
このクラスは、前述のクラスの使用例として、デフォルトのExpertMACD EAに基づいています。
まず、具体的なExpertクラスを含め、対応する入力パラメータを追加する必要があります。また、外部のエキスパートは、デフォルトのCExpertではなく、サブクラスに関連付けられています:
#include <Expert\LongShortExpertModified.mqh> //[...] input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //ショート / ロング / 両方のポジションが許可されています //[...] CLongShortExpertModified ExtExpert; //特定に設計されたCExpertサブクラス
エキスパートを初期化した後、パラメータは入力値に応じて設定する必要があります:
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) { //--- 初期化に失敗しました printf(__FUNCTION__+": エキスパートの初期化エラー"); ExtExpert.Deinit(); return(-1); } // どのポジションが許可されているかを制御する特定のパラメータ ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);
追加の変更は必要ありません。以下の図は、エキスパートの設定パラメータを示しています:
