EAが動かない原因と対処法 一覧[MT4/MT5]

公開日: : 初心者EA自作 ,

「EAが動かな~い」というときには様々な原因と可能性がありますが、そんな時は一個一個原因を解消していかないといけません。今回は利用者によくある原因と、プログラマがやりがちなデバッグミスについてご紹介します。

トレーダーが原因のもの

MT4の自動売買が許可されていない

MT4の上部のタブの「自動売買」が赤くなっていたら、これが原因です。EAの自動売買の許可には、EAベースのものとMT4ベースのものがあります。

こちらはMT4全体で自動売買を許可/不許可にする設定です。

forex-mt4-mt5-ea

forex-mt4-mt5-ea

 

EAの自動売買がMT4で許可されていない

EAをチャートにセットした際に「EAに自動売買を許可する」というチェックボックスがあるのですが、それが外れているとトレードが始まりません。

これはMT4上のEAそれぞれに設定が必要です。

forex-mt4-mt5-ea

チャート右上のニコちゃんマークが笑っていなかったら、これが原因です。

 

ログイン状態が切れている

MT4の右下がInvalid Accountとか回線不通になっている場合は、そもそもログインできていないのでトレードできません。MT4に慣れている人がうっかりミスるタイプのやつです。

FX業者にアカウントを確認するか、ネット通信が切れていないか確認しましょう。

forex-mt4-mt5-ea

forex-mt4-mt5-ea

この場合の原因は以下の通りです。

  • ログイン情報が間違っている(だいたいこれ)
  • ネットに繋がっていない
  • 口座が無効化されている
  • VPS上に設置している場合、VPSからFX会社へ通信できていない(越境の場合)
  • FX会社のMT4サーバーに変更があった(サーバー名が変わった)
  • FX会社のサーバーがダウンしている

 

 

トレード資金が足りてない

自動売買プログラムが一度もトレードしない場合、考えられる原因として資金不足があります。Not Enough Moneyってやつです。ライブ口座なら資金を入れるかロットを下げましょう。

デモ口座なら新しく口座を作り直すか、資金を入れましょう。

forex-mt4-mt5-ea

MT4のターミナルの操作ログにこのエラーが表示されます。

 

トレードできない通貨ペアにセットしている

FX業者によってはUSDJPYとUSDJPY.のように同じ通貨ペアを二通りの表記で表している場合があります。この場合、どちらかの通貨ペアチャートではトレードできますが、もう片方の通貨ペアチャートではトレードできないことが多いです。

別の口座タイプの通貨ペアチャートにEAをセットしている場合も同様です。

 

また、CFD口座でFXチャートを表示させた場合も、FXがそもそもトレードできないこともあります。

forex-mt4-mt5-ea

この場合は、気配値表示の上で右クリックを押して、「すべて表示」を押してください。すべての通貨ペアが表示されます。

手動で最小ロットでトレードしてみて、ちゃんとオーダーが通れば問題ありませんが、手動でも注文が通らない場合はこれが原因です。

 

注文できない時間帯である

FXの場合は土日はトレードできません。また、株や先物の場合もトレードできる時間帯に制限がある場合がほとんどです。チャートが動いていてもトレードが許可されていない時間帯の場合はトレードできません。

 

ビットコインに関しては、土日にトレードできる業者とトレードできない業者があります。

「気配値」表示の通貨ペア(シンボル)一覧で右クリックをすると「Specification・仕様」があります。

取引可能時間帯はそこで確認可能です。

forex-mt4-mt5-ea

 

ティックが来ていない

相場が閉まっている時間帯以外でも相場が動いていない場合もあります。EAはティック(新しいレート更新)があったタイミングで演算されるため、ティックが来ないとEAは動きません。特にレンジ相場などでは数分~数十分ティックがない場合もあります。

ティックが来ているかどうかは、チャートの価格に動きがあるかどうかで分かります。

 

ティック更新の最大の時間間隔を調べるEA

EAというのはどうしても演算をティック到達に依存しているので、ティックが長時間到達しないというのは意図しないバグに繋がります。

 

コピートレードシステムとかは特に顕著な例で、ティック更新がないせいで不具合を起こす可能性があります。

もちろん、ループ文で一時的に強制的に演算させることもできますが、長時間ループさせるとフリーズの原因になったり、メモリを圧迫し続けてしまうので、”ここぞ”というときに短時間しか使えません。

 

今回はそういった背景をもとに、”そもそもそのFX業者ではどれくらいティックが来ない時間があるの?”というのを調べるツール(EA)を作ります。

 

