プロのプログラマーからのヒント(第I部): コードの保存、デバッグ、コンパイルプロジェクトとログの操作

Malik Arykov | 11 8月, 2021

内容


はじめに

独自のプログラミングの習慣、スタイル、好みは誰にでもありますが、私の仕事(私の好きな活動)を簡単にするいくつかの方法を共有します。この情報が初心者の役に立つことを願っています。より経験豊富なプログラマーにも何か役立つことがあるかもしれません。


コードを別々のサブディレクトリに保存する

ターミナルプログラムファイルはMQL5ディレクトリの下にあります。このカタログは、いわゆる「サンドボックス」で、外部からのデータアクセスはできません。これは良い決断ですが、DLLを使用すると、おそらくどこにでもアクセスできるようになります。

たとえば、Caymanプロジェクトの構造は次のとおりです。

この配置の主な利点は次のとおりです。


複数のターミナルで1つのコードを使用する

プログラミングのベストプラクティスの1つは、コードの重複を避けることです。同じコードが複数の異なる場所にある場合は、これらの行を関数で「ラップ」することをお勧めします。同じことがMQL5ファイルにも当てはまります。プログラムファイルのテキストは1つだけである必要があります。これは、MQL5ディレクトリへのシンボリックリンクを使用して実装できます。

プロジェクトカテゴリがD:\Projectにあり、ターミナルデータディレクトリがC:\Users\Pro\AppData\Roaming\MetaQuotes\Terminal\9EB2973C469D24060397BB5158EA73A5だとします。

  1. ターミナルを閉じます
  2. データディレクトリに移動します
  3. MQL5ディレクトリをプロジェクトディレクトリに移動します
  4. データディレクトリにいる間に、cmdを実行し、次のコマンドを入力します

    mklink /D MQL5 D:\Project\MQL5

  5. ターミナルを起動します

ターミナルは、「サンドボックス」(プログラムファイル)がD:\Project\MQL5に移動したことに気付くことさえありません。

この配置の主な利点は、すべての個人プロジェクトが同じディレクトリ(D:\Project)に集められることです。


バージョン管理システムを使用する

プロのプログラマーは、そのようなシステムを使用する必要性を疑うことはありません。これは、特にプログラマーのチームが同じプロジェクトに取り組んでいる場合に不可欠なツールです。問題は、どのシステムを使用するかです。これは事実上Gitです。

Gitの主な利点は次のとおりです。

ここでは、詳細なインストールと構成の手順については説明せずに、いくつかの特定の機能について説明します。Git(コマンドライン操作用)とTortoiseGit(マウスを使用するため)をインストールします。D:\Project\MQL5ディレクトリに、次の内容の.gitignoreファイルを作成します。

# exclude files
*.ex4
*.ex5
*.dat
log.txt

# exclude directories completely
Images
Indicators
Libraries
Logs
Presets
Profiles
Services
"Shared Projects"
Levels
Params

