MT4 平均足とは?設定方法・使い方とEA化サンプルを解説

MT4の平均足EAで陽線と陰線の転換を使って売買判定するイメージ画像
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

MT4の平均足(Heiken Ashi)は、ローソク足の値を加工してトレンドの方向を見やすくしたインジケーターです。

この記事では、MT4で平均足を表示・設定する方法やローソク足との違い、メリット・デメリットを解説します。後半では、iCustom()で平均足を取得し、陽線・陰線の転換で売買するMQL4の無料EAサンプルコードも公開します。

📘 この記事で解説する内容
  • 平均足(Heiken Ashi)の基本
  • MT4で平均足を表示・設定する方法
  • 平均足と通常のローソク足の違い
  • 平均足のメリット・デメリット
  • iCustom()で平均足を取得する方法
  • 平均足の色転換を使ったEAサンプルコード
  • パラメータ設定とバックテスト結果

平均足(Heiken Ashi)とは?

MT4の平均足(Heiken Ashi)インジケーター

平均足は、通常のローソク足の価格をそのまま表示するのではなく、始値・高値・安値・終値をもとに計算した値を使って描画するチャートです。

通常のローソク足よりも陽線・陰線が連続して表示されやすく、細かな値動きの影響を抑えながらトレンドの方向や継続を視覚的に確認しやすい特徴があります。

※MT4では「Heiken Ashi」という名称で搭載されていますが、「Heikin Ashi」と表記されることもあります。本記事ではどちらも同じ平均足を指します。

平均足と通常のローソク足の違い

MT4の通常ローソク足と平均足の比較
通常のローソク足と平均足の表示比較

通常のローソク足は実際の始値・高値・安値・終値をそのまま使いますが、平均足では前の足を含めて計算した値を使用します。

そのため、平均足の始値や終値は実際の約定価格とは一致しません。一方で陽線・陰線の細かな切り替わりが抑えられ、相場の大きな流れを確認しやすくなります。

MT4で平均足を表示・設定する方法

MT4では、平均足は標準のカスタムインジケーター「Heiken Ashi」として用意されています。別途インジケーターをダウンロードしなくても表示できます。

  1. MT4上部メニューの「挿入」をクリック
  2. 「インディケータ」→「カスタム」へ進む
  3. 「Heiken Ashi」を選択
  4. 必要に応じて色などを変更して「OK」をクリック

チャート上に平均足が表示されます。陽線・陰線が連続している方向を見ることで、現在のトレンド方向を確認しやすくなります。

平均足のメリット・デメリット

平均足のメリット

  • トレンドの方向を視覚的に判断しやすい
  • 通常のローソク足より陽線・陰線が連続しやすい
  • 細かな値動きのノイズを抑えて相場の流れを確認できる
  • 陽線・陰線の転換をEAの売買条件として扱いやすい

平均足のデメリット

  • 平均足の始値・終値は実際の価格とは異なる
  • 値動きを平滑化するため、シグナルが遅れる場合がある
  • レンジ相場では陽線・陰線が頻繁に切り替わることがある
  • 平均足だけで常に有効な売買シグナルになるわけではない

平均足は「実際の価格そのものを見る」というより、現在のトレンド方向を把握しやすくするための指標として利用するのが基本です。

この平均足EAの仕様

ここからは、MT4標準の平均足をMQL4から取得して自動売買するEAを作成します。

平均足そのものの使い方を分かりやすくするため、MAやADXなどの追加フィルターは使用せず、1本前と2本前の確定した平均足の色が転換したタイミングで売買します。

項目内容
対応MT4 / MQL4
使用インジケーター平均足(Heiken Ashi)
使用関数iCustom()
BUY条件2本前が陰線、1本前が陽線へ転換
SELL条件2本前が陽線、1本前が陰線へ転換
判定タイミング新しいローソク足ができたとき(1本前・2本前の確定足を使用)
決済反対方向の平均足へ転換したとき
ドテン反対ポジションを決済後、同じ転換シグナルで新規エントリー
TP / SL1000pips / 1000pips
MagicNumber管理なし(学習用サンプルのため)