といっても、コード全体はこれだけです。これをコピペしてコンパイルすれば、チャート左上にティックが来なかった最大時間(秒)が表示されます。

 

EAを再起動したり、時間枠を変更すると、リセットされるので注意してください。

 

 

最小ロット未満のロットにしている

多くのFX会社は最小ロットが0.01ですが、大口向けのFX会社では0.1の場合もあります。(TradeViewのECN口座とか)

その場合は、0.01~0.09までの取引ロットでは約定拒否になります。また、仮想通貨の場合は0.3ロットからという特異なケースもあるので、確認が必要です。

気配値表示の通貨ペアを右クリックすると、最小ロットなどの詳細を表示することができるので、それで確認してみてください。

 

EAのスプレッドフィルター機能がかかっている

EAの中には「指定のスプレッド以上のときにはエントリーしない」というフィルターを設けているEAがあります。その場合には、スプレッドが広い業者では一切稼働しない可能性があります。

また、もともと低スプレッドの環境下でしか勝てないEAの場合は、負けるようなスプレッドの場合は動作しないように内部で組み込んでいる場合もあります。

 

MT4の”本当の”スプレッドを表示する(チェックソフト配布)

トレードでは基本的にスプレッドが手数料として上乗せされています。通常であればBid=Close(終値)で、そこにスプレッド分上乗せしたレートをAskレートとして表示されています。

デフォルトのMT4では通常レートしか表示されず、Askラインを見るにはプロパティからAskラインを表示しなければ見れません。

bandicam 2015-06-11 13-59-49-449
bandicam 2015-06-11 14-33-32-124

Askラインを表示させれば、現在自分が取ろうとしている値幅に対してスプレッドがどの程度なのかを事前に確認することができます。

 

Bidが現在レートよりも低い

しかし一部のFX業者はBid=Close(現在のレート)とせずに、Bidを現在レートよりも下に設定していることがあります。

この場合、気配値表示からかEAやインジケーターにスプレッドを表示させるかの方法を取らないと、現在のスプレッドがどれくらいなのかを知る方法はありません。

下の画像の場合、
現在レート:123.226
なのに対し、
Bid:123.215
となっています。

bandicam 2015-06-11 14-20-03-925

MT4を利用しているユーザーはチャートを優先するため、気配値を非表示にしていることが多いように思います。その場合、知らない間にスプレッドが押し広げられている可能性があります。

現在利用しているMT4のスプレッドが「現在レートからスプレッドを上乗せしているのか」、「Bidを現在レートよりも下げているのか」を調べるための簡単なインジケーターを作りました。

 

 

このインジケーターを実行させると左上に
Spread from MarketInfo
Ask – Bid
Ask – iClose
Ask – Close[0]
と表示されます。

これは4つの方法で現在のスプレッドを算出したものです。本来はこの横に出る数値が同一になります。もしこれらの数値に差がある場合には、Bidが現在レートよりも下に設定されていると考えて間違いありません。

bandicam 2015-06-11 14-07-09-772

 

口座のストップレベルが広い

現在レートから近い値に予約注文(指値注文、逆指値注文)を出すタイプのEAはよくありますが、このタイプのEAの場合口座との相性でまったく稼働しないことがあります。

ストップレベルというのは、予約注文を出す際に現在レートから●●pips以上離れたレートでないと注文を受け付けないというレベルを表したものです。

ストップレベルが0の業者もあれば、10pips以上離さないと予約注文を受理してくれない業者もあるので、確認が必要です。

確認方法は、気配値表示の通貨ペアを右クリックすると詳細の中に表示されています。

 

VPSがトレード用じゃない&通信環境が悪い

トレード用のVPSの場合は問題ないですが、それ以外のVPSの場合は「ちょっとくらい回線落ちてもそこまで問題ないよね」ってスタンスのところもあるので、エントリータイミングと回線が落ちているタイミングがバッティングすると、エントリーされないことがあります。

FX業者の無料VPSを使うとか、MetaQuotesのVPS(お試し期間あり)を使うとかすると良いと思います。

ターミナルのジャーナルにログインを繰り返した履歴があればこれです。

 

また、集合住宅のネット回線を利用している方は、実は不定期でネットが切断していることがあります。特に夕方~深夜帯。

この時間帯は為替が活発に動き出すヨーロッパ時間帯、ニューヨーク時間帯で、そのタイミングでオーダー条件が整っても上手く稼働しないケースがあります。

 

VPS/パソコンのメモリがいっぱい&フリーズしてる

