MENU

Create mql4 dev environment

mql4
目次

Why MQL4 + nvim ?

nvim 上で MT4 の EA を自作するための MQL4 開発環境を整える。
Prepare the MQL4 editing environment to create your own MT4 EA using nvim.

何しろ MQL4 + nvim に関する情報が少ないので大変。みんな MetaEditor 上でコーディングしてるのだろうか? あれは使いやすいとは言えない。nvim でコーディングしたい。
After all, it is difficult because there is little information about MQL4 + nvim. I wonder if everyone is coding on MetaEditor? I can’t say that it’s easy to use. I want to code with nvim.

Syntax highlight with tree-sitter ?

tree-sitter は MQL4 に非対応のようだ。代替案を探すと、vim-mql4 や mql4-dev が見つかった。
It seems that tree-sitter is not compatible with MQL4. I searched for alternatives and found vim-mql4 and mql4-dev.

tree-sitter ほどカラフルにはならないが、一色よりはだいぶ可読性が高まる。
It’s not as colorful as tree-sitter, but it’s much more readable than one color.

Plugin

MQL4 のためのプラグインとしては、mql4-dev のほぼ一択。シンタックスハイライト、コンパイル、スニペット、などができるらしい。
As a plugin for MQL4, mql4-dev is almost the only choice. It seems to be able to do syntax highlighting, compilation, snippets, etc.

推奨そのまま As recommended

オススメではないが、仮に、mql4-dev に書いてあるとおりにすると下記のようになる。Packer 使用。
Although it is not recommended, if you follow the instructions in mql4-dev, it will look like the following. (Using Packer):

-- MQL4
-- use { "vobornik/vim-mql4" } -- Syntax Highlighting
use { "pnetherwood/mql4-dev" }    -- Syntax, Snippets, Compiling, and so on for MQL4 (including vobornik/vim-mql4)
use { "tpope/vim-dispatch" }      -- Async compiling for mql4-dev
use { "vim-scripts/OmniCppComplete" } -- Completion for mql4-dev
vim-mql4

シンタックスハイライトをしてくれる。これだけでもすごくコーディング作業がしやすくなる。ただし、mql4-dev に含まれているようなので、インストール不要。
It does syntax highlighting. This alone will make your coding work much easier. However, it seems to be included in mql4-dev, so there is no need to install it.

mql4-dev

シンタックスハイライト、スニペット集(snipMate形式?)、コンパイルなどを行う。vim-mql4 が含まれている。
Syntax highlighting, snippet collection (snipMate format?), compilation, etc. It contains vim-mql4.

vim-dispatch

mql4-dev の非同期コンパイルで使用するプラグインらしい。まだ使っていない。古い。
It seems to be a plugin used for asynchronous compilation of mql4-dev. I don’t use it.

OmniCppComplete

mql4-dev の補完候補表示に使用するプラグインらしい。nvim-cmp で代用できる。
It seems to be a plugin used to display completion candidates for mql4-dev. You can use nvim-cmp instead.

修正版 Latest & modified for me.

先程のではだいぶ古い。近年のプラグインに合わせるとこういう感じ。
The previous one is quite old. It looks like this when matched with recent plug-ins.

use { "nvim-cmp" } -- Completion
use { "luasnip" } -- Snippets

-- MQL4
use { "pnetherwood/mql4-dev" } -- Syntax, Snippets, Compiling, and so on for MQL4 (including vobornik/vim-mql4)

nvim-cmp と luasnip の設定は、after/plugins/ フォルダの nvim-cmp.lua と luasnip.lua で行う。ここに書くこと!

Settings

あれをこうしてどうして。luasnip で読み込むようにして。

How to use & convert snippets

Where is the snippets file ?

mql4-dev の snippet のオリジナルは以下の場所にある。
The original mql4-dev snippet is available at the following location.

~/.local/share/nvim/site/pack/packer/start/mql4-dev/UltiSnips/mql4.snippets

mkdir ~/.config/nvim/snippets
cp ~/.local/share/nvim/site/pack/packer/start/mql4-dev/UltiSnips/mql4.snippets ~/.config/nvim/snippets/

~/.config/nvim/snippets を luasnip で読み込ませるように設定しておくこと。

Correct the loading error

さてこの mql4-dev が用意してくれる下記のような snippets は、luasnip では読み込みエラーになる。
Now, the following snippets prepared by mql4-dev will cause a loading error in luasnip.

// Wrong
snippet Print "Displays a message in the log"
Print(${1:argument}, ${2:...});
endsnippet

snippet ではじまり、中身はインデントし、endsnippet を使用しない、以下のような書き方が正しい。
The correct way to write it is to start with “snippet”, indent the contents, and not use “endsnippet”.

// Correct
snippet Print "Displays a message in the log"
   Print(${1:argument}, ${2:...});