平均足EAのエントリーロジック

1本前と2本前の確定した平均足からOpenとCloseを取得し、陽線・陰線が切り替わったかを判定します。

BUY条件|陰線から陽線へ転換

2本前が陰線で、1本前が陽線へ変わった場合にBUYシグナルとします。

haClose2 < haOpen2
&& haClose1 > haOpen1

SELL条件|陽線から陰線へ転換

2本前が陽線で、1本前が陰線へ変わった場合にSELLシグナルとします。

haClose2 > haOpen2
&& haClose1 < haOpen1

反対方向へ転換したらドテン

今回のEAでは、反対方向への転換シグナルを「現在ポジションの決済」と「反対方向への新規エントリー」の両方に使用します。

平均足EAの売買の流れ
・陰線 → 陽線:SELLを保有していれば決済 → BUY
・陽線 → 陰線:BUYを保有していれば決済 → SELL

平均足の色が転換するたびにBUYとSELLを切り替える、シンプルなドテン型EAです。

平均足EAを使う前の注意点

このコードは、平均足の取得と色転換による売買判定を理解しやすくすることを優先した学習用サンプルです。
複数EAを同一口座で管理するためのMagicNumberによるポジション識別などは実装していません。

平均足はトレンド方向を確認しやすい一方、レンジ相場では陽線・陰線が短期間で切り替わり、細かなドテンを繰り返すことがあります。

また、平均足のOpen・Closeは実際の約定価格ではありません。このEAでは、平均足の値を売買シグナルの判定に使用し、実際の注文価格にはAsk・Bidを使用します。

今回のEAは反対転換による決済を基本とするため、TP・SLは1000pipsを初期値にしています。

このEAはOrdersTotal()で口座全体の注文数を確認するため、そのまま利用する場合は、他のEAや手動ポジションと同じ口座で併用せず、EA単独で検証する方法を推奨します。

ベーステンプレートからの変更点

今回の平均足EAは、当サイトで公開しているMT4 EAベーステンプレートを土台に作成しています。

ベーステンプレートからの主な変更点は次の通りです。

  • iCustom()でMT4標準の「Heiken Ashi」を取得
  • 1本前・2本前の平均足Open / Closeから色転換を判定
  • 陰線→陽線でBUY、陽線→陰線でSELL
  • 反対方向のシグナルで現在ポジションを決済
  • 決済後、同じシグナルで反対方向へドテン
  • 共通関数は実際に使用するfuncOrder_Send()とfuncOrder_CloseAll()のみ掲載

つまり、今回の平均足EAはベーステンプレートの共通部分を残しながら、平均足の取得・転換判定・反対方向への決済とドテン処理を追加したEAです。

平均足EAをダウンロード

今回の記事で解説している平均足EAはこちらからダウンロードできます。

📥 平均足EAをダウンロード

👉 ダウンロード後のパラメータ設定を見る

💡 コードを書かずにEAを作ってみたい方へ
無料MT4 EAビルダーでは、売買条件を画面上で設定しながらEAを作成できます。
今回のサンプルを確認したあと、他のインジケーターや条件を使って自分のEAを作ってみたい方にも利用できます。

▶ 無料MT4 EAビルダーを使ってみる

なお、この記事の平均足EAはiCustom()で平均足の色転換を取得し、反対方向へドテンする独自サンプルです。EAビルダーで作成するロジックとは、選択する条件によって売買タイミングが異なります。

平均足EAのMQL4サンプルコード

以下が今回の公開版ソースコードです。
公開表記はv1.0、ソース上は#property version "1.00"としています。

💡 コードの見方
背景色が付いている行が、ベースEAテンプレートから主に変更・追加した部分です。
平均足の取得・色転換判定・ドテン処理を中心に強調しています。
//+------------------------------------------------------------------+
//|                                                04_HeikinAshi.mq4 |
//|                                Copyright © 2020-2026 ぷろぐらむFX |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2026 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict

