皆さん、こんにちは!今日は私が使っているシンプルな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;// 新しいバーのオープンプライスで取引するか
秘密は、変数を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)//-- アクティブな取引 { /* クローズ条件 todo */ //entry = false; } //else if(OrderCloseTime() != 0)//-- 手動またはSL/TP、EAでクローズ { entry = false;//リセットエントリー } } }


このEAを使えば、トレードの効率がかなり向上すると思います。ぜひ試してみてください!