EAが動かない原因と対処法 一覧[MT4/MT5]
目次/もくじ
「EAが動かな~い」というときには様々な原因と可能性がありますが、そんな時は一個一個原因を解消していかないといけません。今回は利用者によくある原因と、プログラマがやりがちなデバッグミスについてご紹介します。
トレーダーが原因のもの
MT4の自動売買が許可されていない
MT4の上部のタブの「自動売買」が赤くなっていたら、これが原因です。EAの自動売買の許可には、EAベースのものとMT4ベースのものがあります。
こちらはMT4全体で自動売買を許可/不許可にする設定です。
↓
EAの自動売買がMT4で許可されていない
EAをチャートにセットした際に「EAに自動売買を許可する」というチェックボックスがあるのですが、それが外れているとトレードが始まりません。
これはMT4上のEAそれぞれに設定が必要です。
チャート右上のニコちゃんマークが笑っていなかったら、これが原因です。
ログイン状態が切れている
MT4の右下がInvalid Accountとか回線不通になっている場合は、そもそもログインできていないのでトレードできません。MT4に慣れている人がうっかりミスるタイプのやつです。
FX業者にアカウントを確認するか、ネット通信が切れていないか確認しましょう。
↓
この場合の原因は以下の通りです。
- ログイン情報が間違っている(だいたいこれ)
- ネットに繋がっていない
- 口座が無効化されている
- VPS上に設置している場合、VPSからFX会社へ通信できていない(越境の場合)
- FX会社のMT4サーバーに変更があった(サーバー名が変わった)
- FX会社のサーバーがダウンしている
トレード資金が足りてない
自動売買プログラムが一度もトレードしない場合、考えられる原因として資金不足があります。Not Enough Moneyってやつです。ライブ口座なら資金を入れるかロットを下げましょう。
デモ口座なら新しく口座を作り直すか、資金を入れましょう。
MT4のターミナルの操作ログにこのエラーが表示されます。
トレードできない通貨ペアにセットしている
FX業者によってはUSDJPYとUSDJPY.のように同じ通貨ペアを二通りの表記で表している場合があります。この場合、どちらかの通貨ペアチャートではトレードできますが、もう片方の通貨ペアチャートではトレードできないことが多いです。
別の口座タイプの通貨ペアチャートにEAをセットしている場合も同様です。
また、CFD口座でFXチャートを表示させた場合も、FXがそもそもトレードできないこともあります。
この場合は、気配値表示の上で右クリックを押して、「すべて表示」を押してください。すべての通貨ペアが表示されます。
手動で最小ロットでトレードしてみて、ちゃんとオーダーが通れば問題ありませんが、手動でも注文が通らない場合はこれが原因です。
注文できない時間帯である
FXの場合は土日はトレードできません。また、株や先物の場合もトレードできる時間帯に制限がある場合がほとんどです。チャートが動いていてもトレードが許可されていない時間帯の場合はトレードできません。
ビットコインに関しては、土日にトレードできる業者とトレードできない業者があります。
「気配値」表示の通貨ペア(シンボル)一覧で右クリックをすると「Specification・仕様」があります。
取引可能時間帯はそこで確認可能です。
ティックが来ていない
相場が閉まっている時間帯以外でも相場が動いていない場合もあります。EAはティック(新しいレート更新)があったタイミングで演算されるため、ティックが来ないとEAは動きません。特にレンジ相場などでは数分~数十分ティックがない場合もあります。
ティックが来ているかどうかは、チャートの価格に動きがあるかどうかで分かります。
ティック更新の最大の時間間隔を調べるEA
EAというのはどうしても演算をティック到達に依存しているので、ティックが長時間到達しないというのは意図しないバグに繋がります。
コピートレードシステムとかは特に顕著な例で、ティック更新がないせいで不具合を起こす可能性があります。
もちろん、ループ文で一時的に強制的に演算させることもできますが、長時間ループさせるとフリーズの原因になったり、メモリを圧迫し続けてしまうので、”ここぞ”というときに短時間しか使えません。
今回はそういった背景をもとに、”そもそもそのFX業者ではどれくらいティックが来ない時間があるの?”というのを調べるツール(EA)を作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static datetime LastTickTime; static int MaxTickInterval; void OnTick() { //--- if( LastTickTime != 0 ) { if( TimeCurrent() - LastTickTime > MaxTickInterval ) { MaxTickInterval = TimeCurrent() - LastTickTime; } } LastTickTime = TimeCurrent(); Comment("MaxTickInterval is "+IntegerToString(MaxTickInterval)+"(s)"); } |
といっても、コード全体はこれだけです。これをコピペしてコンパイルすれば、チャート左上にティックが来なかった最大時間(秒)が表示されます。
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ラインを表示しなければ見れません。
Askラインを表示させれば、現在自分が取ろうとしている値幅に対してスプレッドがどの程度なのかを事前に確認することができます。
Bidが現在レートよりも低い
しかし一部のFX業者はBid=Close(現在のレート)とせずに、Bidを現在レートよりも下に設定していることがあります。
この場合、気配値表示からかEAやインジケーターにスプレッドを表示させるかの方法を取らないと、現在のスプレッドがどれくらいなのかを知る方法はありません。
下の画像の場合、
現在レート:123.226
なのに対し、
Bid:123.215
となっています。
MT4を利用しているユーザーはチャートを優先するため、気配値を非表示にしていることが多いように思います。その場合、知らない間にスプレッドが押し広げられている可能性があります。
現在利用しているMT4のスプレッドが「現在レートからスプレッドを上乗せしているのか」、「Bidを現在レートよりも下げているのか」を調べるための簡単なインジケーターを作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- Comment("Spread from MarketInfo : "+MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_POINT)+"\n"+ "Ask - Bid : "+(Ask-Bid)+"\n"+ "Ask - iClose : "+(Ask-iClose(Symbol(),Period(),0))+"\n"+ "Ask - Close[0] : "+(Ask-Close[0])+"\n"); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ |
このインジケーターを実行させると左上に
Spread from MarketInfo
Ask – Bid
Ask – iClose
Ask – Close[0]
と表示されます。
これは4つの方法で現在のスプレッドを算出したものです。本来はこの横に出る数値が同一になります。もしこれらの数値に差がある場合には、Bidが現在レートよりも下に設定されていると考えて間違いありません。
口座のストップレベルが広い
現在レートから近い値に予約注文(指値注文、逆指値注文)を出すタイプの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 | オブジェクト関数内でエラーが起きた |
- PREV
- MT4/MT5各社ソフトウェア[ダウンロード]
- NEXT
- スプレッドが狭い海外/国内FX業者一覧比較
関連記事
-
(MQL4)初めてのEA自作のための教科書~実用編~[EA自作]
実用に向けたEAのコーディングについて説明します。本当に1からEAの開発について知りたい方はこちら。
-
短いコードでも右肩上がりのグラフにできることの証明(MT4EA)非実用
バックテスト結果 ソースコードはこちら 33行あるやんけ...
-
とある両建てロジックのEA検証(コードあり)
今回はちょっとしたシンプルな実験を行います。 お題は両建てです。 ポジションが0の場合SLTP付
-
(MQL4)インジケーターをEA化するやり方[EA自作]
iCustomでZigZagをEA化する(初歩編) インジケーターとiCustom 今回はインジ
-
プログラマ向け自動売買開発アイディア
「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比