この変換を行ってくれるサービスやプラグインは見当たらなかったので、bash スクリプトを組んだ。
I couldn’t find any services or plugins that would do this conversion, so I wrote a bash script.

#!/bin/bash

# 入力ファイルと出力ファイルのパス
input_file="./mql4.snippets"
output_file="${input_file%.snippets}-converted.snippets"

# スニペットの変換を開始
{
   in_snippet=false
   while IFS= read -r line || [ -n "$line" ]; do
      if [[ $line == snippet* ]]; then
         in_snippet=true
         echo "$line" # スニペット開始行を出力
      elif [[ $line == endsnippet ]]; then
         in_snippet=false # スニペット終了行を無視
      elif $in_snippet; then
         echo "   $line" # スニペット内の行をインデント
      else
         echo "$line" # スニペット外の行をそのまま出力
      fi
   done <"$input_file"
} >"$output_file"

# 完了メッセージ
echo "Converted file saved to $output_file"

変換を実行する。
Execute conversion.

// 実行権限を付与 - Add execute permission
chmod +x convert_snipmate.sh

// 変換実行 - Execute conversion
bash ./convert_snipmate.sh

// 元ファイル名を変更 - Change original filename
mv mql4.snippets mql4.snippets.org

// 変換されたファイル名を正しく直す - Change converted filename (Must for reading by nvim-cmp)
mv mql4-converted.snippets mql4.snippets

以上で、変換された mql4-converted.snippets が作成される。
オリジナルファイルをリネームし、変換後のファイル名を mql4.snippets に直しておくこと。そうしないと luasnip に読み込まれない。
The converted mql4-converted.snippets is now created.
Rename the original file and change the converted file name to mql4.snippets. Otherwise it will not be loaded by luasnip.

Done !

以上で、mql4 ファイルを開くと luasnip がスニペットを補完してくれるはずだ。
Now, when you open the mql4 file, luasnip should complete the snippet.

Compiling

macOS 上の WineSkin で動いている MT4 なので、MetaEditor の Windows 用コマンドを走らせるのは少し面倒そうだ。これができれば便利だろうが、まだやってない。
Since MT4 runs on WineSkin on macOS, running MetaEditor’s Windows commands seems a bit troublesome. It would be convenient if I could do this, but I haven’t done it yet.

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメント一覧 (2件)

  • Care to share setting of your lsp? clangd?

    i have a lot trouble with the lsp. ( lsp config )

  • Hum, sorry, I already moved for MT5/MQL5 now.
    So I don’t remember so much about mql4.
    Looking back on my memory, I read *.mq4 & *.mqh files as ‘c’ language in somehow.
    Maybe using ‘~/.config/nvim/filetype/mq4.vim’ or so at that time.

    Now, I let my nvim to read mq5 or mqh as c++ filetype.
    It’s just for Treesitter colorings as c++.
    But, like you know, LSP does not work.

    this is my ~/.confi/nvim/lua/core/filetype.lua
    This just changes the filetype by ‘// mql4’ or ‘//mql5’ in the first line of each file.
    mql4 as c, mql5 as c++.

    But, actually the LSP does not work. So I’m writing codes without LSP.

    Since the syntax is slightly different from original c or c++, so we need to wait for the comming of the TreeSitter rules or nvim plugin for mql4 or mql5.

    “`
    — Settings for each filetype

    — mq4, mq5, mqh
    vim.filetype.add({
    extension = {
    mq4 = ‘c’, — MQL4ファイルはC言語として扱う
    mq5 = ‘cpp’, — MQL5ファイルはC++言語として扱う
    mqh = ‘cpp’, — 共通ヘッダーファイルはデフォルトでC++として扱う
    },
    })

    — mqh ファイルの先頭行に基づいて filetype を設定する関数
    — 先頭行に ‘// mql4’ の記載あり … c 扱い
    — 先頭行に ‘// mql5’ の記載あり … cpp 扱い
    local function set_mqh_filetype()
    — ファイルの先頭行を取得
    local first_line = vim.fn.getline(1)

    — コメントでファイルタイプを判定
    if first_line:match(‘^// mql4’) then
    vim.bo.filetype = ‘c’
    elseif first_line:match(‘^// mql5’) then
    vim.bo.filetype = ‘cpp’
    else
    — デフォルトで c とする(必要に応じて変更)
    vim.bo.filetype = ‘c’
    end
    end

    — ファイルを開いた時や保存した時に filetype を自動的に設定する
    vim.api.nvim_create_autocmd({ ‘BufReadPost’, ‘BufWritePost’ }, {
    pattern = ‘*.mqh’,
    callback = function() set_mqh_filetype() end,
    })

    “`
    I hope this information helps you somehow.

コメントする

目次