MT4を同時に大量に起動しているとか、他に重たいソフトを起動しているとか、EAが滅茶苦茶重いとかでなければ、最近のPCでは起こりにくいと思います。

エラーは出ないので、Akabeiメモリチェッカーのような表示ソフトを入れてチェックしてみると良いと思います。

 


プログラマが原因のもの

注文レートの少数桁数がおかしい

現在ではすべてのFX業者が少数第3桁&5桁のレートを提供していますが、かつては2桁&4桁のFX業者も混在している時代がありました。

USDJPY:110.111で発注すれば問題ないところに、USDJPY:110.1111で発注してしまうためにエラーが発生しているような状態です。

エラー番号は130

NormalizeDoubleとDigitsで桁を丸めましょう。

セットしているチャート以外のシンボルをトレードする場合は、Digitsの代わりにMarketInfo(“シンボル名”,MODE_DIGITS)を使いましょう。

 

EAの利用者側ができることはありません。

 

ロットの単位の不備(少数桁数とか)

多くのFX業者は0.01~100ロットを受け付ける業者が多いので、それ以外の数値(0.011とか)はエラーになります。

少数第三桁に数値が入っている場合はもちろんですが、仮想通貨や商品先物や株式CFDなど為替以外のチャートの場合にはロットの最小ロットなどが変わったりするので、出やすいエラーです。

プログラマはエラーになるようなロットを修正するプログラムを書くべきですが…(そこまで頭が回ってないときもあるよね)

このエラーが出た場合、ユーザー側ができることはありません。開発者に相談しましょう。

 

通貨ペアのあとにサフィックスがある

USDJPY.やUSDJPY_mなどのように通貨ペアのあとに文字列がついているFX業者の場合、動かなくなるEAがあります。

これは開発者の想定不足が原因ですが、トレードする通貨ペアを指定するタイプのEAだと起こりやすい現象です。(通貨相関システムとか通貨強度システムとか)

 

通貨ペアの後ろにサフィックスがないFX業者かアカウントに変更すれば動くようになります。

 

SL/TPをOrderSendと同時に行っている

SL/TP(損切レート/利確レートの予約注文)はOrderSendの関数の引数に指定する箇所がありますが、FX業者によってはOrderModifyでSLTP指定しないとエラーになるところがあります。(最近はあまり見かけませんが…)

 

昔はよくある話だったので、OrderSendでSLTPを0指定しておいて直後にOrderModifyする文化がありましたが、最近は見かけないのでそういうFX業者自体が減ってきているのかもしれませんね。

エラー文にはInvalid StopLossとかって表示されると思います。

対処法としては、OrderModifyでSLTPしましょう、ってことだけです。

 


FX業者が原因のもの

FX業者による約定拒否

こればっかりはどうしようもありません。レートが急激に変動している場合に起こりやすいです。何にも悪くてなくてもFX業者がオーダーを拒否しているということなので、諦めましょう。

ターミナルのジャーナルにエラー(requote)が表示されます。

めっちゃ儲かっている場合、大量オーダーしている場合は拒否されるかもしれません。

 

FX業者のストップレベルが大きい

現在レート近くに予約注文を出すEAの場合、ストップレベルが大きいFX業者だと(XMとか)、オーダーが通らないことがあります。

ストップレベルとは、予約注文を発注する際の現在レートからの最小幅のことです。

要するに、現在レートから近すぎるレートには予約注文が出せないように制限がかかっているってことです。

ストップレベルが小さいFX業者に移れば動くと思います。

 

スリッページを超えたスリップ

レート変動が激しい場合は、EAが内部で指定したスリッページ(最大許容スリップ)を超えてしまう場合があります。大抵は3point~30pointに設定しているEAが多いので、エントリータイミングなのにエントリーしなかったら、これが原因の可能性があります。

スリッページを変更できるEAの場合は少し広めに設定しなおしてみてください。

また、この場合エラー表示はないので、これが原因であると特定するのが困難ですが、確率としては比較的高い部類の原因です。

 

FX業者の一時的サーバーダウン

あんまりこの業界では聞いたことないですね。(隠したり、なかったことにしますからね) ただ、稀にMT4が回線不通になったりログインとログアウトを繰り返すのはこれが原因の可能性があります。

通信ができていない場合、ユーザー側のネットワークに不備があるか、FX業者側に不備があるか、どちらかになりますが、

FX業者以外にアクセスできている場合は、FX業者が原因だと考えられます。

 

MT4のエラー一覧

検索すればいくらでも出てくるんですけどね、一応…

