過去に、私は自分のトレーディングのために自動売買システム(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;//エントリーをリセット } } }