# exclude directory contents
Experts/*
Files/*
Include/*
Scripts/*

# except for directories
!Experts/Cayman
!Files/Cayman
!Include/Cayman
!Scripts/Cayman
!Scripts/CaymanDev



このファイルにより、プロジェクトの(* .mq?)プログラムファイルのバージョン追跡が可能になります。MQL5ディレクトリにローカルリポジトリを作成します。ファイルを追加し、最初のコミットを行います(バージョンをコミットします)。ローカルリポジトリの準備ができました。コードを操作し、変更の簡単な説明を付けて頻繁にコミットすることを忘れないでください。コメントを使用すると、後で履歴を簡単に参照および検索できます。

クラウドリポジトリに接続するには、最初にBitbucketアカウントとリポジトリを作成する必要があります。論理的には、リポジトリ名はプロジェクト名と一致する必要があります。私の場合はCaymanMQL5ですが、CaymanMQL4もあります。ローカルリポジトリをクラウドリポジトリにインポートします。これで、クラウドリポジトリの準備が整いました。以下は、TortoiseGit(TG)を介した基本的なアクションです。


別のターミナルとデモ口座を使用してコードをデバッグする

リアル口座には、最新の動作バージョンのコードが必要です(*.ex?ファイルのみで、*.mq?を除く)。デバッグプロセスのコードは、デモ口座にある必要があります。デモから実際にコピーするには、次のバッチファイルを使用できます。

@echo off
setlocal
set PROJECT=Cayman
set SOURCE=d:\Project\MQL5
set TARGET=c:\Users\Pro\AppData\Roaming\MetaQuotes\Terminal\2E8DC23981084565FA3E19C061F586B2\MQL5
set PARAMS=/MIR /NJH /NJS
rem MIR - MIRror a directory tree and delete dest files/folders that no longer exist in source
rem NJH - No Job Header
rem NJS - No Job Summary
echo Copy *.ex? // Source to Production
echo Source = %SOURCE%
echo Production = %TARGET%
robocopy %SOURCE%\Experts\%PROJECT% %TARGET%\Experts\%PROJECT% *.ex? %PARAMS%
robocopy %SOURCE%\Scripts\%PROJECT% %TARGET%\Scripts\%PROJECT% *.ex? %PARAMS%
rem Copy all files except AppSettings.txt, [Levels], [Params]
robocopy %SOURCE%\Files\%PROJECT% %TARGET%\Files\%PROJECT% *.* %PARAMS% /XF AppSettings.txt /XD Levels Params
robocopy %SOURCE%\Scripts\Cayman %TARGET%\Scripts\Cayman *.ex? /NJH /NJS
robocopy %SOURCE%\Scripts\CaymanDev %TARGET%\Scripts\CaymanDev *.ex? /NJH /NJS
echo.
endlocal
pause


すべてのコードファイルを一度にコンパイルする

目標は、コードの一貫性を維持することです。たとえば、関数パラメータの変更は避ける必要があります。エキスパートアドバイザーは適切にコンパイルできますが、古いバージョンの関数を使用するスクリプトも存在する可能性があります。スクリプト(以前にコンパイルされた)は正常に実行できますが、必要な機能を実行しません。バッチコンパイルには、次のファイルを使用できます。

@echo off
setlocal
set METAEDITOR="C:\Program Files\RoboForex - MetaTrader 5\metaeditor64.exe"
set CAYMAN=d:\Project\MQL5\Scripts\Cayman
set CAYMAN_DEV=d:\Project\MQL5\Scripts\CaymanDev

echo METAEDITOR=%METAEDITOR%
echo CAYMAN=%CAYMAN%
echo CAYMAN_DEV=%CAYMAN_DEV%
echo.
echo Wait compile...

D:

cd %CAYMAN%
echo %CAYMAN%
for %%F in (*.mq?) do (
        %METAEDITOR% /compile:%%F /log
        type %%~dpnF.log
)       
del *.log

cd %CAYMAN_DEV%
echo %CAYMAN_DEV%
for %%F in (*.mq?) do (
        %METAEDITOR% /compile:%%F /log
        type %%~dpnF.log
)
del *.log

endlocal
echo.
pause


プロジェクトおよびタスク管理システムを使用する

このようなシステムは、開発チームにとって必須です。また、個人的なプロジェクトにも役立ちます。さまざまなプロジェクト管理システムと方法論が多数あります。私が個人的に使用するのはZenKitです。少人数のチーム用は無料で、とても便利な「看板」を備えています。

以前は、複数の「看板」がありましたが、複数の「看板」を使用することの欠点は、全体像が見えないことです。次に、プロジェクトを開発段階として追加することにしました。このようにして、タスクの管理がはるかに簡単になります。たとえば、私の「看板」には5つの開発段階があります。

ボード使用プロセスは非常にシンプルで直感的です。面白いアイデア、解決策、またはプログラムエラーを見つけました。次に、それを簡単に定式化し、ボード、対応するプロジェクトに追加します。ここで画像やファイルを追加することもできます。次に、タスクを選択して「承認済み」段階に移動します。タスクを処理し、テストして、「完了」段階に移動します。

プロジェクト内のタスクの数を分析することで、問題やボトルネックを簡単に特定できます。「オーバーロードされた」プロジェクトからタスクを取得しようとします。私の目標は、同じ数のタスクを持つようにプロジェクトを調整することです。チーム開発には「テスト」段階という別の段階がありますが、私は独りで作業しているため、私には関係ありません。


ログ選択

ご存知のように、印刷関数のすべての出力は、ターミナルログMQL5\Logs\yyyyMMdd.logに書き込まれます。このファイルにはすべての銘柄(取引商品)が混在しています。次のバッチファイルを使用して、必要な銘柄のログを選択します。

echo off
if "%2"=="" goto Help
find /I "%2" < %1 > "%~n1-%2.log"
goto Exit
:Help
echo.
echo Filter log-file
echo findLog.cmd logFile text
echo Example
echo findLog.cmd 20200515.log gbpjpy
echo Result
echo 20200515-gbpjpy.log
echo.
pause
:Exit



ログの強調表示

デバッグを実行すると、ログに多くの情報が書き込まれ、実行中のターミナルで分析するのは非常に難しい場合があります。このプロセスを簡素化するためにできることは次のとおりです。

NPPは、さまざまなテキスト強調表示バリアントをサポートしています


コンテキスト検索

特定のテキストを見つけるには、TotalCommanderファイルマネージャーを使用します。この方法の主な利点は次のとおりです。

コンテキストファイル検索


終わりに

これは私の最初の記事です。連載を継続する予定です。次回は、いくつかの成功したソリューションを共有し、関連する説明と説明を提供します。みんなでプログラミングの経験を共有し、他の役立つヒントや解決策について話し合いましょう。