定数 説明
ERR_NO_ERROR 0 エラーなし
ERR_NO_RESULT 1 エラーは無いが、結果は未知
ERR_COMMON_ERROR 2 共通エラー
ERR_INVALID_TRADE_PARAMETERS 3 無効なトレード変数
ERR_SERVER_BUSY 4 トレードサーバーがビジー状態
ERR_OLD_VERSION 5 クライアント端末が古いバージョン
ERR_NO_CONNECTION 6 トレードサーバーと接続できない
ERR_NOT_ENOUGH_RIGHTS 7 権限が無い
ERR_TOO_FREQUENT_REQUESTS 8 要求が多すぎる
ERR_MALFUNCTIONAL_TRADE 9 不適合な関数によってトレードがなされた
ERR_ACCOUNT_DISABLED 64 アカウント無効化
ERR_INVALID_ACCOUNT 65 無効なアカウント
ERR_TRADE_TIMEOUT 128 トレード時間切れ
ERR_INVALID_PRICE 129 無効な価格値
ERR_INVALID_STOPS 130 無効なストップ値
ERR_INVALID_TRADE_VOLUME 131 無効なロット数
ERR_MARKET_CLOSED 132 市場が閉じている
ERR_TRADE_DISABLED 133 トレード無効化
ERR_NOT_ENOUGH_MONEY 134 資金不足
ERR_PRICE_CHANGED 135 価格値変更
ERR_OFF_QUOTES 136 相場価格から離れている
ERR_BROKER_BUSY 137 仲介側がビジー状態
ERR_REQUOTE 138 再見積り
ERR_ORDER_LOCKED 139 注文がロックされた
ERR_LONG_POSITIONS_ONLY_ALLOWED 140 買いポジションだけ有効
ERR_TOO_MANY_REQUESTS 141 要求が多すぎる
ERR_TRADE_MODIFY_DENIED 145 市場が閉じている為、変更できない
ERR_TRADE_CONTEXT_BUSY 146 トレード状況がビジー状態
ERR_TRADE_EXPIRATION_DENIED 147 仲介側の契約が終了している
ERR_TRADE_TOO_MANY_ORDERS 148 オーダー数が仲介側の限度を超えている

MQL4の実行エラー

