FXで売買タイミングとして使うローソク足(バー)の陽線又は陰線が数回続いたらエントリーする、簡単なMT4のEAサンプルです。
ローソク足の情報だけでプラス収支にできるか興味があったので作ってみたのですが、恐ろしい程のマイナスを叩きだすEAを作ってしまいました。
主な構文
iOpen()、iClise()で陽線と陰線を判断できるので特に特別な構文は使っていません。
あと、何連続でも対応できるようにしたかったのでfor文で作っています。
ソースコード
//+------------------------------------------------------------------+ //| ASI.mq4 | //| Copyright 2020, mef Software. | //| https://fx-prog.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, mef Software." #property link "https://fx-prog.com/" #property version "1.00" #property strict input int BarLoopCnt = 2; input double Lots = 1; datetime prevtime; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int start() { //--- int orderPtn=0; //0:何もしない 1:買い 2:売り int total=0; int errorcode; // エラーコード int ea_ticket_No,ea_order_entry_Type=0,ea_order_MagicNo; // チケットNo,エントリタイプ,マジックNo. double ea_order_stop_price=0,ea_order_good_price=0,ea_order_entry_price=0; //ストップロスレート,利確レート,エントリーレート //--- //新しい足ができた時だけやる if(Time[0] != prevtime){ prevtime = Time[0]; }else{ return(0); } //***売買判断箇所***// //バーの陽線(陰線)がBarLoopCnt分続いている事をチェック for(int i=0; i < BarLoopCnt; i++){ //ループ1回目は無条件 if(i==0){ //陽線の場合 if(iOpen(NULL, 0, i+1) < iClose(NULL, 0, i+1)){ orderPtn = 1; } //陰線の場合 else if(iOpen(NULL, 0, i+1) > iClose(NULL, 0, i+1)){ orderPtn = 2; //条件合わずで抜ける(ありえない) }else{ orderPtn = 0; break; } //ループ2回目以降は同じ線 }else{ //陽線 かつ 高値を切り上げている場合 if(orderPtn == 1 && iOpen(NULL, 0, i+1) < iClose(NULL, 0, i+1) && iHigh(NULL, 0, i) > iHigh(NULL, 0, i+1)){ orderPtn = 1; } //陰線 かつ 安値を切り下げている場合 else if(orderPtn == 2 && iOpen(NULL, 0, i+1) > iClose(NULL, 0, i+1) && iLow(NULL, 0, i) < iLow(NULL, 0, i+1)){ orderPtn = 2; //条件合わずで抜ける }else{ orderPtn = 0; break; } } } //***売買判断箇所***// //***決済判断箇所***// total=OrdersTotal(); if(total == 0 && orderPtn > 0) { if(orderPtn == 1) { ea_order_entry_price = Ask; // 現在の買値でエントリー ea_order_entry_Type = OP_BUY; //OP_BUY ea_order_stop_price = Ask - 100 * Point; //損切りポイント(-10銭) ea_order_good_price = Ask + 100 * Point; //利喰いポイント(+10銭) } else if(orderPtn == 2) { ea_order_entry_price = Bid; // 現在の売値でエントリー ea_order_entry_Type = OP_SELL; //OP_SELL ea_order_stop_price = Bid + 100 * Point; //損切りポイント(-10銭) ea_order_good_price = Bid - 100 * Point; //利喰いポイント(+10銭) } ea_order_MagicNo=0000; //マジックナンバーは0000固定とする ea_ticket_No = OrderSend( // 新規エントリー注文 NULL, // 通貨ペア ea_order_entry_Type, // オーダータイプ[OP_BUY / OP_SELL] Lots, // ロット(0.01単位,FXTFは1=10Lot) ea_order_entry_price, // オーダープライスレート 20, // スリップ上限 ea_order_stop_price, // ストップレート ea_order_good_price, // リミットレート "テストオーダー", // オーダーコメント ea_order_MagicNo, // マジックナンバー(識別用) 0, // オーダーリミット時間 clrRed // オーダーアイコンカラー ); if ( ea_ticket_No == -1) // オーダーエラー { errorcode = GetLastError(); // エラーコード取得 if( errorcode != ERR_NO_ERROR) // エラー発生 { printf("エラー"); } } else { // 注文約定 Print("新規注文約定。 チケットNo=",ea_ticket_No); } } return(0); }
エントリータイミング
ローソク足(バー)の陽線が2連続かつ高値を更新していらロングでエントリーします。逆に、ローソク足(バー)の陰線が2連続かつ安値を更新していたらショートでエントリーします。
※input int BarLoopCnt = 2; の2の部分を3に変える事で、3連続に変更できます
決済タイミング
損切、利確共に10pipsです。
その他の仕様
設定値は以下の通りです。
- BarLoopCnt = 2 ⇒ 陽線・陰線が何回続いたらエントリーするかを設定する
- Lots = 1 ⇒ ロット数です(0.01=1000通貨)
既に建玉がある場合は追加でエントリーはしません。
新しい足(バー)が出来た際に1度だけ処理を行います。※1時間足の場合だと1時間に1回処理する
新規注文で失敗が起きた場合、エラーログを書き出します。
EAレポート結果

2005年~2020年の期間の1時間足でバックテスト確認してみました。10万通貨運用でマイナス約5000万円でした。ローソク足を単純に見るだけでは勝てそうにないですね。もっと色々な工夫が必要そうです。
※ EAのサンプルソースを一覧表にまとめました
※ オススメ記事(EAが使える国内FX業者の一覧)
※ 1からEAの作り方を学びたい人はこちら
コメント