input double Lots = 0.01;              //ロット
input int TP = 1000;                   //利確(pips)
input int SL = 1000;                   //損切り(pips)

string Ea_Name = WindowExpertName();   //EA名称をオーダーコメントに使用
double PipValue;                       //ブローカー桁数に対応したPoint補正
datetime prevtime;                     //ローソク足時間保持用

int OnInit(){
   if(Digits == 3 || Digits == 5){
      PipValue = Point * 10;
   }else{
      PipValue = Point;
   }
   return(INIT_SUCCEEDED);
}

void OnTick(){
   if(Time[0] != prevtime){
      prevtime = Time[0];
   }else{
      return;
   }

   int total = OrdersTotal();
   int ea_order_Type = -1;
   double ea_order_stop_price = 0;
   double ea_order_good_price = 0;

   bool openBuy = false;
   bool openSell = false;

//***【新規注文判断↓】***//
   double haOpen1 = iCustom(NULL,0,"Heiken Ashi",2,1);
   double haClose1 = iCustom(NULL,0,"Heiken Ashi",3,1);
   double haOpen2 = iCustom(NULL,0,"Heiken Ashi",2,2);
   double haClose2 = iCustom(NULL,0,"Heiken Ashi",3,2);

   if(haClose2 < haOpen2 && haClose1 > haOpen1){
      openBuy = true;
   }else if(haClose2 > haOpen2 && haClose1 < haOpen1){
      openSell = true;
   }
//***【新規注文判断↑】***//

//***【決済注文判断↓】***//
   if(total > 0){
      if(openBuy){
         if(!funcOrder_CloseAll(OP_SELL,-1,0)) return;
      }else if(openSell){
         if(!funcOrder_CloseAll(OP_BUY,-1,0)) return;
      }
   }
//***【決済注文判断↑】***//

   if(OrdersTotal() == 0){
      if(openBuy){
         ea_order_Type = OP_BUY;
      }else if(openSell){
         ea_order_Type = OP_SELL;
      }

//***【TP/SL判断↓】***//
      if(openBuy){
         ea_order_stop_price = Ask - SL * PipValue;
         ea_order_good_price = Ask + TP * PipValue;
      }else if(openSell){
         ea_order_stop_price = Bid + SL * PipValue;
         ea_order_good_price = Bid - TP * PipValue;
      }
//***【TP/SL判断↑】***//

      if(ea_order_Type > -1){
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,0,0);
      }
   }
}


//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★

//+------------------------------------------------------------------+
//|【関数】新規注文関数                                              |
//|【引数】orderType:売買(0=BUY, 1=SELL)                            |
//|【引数】sl:損切り価格  tp:利確価格                               |
//|【引数】lots:取引ロット数                                         |
//|【引数】orderComment:オーダーコメント                             |
//|【引数】magic:MagicNumber                                         |
//|【引数】maxSpreadPoints:許容スプレッド[Point] (0=制限なし)       |
//|【戻値】true=成功 false=失敗                                      |
//+------------------------------------------------------------------+
bool funcOrder_Send(int orderType, double sl, double tp, double lots, string orderComment, int magic, int maxSpreadPoints){

   int ticket = -1;
   double price = 0;
   double spread = 0;
   color clr = clrNONE;

   for(int retry=0; retry<10; retry++){

      RefreshRates();
      spread = MarketInfo(Symbol(),MODE_SPREAD);

      if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
         Print("スプレッド拡大中(",spread,"ポイント) → 待機中 (リトライ=",retry+1,")");
         Sleep(2000);
         continue;
      }

      if(orderType == OP_BUY){
         price = Ask;
         clr = clrBlue;
      }else if(orderType == OP_SELL){
         price = Bid;
         clr = clrRed;
      }else{
         Print("funcOrder_Send: 未対応の注文種別=",orderType);
         return false;
      }

      price = NormalizeDouble(price,Digits);

      if(sl > 0) sl = NormalizeDouble(sl,Digits);
      if(tp > 0) tp = NormalizeDouble(tp,Digits);

      ResetLastError();

      ticket = OrderSend(Symbol(),orderType,lots,price,20,sl,tp,orderComment,magic,0,clr);

      if(ticket > 0){
         Print("新規注文成功! チケットNo=",ticket," レート=",price," Lots=",lots," スプレッド=",spread,"ポイント");
         return true;
      }

      int err = GetLastError();
      Print("新規注文失敗 エラーNo=",err," リトライ回数=",retry+1);
      Sleep(2000);
   }

   return false;
}

