English Русский 中文 Español Deutsch Português
preview
プロのプログラマーからのヒント(第I部): コードの保存、デバッグ、コンパイルプロジェクトとログの操作

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

MetaTrader 5 | 11 8月 2021, 08:12
1 661 0
Malik Arykov
Malik Arykov

内容


はじめに

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


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

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

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

  • /Experts/Cayman/ - エキスパートアドバイザー
  • /Files/Cayman/ - データファイル(設定、パラメータ)
  • /Include/Cayman/ - クラス(関数)のライブラリ
  • /Scripts/Cayman/ - 主な操作スクリプト
  • /Scripts/CaymanDev/ - 開発者向けスクリプト(デバッグに使用)

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

  • TotalCommanderを介したプロジェクトファイルのみのコンテキスト検索
  • Gitによるバージョン管理(制御はプロジェクトファイルに対してのみ有効になり、他のすべてのファイルは無視される)
  • 別のターミナルに簡単にコピー(デモ->リアル-リリース)


複数のターミナルで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の主な利点は次のとおりです。

  • ローカルリポジトリ。ブランチを使用する機能。ワンクリックでの任意のブランチ(バージョン)への切り替え
  • 便利なグラフィカルインターフェイス(TortoiseGit)。マウスによる制御
  • 個人プロジェクト用の無料のクラウドリポジトリ(Bitbucket)。PCのハードディスクが故障する心配はありません
  • 古いバージョンを復元または表示する機能を備えたファイル変更履歴(Bitbucketで便利に表示)

ここでは、詳細なインストールと構成の手順については説明せずに、いくつかの特定の機能について説明します。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)を介した基本的なアクションです。

  • コードを操作する(1つのタスク-1つのコミット)
  • 変更を確認する(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つの開発段階があります。

  • 凡例 - プロジェクトの説明、リンク、および手順。エントリは他のステージに移動されません。ボードの一般的な目的をいつでも表示でき、役立つリソースへのリンクに簡単にアクセスできます。
  • Cayman – MQL5およびMQL4プロジェクト
  • Webサイト – 私の個人的なWebサイトプロジェクト
  • 承認済み - 進行中のタスク
  • 完了 - 完了タスク

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

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


ログ選択

ご存知のように、印刷関数のすべての出力は、ターミナルログ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



ログの強調表示

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

  • [ツールボックス/エキスパート]タブでログをクリアする
  • ログに印刷を刺激する
  • すべての行をlog.txtファイルにコピーする
  • 強調表示を使用して、Notepad++(NPP)でこのファイルを分析する

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

  • 単語をダブルクリックすると、テキスト全体でこの単語が強調表示されます
  • 検索/マーク/スタイルの使用 - これにより、選択したスタイルがドキュメント全体の必要なテキストに適用されます
  • 特定のトークンを強調表示するカスタム構文


コンテキスト検索

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

  • 検索はプロジェクトファイルでのみ実行されます(他のすべてのファイルは検索結果に表示されません)
  • 検索で正規表現を使用する機能

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


終わりに

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


MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/9266

スワップ(第I部):ロックと合成ポジション スワップ(第I部):ロックと合成ポジション
この記事では、スワップ取引手法の古典的な概念を拡張しようとします。私が、この概念に特別な注意を払う価値があり、この概念が研究に絶対的に推奨されるという結論に達した理由を説明します。
DoEasyライブラリでのその他のクラス(第69部): チャットオブジェクトコレクションクラス DoEasyライブラリでのその他のクラス(第69部): チャットオブジェクトコレクションクラス
本稿からチャートオブジェクトコレクションクラスの開発を開始します。このクラスでは、サブウィンドウと指標とともにチャートオブジェクトのコレクションリストを保存し、選択したチャートとそのサブウィンドウ、または複数のチャートのリストを一度に操作する機能を提供します。
DoEasyライブラリでのその他のクラス(第70部): チャットオブジェクトコレクショの機能拡張と自動更新 DoEasyライブラリでのその他のクラス(第70部): チャットオブジェクトコレクショの機能拡張と自動更新
本稿では、チャートオブジェクトの機能を拡張し、チャートのナビゲーション、スクリーンショットの作成、チャートの保存と適用を行います。また、チャートオブジェクトのコレクション、それらのウィンドウ、およびその中の指標の自動更新を実装します。
DoEasyライブラリでのその他のクラス(第68部): チャットウィンドウオブジェクトクラスとチャートでの指標オブジェクトクラス DoEasyライブラリでのその他のクラス(第68部): チャットウィンドウオブジェクトクラスとチャートでの指標オブジェクトクラス
本稿では、チャートオブジェクトクラスの開発を続け、利用可能な指標のリストを含むチャートウィンドウオブジェクトのリストに追加します。