システムトレード 게시글

DeMarkerインジケーターを使用したシンプルなMT4自動売買システム

첨부파일
32418.zip (1.46 KB, 다운로드 0회)

過去に、私は自分のトレーディングのために自動売買システム(EA)を使うことを考えました。今回は、その中でも特にシンプルなEAをご紹介します。このEAは、単一の通貨ペアで動作します。設定メニューでは、時間枠、ロット数、ストップロス、テイクプロフィットなどを簡単に入力できます。


extern ENUM_TIMEFRAMES TF  = PERIOD_CURRENT;// 時間枠を選択
extern int period          = 8;// DeMarkerの期間
extern double lt           = 0.01;// ロット数
extern int sl              = 100;// ストップロス
extern int tp              = 100;// テイクプロフィット
extern double OB           = 0.7;// 過剰売り
extern double OS           = 0.3;// 過剰買い
extern bool OPENBAR        = false;// 新しいバーのオープン価格で取引

このEAの秘密は、変数を3つのパートに分けることです:
1. データ | 時間枠
2. 注文
3. ペア

//+------------------------------------------------------------------+

//-- 時間枠|インジケーター
double dmrk[5];
int signal  =-1;//-- 0.買い 1.売り
int hold = 0;

//-- 注文
int ticket  =0;
double lot  =0.0;
int typ     =-1;


//-- ペア
datetime t1=0;
bool newbar=false;
bool entry =false;

//+------------------------------------------------------------------+

OnInit()関数では、DeMarkerインジケーターの配列変数を初期化し、特定のブローカーの要件に応じた最小ロットサイズを確認します。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayInitialize(dmrk,0.0);
  //---
      const double test_lot   = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
      if(lt<test_lot)   lt    = test_lot;
  }

OnTick()関数では、インジケーターを計算し、買いと売りのシグナルを決定します。

//---------------------------------------------------------------------------
   signal = -1;
//---------------------------------------------------------------------------

//---計算
   for(int i=0; i<ArraySize(dmrk); i++)
     {
      dmrk[i]  =  iDeMarker(Symbol(),TF,period,i);
     }
//---

   if(dmrk[1] > OB)
     {
      hold = 1;//設定
     }
   else
      if(dmrk[1] < OS)
        {
         hold = -1;//設定
        }
      else
        {
         hold = 0;//リセット
        }

   if(hold ==  1)
     {
      if(dmrk[0]<OB && dmrk[1]>OB)
        {
         signal = OP_SELL;
        }
     }
   if(hold == -1)
     {
      if(dmrk[0]>OS && dmrk[1]<OS)
        {
        signal = OP_BUY;
        }
     }

買いと売りのシグナルを開くために...

//---------------------------------------------------------------------------
   if(signal != -1)
      if(newbar==true)
         if(entry==false)//ドアを開く
           {
            //---
            entry =true;//設定
            //---

            if(signal == OP_BUY)
              {
               ticket = OrderSend(Symbol(),OP_BUY,lt,Ask,(int)((Ask-Bid)/Point,
                                  sl>0?Bid-sl*Point:0.0,
                                  tp>0?Bid+tp*Point:0.0,
                                  EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold),
                                  EANumber,
                                  0,
                                  clrBlue);
               signal=-1;
               //hold =0;
              }//リセット
              }//リセットシグナル

           }

そして、クローズ処理について...

   if(entry == true) // クローズ処理
     {

      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime() == 0)//-- 注文がアクティブな取引
           {
            /*  クローズ条件  */
            //entry = false;
           }
         //else
            if(OrderCloseTime() != 0)//--  クローズ理由 1.手動 2.スリッページ/テイクプロフィット 3.自動売買
              {
               entry = false;//エントリーをリセット
              }
        }
     }



연관 포스트

댓글 (0)