//+------------------------------------------------------------------+
//|【関数】全決済関数                                                |
//|【引数】orderType:-1=すべて 0=BUYのみ 1=SELLのみ                 |
//|【引数】magic:対象MagicNumber (-1=全MagicNumber)                  |
//|【引数】maxSpreadPoints:許容スプレッド[Point] (0=制限なし)       |
//|【戻値】true=全成功 false=一部失敗あり                           |
//+------------------------------------------------------------------+
bool funcOrder_CloseAll(int orderType, int magic, int maxSpreadPoints){

   bool allSuccess = true;
   int totalOrders = OrdersTotal();
   double spread = 0;
   double closePrice = 0;
   double lots = 0;
   int type = -1;
   int ticket = -1;
   color clr = clrNONE;

   for(int i=totalOrders-1; i>=0; i--){

      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(magic != -1 && OrderMagicNumber() != magic) continue;

      type = OrderType();
      ticket = OrderTicket();
      lots = OrderLots();

      if(type != OP_BUY && type != OP_SELL) continue;
      if(orderType == OP_BUY && type != OP_BUY) continue;
      if(orderType == OP_SELL && type != OP_SELL) continue;

      bool result = false;

      for(int retry=0; retry<10; retry++){

         RefreshRates();
         spread = MarketInfo(Symbol(),MODE_SPREAD);

         if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
            Print("スプレッド拡大中(",spread,"ポイント) → クローズ待機中 ticket=",ticket," リトライ=",retry+1);
            Sleep(2000);
            continue;
         }

         if(type == OP_BUY){
            closePrice = Bid;
            clr = clrBlue;
         }else{
            closePrice = Ask;
            clr = clrRed;
         }

         closePrice = NormalizeDouble(closePrice,Digits);
         ResetLastError();

         result = OrderClose(ticket,lots,closePrice,20,clr);

         if(result){
            Print("クローズ成功! チケットNo=",ticket," ロット=",lots," クローズ価格=",closePrice," スプレッド=",spread,"ポイント");
            break;
         }

         int err = GetLastError();
         Print("クローズ失敗 ticket=",ticket," エラーNo=",err," リトライ=",retry+1);
         Sleep(2000);
      }

      if(!result) allSuccess = false;
   }

   return allSuccess;
}
スポンサーリンク

MT4のiCustom()関数で平均足の値を取得する

平均足はMT4に標準搭載されていますが、MQL4ではカスタムインジケーターを呼び出すiCustom()を使って値を取得します。

今回の平均足Openの取得例:

double haOpen1 = iCustom(NULL,0,"Heiken Ashi",2,1);

平均足Closeの取得例:

double haClose1 = iCustom(NULL,0,"Heiken Ashi",3,1);

iCustom()の今回使用する引数は次の通りです。

引数今回の指定内容
symbolNULL現在のチャートの通貨ペア
timeframe0現在のチャート時間足
name“Heiken Ashi”呼び出すインジケーター名
mode2 / 3今回使用する平均足のOpen / Closeバッファ
shift1 / 21本前・2本前の確定足を取得

今回使用しているMT4標準のHeiken Ashiでは、バッファ2からOpen、バッファ3からCloseを取得しています。

バーシフト1と2を指定し、形成中の0番足ではなく、1本前・2本前の確定した平均足を比較します。