定数 説明
ERR_NO_MQLERROR 4000 エラーなし
ERR_WRONG_FUNCTION_POINTER 4001 不正な関数ポインタ
ERR_ARRAY_INDEX_OUT_OF_RANGE 4002 配列のサイズを超えたインデックス
ERR_NO_MEMORY_FOR_CALL_STACK 4003 関数呼び出しのスタックメモリが無い
ERR_RECURSIVE_STACK_OVERFLOW 4004 再帰的スタックオーバーフロー
ERR_NOT_ENOUGH_STACK_FOR_PARAM 4005 変数のためのスタックメモリが十分ではない
ERR_NO_MEMORY_FOR_PARAM_STRING 4006 文字列変数のメモリが無い
ERR_NO_MEMORY_FOR_TEMP_STRING 4007 一時文字列のメモリが無い
ERR_NOT_INITIALIZED_STRING 4008 初期化されていない文字列
ERR_NOT_INITIALIZED_ARRAYSTRING 4009 配列中の初期化されていない文字列
ERR_NO_MEMORY_FOR_ARRAYSTRING 4010 文字列配列用のメモリが無い
ERR_TOO_LONG_STRING 4011 長すぎる文字列
ERR_REMAINDER_FROM_ZERO_DIVIDE 4012 0で割った余り
ERR_ZERO_DIVIDE 4013 0での除算
ERR_UNKNOWN_COMMAND 4014 未知の命令
ERR_WRONG_JUMP 4015 不正な変化 (エラーは生成されていない)
ERR_NOT_INITIALIZED_ARRAY 4016 配列が初期化されていない
ERR_DLL_CALLS_NOT_ALLOWED 4017 DLLの呼び出しが許可されていない
ERR_CANNOT_LOAD_LIBRARY 4018 ライブラリが読み込めない
ERR_CANNOT_CALL_FUNCTION 4019 関数が呼び出せない
ERR_EXTERNAL_CALLS_NOT_ALLOWED 4020 エキスパート関数の呼び出しが許可されていない
ERR_NO_MEMORY_FOR_RETURNED_STR 4021 関数からの返り値である一時文字列用のメモリが不足している
ERR_SYSTEM_BUSY 4022 システムがビジー状態 (エラーは生成されていない)
ERR_INVALID_FUNCTION_PARAMSCNT 4050 関数への引数が無効と見なされた
ERR_INVALID_FUNCTION_PARAMVALUE 4051 関数への引数値が無効
ERR_STRING_FUNCTION_INTERNAL 4052 文字列関数の内部エラー
ERR_SOME_ARRAY_ERROR 4053 エラーのある配列がある
ERR_INCORRECT_SERIESARRAY_USING 4054 正しくない系統配列が使われている
ERR_CUSTOM_INDICATOR_ERROR 4055 カスタムインジケーターエラー
ERR_INCOMPATIBLE_ARRAYS 4056 配列の相互性がない
ERR_GLOBAL_VARIABLES_PROCESSING 4057 グローバル変数の処理エラー
ERR_GLOBAL_VARIABLE_NOT_FOUND 4058 グローバル変数が見つからない
ERR_FUNC_NOT_ALLOWED_IN_TESTING 4059 テストモードで使えない関数を使った
ERR_FUNCTION_NOT_CONFIRMED 4060 関数が確認できない
ERR_SEND_MAIL_ERROR 4061 メール送信エラー
ERR_STRING_PARAMETER_EXPECTED 4062 文字列変数を要求している
ERR_INTEGER_PARAMETER_EXPECTED 4063 整数変数を要求している
ERR_DOUBLE_PARAMETER_EXPECTED 4064 浮動小数変数を要求している
ERR_ARRAY_AS_PARAMETER_EXPECTED 4065 配列型変数を要求している
ERR_HISTORY_WILL_UPDATED 4066 更新状態から過去データを要求された
ERR_TRADE_ERROR 4067 トレード関数においてエラーが生じた
ERR_END_OF_FILE 4099 ファイルの終端
ERR_SOME_FILE_ERROR 4100 ファイルエラーがある
ERR_WRONG_FILE_NAME 4101 不正なファイル名
ERR_TOO_MANY_OPENED_FILES 4102 ファイルを開きすぎ
ERR_CANNOT_OPEN_FILE 4103 ファイルが開けない
ERR_INCOMPATIBLE_FILEACCESS 4104 ファイルアクセスに相互性がない
ERR_NO_ORDER_SELECTED 4105 注文が選択されていない
ERR_UNKNOWN_SYMBOL 4106 未知の通貨
ERR_INVALID_PRICE_PARAM 4107 不正な価格値
ERR_INVALID_TICKET 4108 不正なチケット
ERR_TRADE_NOT_ALLOWED 4109 トレードが許可されていない。エキスパートプロパティの”Allow live trading”にチェックを入れることで許可される
ERR_LONGS_NOT_ALLOWED 4110 買い注文が許可されていない。エキスパートプロパティをチェック
ERR_SHORTS_NOT_ALLOWED 4111 売り注文が許可されていない。エキスパートプロパティをチェック
ERR_OBJECT_ALREADY_EXISTS 4200 オブジェクトが既に有る
ERR_UNKNOWN_OBJECT_PROPERTY 4201 未知のオブジェクトプロパティ
ERR_OBJECT_DOES_NOT_EXIST 4202 オブジェクトが存在しない
ERR_UNKNOWN_OBJECT_TYPE 4203 未知のオブジェクト型
ERR_NO_OBJECT_NAME 4204 オブジェクト名がない
ERR_OBJECT_COORDINATES_ERROR 4205 オブジェクトの座標エラー
ERR_NO_SPECIFIED_SUBWINDOW 4206 指定されたウィンドウが無い
ERR_SOME_OBJECT_ERROR 4207 オブジェクト関数内でエラーが起きた

 

 

この投稿は役に立ちましたか? 役に立った 役に立たなかった 11 人中 9 人がこの 投稿 は役に立ったと言っています。

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

日経アメリカ株式市場アービトラージ プログラミングで説検証

よく「日本の株式市場は前日のニューヨーク市場の後追いをする」と言われています。実際に裁量トレードする

記事を読む

とある両建てロジックのEA検証(コードあり)

今回はちょっとしたシンプルな実験を行います。 お題は両建てです。 ポジションが0の場合SLTP付

記事を読む

(MQL4)初めてのEA自作のための教科書~実用編~[EA自作]

実用に向けたEAのコーディングについて説明します。本当に1からEAの開発について知りたい方はこちら。

記事を読む

no image

プログラマ向け自動売買開発アイディア

「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比

記事を読む

入門者のEA自作のための作り方講座(MQL4/MT4)

プログラミング初心者の方が初めてでもEAを開発できるように解説したページです。このページの内容をマス

記事を読む

 

Translate »
上に戻る