
MT5 MT5 実行時エラー
4807
- 定数名
ERR_INDICATOR_WRONG_HANDLE- 意味
- インジケーターのハンドルが不正
MT5エラー4807とは
CopyBuffer() などに、無効なインジケーターハンドルを渡したときのエラーです。ハンドルの作成(iCustom など)に失敗して INVALID_HANDLE が入っているか、IndicatorRelease() で解放済みのハンドルを使っています。
ログの表示例
CopyBuffer failed, error 4807
「エキスパート」タブまたは「操作履歴」タブに表示されます。数値や表記の細部は、ビルド・ブローカー・EAの作りによって異なります。
MT5エラー4807の主な原因
- iCustom() / iMA() などが失敗して INVALID_HANDLE(-1)が返ったのに、確認せずに使っている
- ハンドルを作らずに(初期値 0 のまま)CopyBuffer() している
- IndicatorRelease() で解放したハンドルを使っている
- MQL4 の感覚で、iMA() の戻り値を「値」として使っている
MT5エラー4807の対処法
- ハンドルは OnInit() で1回だけ作り、INVALID_HANDLE なら INIT_FAILED を返す
- 値は CopyBuffer(ハンドル, バッファ番号, 開始位置, 本数, 配列) で取り出す
- 毎ティック iMA() を呼び直さない(ハンドルが増え続ける)
コード例(MQL5)
// インジケーターのハンドルは OnInit で1回だけ作る(4802・4806・4807 対策)(MQL5)
input string InpIndicator = "Examples\\MACD"; // MQL5\Indicators からの相対パス(拡張子なし)
int hMA = INVALID_HANDLE;
int hInd = INVALID_HANDLE;
int OnInit()
{
hMA = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
hInd = iCustom(_Symbol, _Period, InpIndicator);
if(hMA == INVALID_HANDLE || hInd == INVALID_HANDLE)
{
Print("インジケーターを作成できません error=", GetLastError()); // 4802 など
return INIT_FAILED;
}
return INIT_SUCCEEDED;
}
bool GetMA(int shift, double &value)
{
if(BarsCalculated(hMA) < shift + 1) return false; // まだ計算中(4806 を防ぐ)
double buf[];
if(CopyBuffer(hMA, 0, shift, 1, buf) != 1)
{
Print("CopyBuffer error ", GetLastError());
return false;
}
value = buf[0];
return true;
}
void OnDeinit(const int reason)
{
if(hMA != INVALID_HANDLE) IndicatorRelease(hMA);
if(hInd != INVALID_HANDLE) IndicatorRelease(hInd);
}MetaEditor(MT5)でコンパイルできることを確認済みです。自分のEAに組み込むときは、変数名や設定値を合わせてください。