haClose > haOpenなら陽線、haClose < haOpenなら陰線として判定できます。
今回のEAでは1本前と2本前の状態を比較し、色が切り替わったタイミングを売買シグナルにしています。

平均足の色転換を判定する

BUYでは2本前が陰線、1本前が陽線であれば、陰線から陽線へ転換したと判断します。

if(haClose2 < haOpen2 && haClose1 > haOpen1){
   openBuy = true;
}

SELLは反対に、2本前が陽線、1本前が陰線であることを確認します。

if(haClose2 > haOpen2 && haClose1 < haOpen1){
   openSell = true;
}

平均足を使った売買判定のイメージ

平均足の陽線と陰線を使ったEAの売買イメージ
  • 陰線から陽線へ転換するとBUY
  • 陽線が続いている間はBUYを保有
  • 陽線から陰線へ転換するとBUYを決済
  • 同じ転換シグナルでSELLへドテン
  • 再び陰線から陽線へ転換したらSELLを決済してBUY

新規・決済注文は共通関数を使用

新規注文には、ベーステンプレートでも使用している共通のfuncOrder_Send()を利用しています。

反対方向への転換が発生した場合は、funcOrder_CloseAll()で現在の反対ポジションを決済します。

今回の平均足EAでは注文変更処理を使用しないため、個別EAのソースには実際に使用する新規注文・決済関数だけを掲載しています。

注文関数そのものの仕組みを詳しく確認したい場合は、以下の記事で解説しています。

平均足EAのパラメータ設定

今回のEAで設定できるパラメータは3項目です。

パラメータ初期値内容
Lots0.011回のエントリーで使用するロット数
TP1000利確幅(pips)
SL1000損切り幅(pips)

このEAでは、平均足が反対方向へ転換したときの決済を基本としているため、TP・SLは1000pipsと大きな初期値にしています。

学習用サンプルとして分かりやすくするためMagicNumber管理は行っていません。サンプルをそのまま試す場合は、他のEAや手動ポジションと同じ口座で併用せず、EA単独で動作確認してください。

スポンサーリンク

平均足EAのバックテスト結果

最新版の平均足EAを使い、USDJPYの4時間足でバックテストを行いました。

平均足の色転換だけを売買シグナルとし、TP・SLは公開版と同じ1000pips / 1000pipsで検証しています。

バックテスト条件

項目条件
通貨ペアUSDJPY
時間足H4
期間2024/08/23 ~ 2026/07/30
モデル始値のみ
初期証拠金1,000,000円
スプレッド5
Lots0.01
TP1000pips
SL1000pips

このEAは新しいローソク足ができたタイミングでのみ判定するため、今回は「始値のみ」で検証しています。

バックテスト結果

純益PF勝率最大DD総取引数
+9,262.72円1.0639.06%23,571.35円
(2.34%)
727回
MT4平均足EAをUSDJPY H4で検証したバックテストレポート
最新版平均足EAのバックテストレポート

テスター設定のスプレッドは5、不整合チャートエラーは0でした。

今回の条件では、純益9,262.72円、PF1.06、勝率39.06%、最大ドローダウン2.34%となりました。

SELLは364回、BUYは363回となっており、平均足の転換に合わせてBUYとSELLを切り替える意図したドテン動作も確認できています。

一方でPFは1.06にとどまっており、平均足の色転換だけでは、レンジ相場で細かなドテンを繰り返しやすいことも分かります。

この結果は掲載条件で行ったバックテスト結果です。
将来の利益を保証するものではなく、通貨ペア・期間・スプレッド・パラメータなどによって結果は変わります。

平均足EAの弱点と改良ポイント

レンジ相場ではドテンが増えやすい

平均足はトレンド方向を視覚的に確認しやすい一方、方向感のない相場では陽線・陰線が短期間で切り替わり、売買回数が増えることがあります。

今回のEAは平均足の転換だけを条件としているため、レンジ相場を除外する仕組みは入れていません。

トレンドフィルターを追加する

改良する場合は、次のような条件を組み合わせる方法があります。

  • 長期移動平均線でBUY・SELL方向を限定する
  • ADXで一定以上のトレンドがある場面だけ取引する
  • 平均足の実体やヒゲの形を条件に加える
  • 上位時間足の平均足と同じ方向だけエントリーする
  • 連続損失後に一定本数エントリーを停止する

条件を追加すれば必ず成績が改善するわけではありません。ロジックを変更した場合は、バックテストで結果を比較してください。

トレンドの強さを判定する発展例として、ADXを使ったEAも公開しています。

ADXを使ったEAサンプルを見る

平均足EAのよくある質問

Q. 平均足はMT4に標準搭載されていますか?

はい。MT4では「Heiken Ashi」という名前で標準搭載されています。「挿入」→「インディケータ」→「カスタム」→「Heiken Ashi」からチャートへ表示できます。

Q. EAから平均足の値を取得できますか?

はい。本記事ではMQL4のiCustom()を使い、MT4標準の「Heiken Ashi」から平均足のOpenとCloseを取得しています。

Q. なぜ1本前と2本前の確定足を使うのですか?

形成中の平均足は値が変化するためです。今回のEAではshift=1とshift=2を使い、確定した2本の平均足から色の転換を判定しています。

Q. TPとSLを1000pipsにしているのはなぜですか?

今回のEAでは、平均足が反対方向へ転換したときの決済を基本としているためです。TP・SLは安全用として大きな値を設定しています。

Q. なぜMagicNumberを使っていないのですか?

平均足の取得や色転換、ドテン処理を理解しやすくするためです。そのまま利用する場合は、他のEAや手動ポジションと同じ口座で併用せず、EA単独での検証を推奨しています。

まとめ|iCustom()を使って平均足EAを作れる

今回の平均足EAでは、MT4 EAベーステンプレートを土台に、iCustom()を使った平均足の取得と色転換による売買条件を追加しました。

  • MT4では「Heiken Ashi」として標準搭載
  • iCustom()で1本前・2本前の平均足を取得
  • 陰線→陽線でBUY、陽線→陰線でSELL
  • 反対転換時に現在ポジションを決済
  • 同じシグナルで反対方向へドテン
  • 個別EAでは実際に使用する共通関数だけを掲載
  • ベーステンプレートからの変更箇所をコード内の背景色で確認可能

ベーステンプレートと今回の平均足版を見比べることで、共通部分を残したまま、インジケーター固有の取得処理・売買条件・決済処理を追加する流れを確認できます。

他の売買ロジックも試したい場合は、EAサンプルコード一覧から移動平均線・RSI・MACD・ボリンジャーバンドなどの実装例を確認できます。

コメント

  1. ミナミ ケンイチさんのアイコン ミナミ ケンイチ より:

    このサンプルコードで勉強しています。

    コード内で
    「 //同一方向」の内容で質問があります。
    このコードが記載されていないと、どんな不具合がありますか?
    最終的に
    OrderPtn=0;としているので注文を出さないようにしている事は理解しました

    • りょうさんのアイコン りょう より:

      はじめましてミナミ ケンイチさん。返信が遅れてしまってスミマセン。
      「 //同一方向」の内容については、1つ前のトレード結果をみてロングで損失が発生している場合、再度すぐにロング注文しようとしたら注文を取り消すような仕組みです。ショートも同じ感じです。要は前回負けた場合、すぐに同一方向にまたすぐにエントリーしようとする行為を制限しています。
      なので、記載していなくても動きますが負け続ける事が結構出てくると思います。1度消した状態でバックテストで見てみても面白いと思います!

  2. 藤真一さんのアイコン 藤真一 より:

    こんにちは。EA初心者です。
    勉強させていただこうと思い、サンプルコードをそのままコピーさせていただきコンパイルしてストラテジーテスターにかけましたが、まったくポジションをとりません。
    サンプルコードのままでは動かないのでしょうか?

    • りょうさんのアイコン りょう より:

      はじめまして、管理人のりょうです。

      スプレッドが1銭未満でしか新規注文しない設定にしているので、そこで引っかかってる可能性が高いです。
      A_SPREADの設定を10→30等に変更する。又は、ストラテジーテスターのスプレッド値を10未満にして頂きもう1度お試し頂けないでしょうか。

      • 藤真一さんのアイコン 藤真一 より:

        ご返信ありがとうございます。
        スプレッドを変更してみましたが、やはりポジションをとりませんでした。
        通貨ペアや時間足に指定はないですよね?
        他に何か原因は考えられますでしょうか?
        お手数ですが宜しくお願いいたします。

        • りょうさんのアイコン りょう より:

          通化ペアや時間足に指定は無いです。

          テスターの操作履歴に何かエラーが出たりしていませんか?正常に動く場合、足が更新されるごとに以下のようなログが出ています。

          2021.12.03 21:03:37.964 2020.01.02 18:30:00 test EURUSD,M15: a=1.1189 b=1.1182 c=1.1189 d=1.1185 e=0

          • 藤真一さんのアイコン 藤真一 より:

            こんばんは。
            ストラテジーテスターの操作履歴の内容が違いますね。。

            エキスパート設定でA_SPREADを50に設定、
            ユーロドル M15、スプレッド5、開始日2021.11.10 終了日2021.12.03 でテストしたところ操作履歴には下記3行が記載されました。

            2021.12.04 01:15:50.125 EURUSD,M15: 1078927 tick events (1632 bars, 1079600 bar states) processed in 0:00:19.047 (total time 0:00:23.156)
            2021.12.04 01:15:31.071 2021.11.10 00:00:00 Heikin_moto inputs: A_SPREAD=50; Lots=0.01;
            2021.12.04 01:15:28.983 TestGenerator: spread set to 5

          • りょうさんのアイコン りょう より:

            こんばんは。
            ご回答有難うございます。中々難しいですね。
            もう少しお聞きしたい事があります。面倒そうならスルーして下さい。

            ①他のEAは動作しているか
            ②テスト時のモデルを始値のみにしても事象は同じか
            ③MT4内に「Heiken Ashi」というインジケータは存在するか
            ④テスト時のモデルを全ティックにしている場合、1分足と15分足のヒストリカルデータは存在するか
            ⑤お使いのMT4が結構古い4年以上前とかのものではないか

            ここら辺を見て頂くと原因がわかるかもしれません。
            こういう事象は初めてなので、良ければ今後の参考にさせて頂ければと思います!

  3. 藤真一さんのアイコン 藤真一 より:

    遅くなり申し訳ありません。下記ご確認ください。

    ①他のEAは動作します。
    ②始値のみにしても事象は同じです。
    ③Heiken Ashiは存在します。
    ④1分足と15分足のヒストリカルデータは存在します。
    ⑤MT4のバージョンは、Version build 1350 です。

    2台のPC、複数のMT4でテストしても結果は同じでした。。

    • りょうさんのアイコン りょう より:

      返信遅れてしまいすみません。
      うーん、見たところ問題無いですね。
      以下のようにソースコードにPrintを入れて実行して、操作履歴で確認してみるとどんな感じになるとかってわかりますか?

      //—
      //新しい足ができた時だけやる
      Print(“1”);
      if(Time[0] != prevtime){
      prevtime = Time[0];
      }else{
      Print(“2:” + Time[0]);
      return(0);
      }
      Print(“3”);
      //平均足の戻り値確認用(※削除可能スペース)

      • 藤真一さんのアイコン 藤真一 より:

        すみません!別のMT4のメタエディターで作業をしたら問題なく動きました。
        原因はわかりませんが・・。

        お騒がせして申し訳ありませんでした。本当に申し訳ありませんでした。
        今後ともよろしくお願いいたします。

タイトルとURLをコピーしました