見出し画像

MQLコーディング初心者のためのスタイルガイド ~スタイラー機能の完全解説~

いつも記事をお読みいただき、ありがとうございます。

今回は、主にMQL(MetaQuotes Language)でのコーディングを始めたばかりの皆様に向けて、コードの見た目や構造を整えるためのツールである、メタエディターの「スタイラー」機能についてご紹介します。

⏬この記事は、次のような方を対象にしています

✔ EA(エキスパートアドバイザー)やカスタムインジケーターの開発に興味がある方
✔ すでにMQLでコーディングしているが、より効率的なコーディング方法を探している方
✔ EAの開発チームのリーダーや管理者

⏬この記事を読むメリット

  1. コーディング効率の向上:メタエディターのスタイラー機能を使いこなすことで、コードの整形などにあてる作業を効率化することができます。

  2. エラー削減:適切なコーディングスタイルを学ぶことで、初歩的なミスを減らし、バグの少ないEAを開発できるようになります。

  3. プロフェッショナルな技能の獲得:業界標準のコーディングプラクティスを身につけ、プロフェッショナルなMQLプログラマーとしてのスキルアップにつながります。

  4. チーム開発の効率化:一貫したコーディングスタイルを採用することで、チーム内のコミュニケーションと協力が円滑になります。

  5. 長期的な保守性向上:今後の修正や機能追加が容易になり、長期的な視点でのEA開発が可能になります。

この記事を読むことで、MQLプログラミングの基本的なベストプラクティスを学び、より効率的で品質の高いコードを書けるようになります。メタエディターのスタイラー機能を活用することで、初心者の方でも簡単にプロフェッショナルなコードスタイルを実現できます

一緒にMQLコーディングのスキルアップを目指しましょう!

それでは、ぜひ最後までお付き合いください!


✅なぜコードのスタイルが重要なの?

プログラミングにおいて、コードの「スタイル」とは単なる見た目の問題ではありません。適切なスタイルを使用することで、以下のような利点があります:

  1. 読みやすさの向上

  2. バグの発見しやすさ

  3. コードの保守性の向上

  4. チーム開発での一貫性の確保

✅メタエディターのスタイラー機能とは

MetaTrader 4/5のメタエディターには、MQLコードを自動的に整形してくれる「スタイラー」という機能があります。この機能を使うことで、初心者でも簡単にきれいなコードを書くことができます。

スタイラーの主な機能

  1. インデント(字下げ)の自動調整

  2. 空白文字の挿入や削除

  3. 括弧の配置の調整

  4. コメントの整列

✅スタイラーの設定

  1. メタエディターを起動します。

  2. メニューから「ツール」→「オプション」の「スタイラー」タブを選択します。

  3. 設定画面が表示されるので、好みのスタイルを選択します。

メタエディターの「スタイラー」オプション設定画面

✅スタイラーの使い方

  1. メタエディターで、スタイルを適用したいソースコードファイルを開きます。

  2. スタイルを適用するソースコードの範囲を選択します。

  3. メニューの「ツール」→「スタイラー」、もしくはツールバーの「青いくし」ボタンをクリックします。

  4. オプションで設定されたスタイルで、コードが自動的に整形されます。

メタエディターの「スタイラー」メニュー

✅スタイラーのオプション

  • インデントごとのスペース:コードブロックの字下げ幅(スペース数)を指定します。デフォルトは「3」です。

  • タブをスペースに変換:有効にすると、タブ文字をスペースに置き換えます。デフォルトは「有効」です。

  • 空行を削除:有効にすると、なにも記述されていない「空行」が削除されます。デフォルトは「無効」です。

  • コンマとセミコロンの後にスペースを挿入:有効にすると、コンマ「,」およびセミコロン「;」のあとにスペースを挿入します。デフォルトは「無効」です。

  • ステートメント演算子の周りにスペースを挿入:有効にすると、文(ステートメント)中の演算子(下記サイト参照)の前後にスペースを挿入します。デフォルトは「無効」です。

✅メタエディターのデフォルト設定(MetaQuotes)

メタエディターのデフォルト設定(MetaQuotes)は、主に以下のような特徴を有しています:

  1. インデントサイズ:3スペース

  2. タブサイズ:3スペース

  3. 関数の開き括弧「(」:関数名の直後

  4. 制御文の開き波括弧「{」:新しい行

  5. 括弧内のスペース:挿入しない

  6. 空の括弧:「()」

  7. 演算子の前後にスペース:挿入しない(設定で変更可能)

  8. コンマ「,」の後にスペース:挿入しない(設定で変更可能)

  9. セミコロン「;」の後にスペース:挿入しない(設定で変更可能)

  10. 行の最大長:制限なし

  11. 関数呼び出しの開き括弧「(」の位置:関数名の直後

  12. 関数宣言の開き括弧「(」の位置:関数名の直後

  13. 関数またはメソッド定義の最初のレベルのコメント:左 (インデントなし) に整列

  14. 宣言内の最初のレベルのコメント:行の3列目(インデントあり)に整列

  15. それ以下のレベルのコメント:対応する演算子から3列目(インデントあり)に整列

  16. ファイルヘッダのブロックコメント:挿入しない(※公式サイトの説明と違うので要注意!

  17. 関数、クラス、構造体のブロックコメント:自動挿入

  18. ファイル末尾の一行切り取りコメント:自動挿入

✅スタイラーの適用前・適用後

適用前

void myFunction()  {
//--- 1st level comment
int k[10],t=0;
for(int i=0;i<10;i++){
   k[i]=i;
   t+=i;}   
if  (button==name) {
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
//--- 2nd level comment
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}

適用後

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void myFunction() 
  {
//--- 1st level comment
   int k[10],t=0;
   for(int i=0;i<10;i++)
     {
      k[i]=i;
      t+=i;
     }
   if(button==name) 
     {
      bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
      //--- 2nd level comment
      if(!state)
         ObjectSetInteger(0,name,OBJPROP_STATE,false);
     }
   else 
     {
      ObjectSetInteger(0,name,OBJPROP_STATE,false);
     }
  }
//+------------------------------------------------------------------+

オプション設定により、コンマ「,」の後、セミコロン「;」の後、演算子の前後にスペースを挿入することも可能です。

✅スタイラーを使用するメリット

メタエディターのスタイラー機能を使用することで、以下のような多くのメリットを享受できます:

  1. コードの可読性向上

    • 一貫したフォーマットにより、コードが読みやすくなります。

    • インデントや括弧の配置が統一され、コードの構造が明確になります。

  2. エラーの早期発見

    • 整形されたコードでは、構文エラーや論理エラーが見つけやすくなります。

    • 括弧の対応関係が明確になり、閉じ忘れなどのミスを防ぎます。

  3. 開発時間の短縮

    • 手動でコードを整形する時間を節約できます。

    • チーム内でのコードレビューが効率化されます。

  4. 保守性の向上

    • 一貫したスタイルのコードは、後からの修正や機能追加が容易になります。

    • 他の開発者が書いたコードでも、同じスタイルであれば理解しやすくなります。

  5. チーム開発の効率化

    • チーム全体で同じコーディングスタイルを採用することで、コードの一貫性が保たれます。

    • 新しいメンバーがチームに加わった際の学習コストを低減できます。

  6. プロフェッショナリズムの向上

    • きれいに整形されたコードは、プロフェッショナルな印象を与えます。

    • コードの品質が向上し、信頼性の高いEAやインジケーターの開発につながります。

  7. バージョン管理の効率化

    • 一貫したフォーマットにより、バージョン管理システムでの差分確認が容易になります。

    • 不要な空白や改行の変更がなくなり、本質的な変更点に集中できます。

  8. コードの移植性向上

    • 標準化されたスタイルを使用することで、異なるプロジェクトや環境への移植が容易になります。

  9. 学習効果の向上

    • 初心者にとって、整形されたコードは学習しやすく、良いプログラミング習慣を身につけるのに役立ちます。

  10. 自動化によるストレス軽減

    • コードの整形を自動化することで、細かなフォーマットの調整に悩む必要がなくなります。

    • プログラミングの本質的な部分に集中できるようになります。

これらのメリットにより、スタイラーを使用することは単なる見た目の問題ではなく、開発プロセス全体の質と効率を向上させる重要なツールであることがわかります。特にMQLのような金融市場向けのプログラミングでは、コードの正確性と信頼性が極めて重要であり、スタイラーの使用はこれらの向上に大きく貢献します。

✅スタイルの種類

スタイルには様々な種類があります。
以下に、メタエディターで選択可能な主要なスタイルとその特徴、そしてMQL4に適用したコード例を示します。順序は「スタイラー」設定画面のドロップダウンのスタイル一覧に従っています:

  • MetaQuotes(デフォルト設定):Whitesmithsスタイルに近い。

void OnTick()
   {
   if(OrdersTotal() == 0)
      {
      if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
         {
         double lotSize = 0.01;
         double stopLoss = Bid - 100 * Point;
         double takeProfit = Ask + 200 * Point;
         int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
         }
      }
   }
  • Allman:開き波括弧を独立した行に置く。

void OnTick()
{
    if(OrdersTotal() == 0)
    {
        if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
        {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • Java:Sunのコーディング規約に基づくスタイル。K&Rに近い。

void OnTick() {
    if (OrdersTotal() == 0) {
        if (Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • K&R:開き波括弧を制御文と同じ行に置く。

void OnTick() {
    if(OrdersTotal() == 0) {
        if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • Stroustrup:関数の開き波括弧を独立した行に置く。K&Rスタイルの変形。

void OnTick() 
{
    if (OrdersTotal() == 0) {
        if (Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • Whitesmith:波括弧とステートメントを同じ列に揃える。

void OnTick()
     {
     if(OrdersTotal() == 0)
         {
         if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
             {
             double lotSize = 0.01;
             double stopLoss = Bid - 100 * Point;
             double takeProfit = Ask + 200 * Point;
             int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
             }
         }
     }
  • VTK:Visualization Toolkitで使用されるスタイル。

void OnTick()
{
  if(OrdersTotal() == 0)
    {
    if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
      {
      double lotSize = 0.01;
      double stopLoss = Bid - 100 * Point;
      double takeProfit = Ask + 200 * Point;
      int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
      }
    }
}
  • Ratliff:関数の開き波括弧を同じ行に、他の開き波括弧を新しい行に置く

void OnTick() {
    if(OrdersTotal() == 0)
    {
        if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
        {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • GNU:K&Rスタイルの変形。関数定義の開き波括弧は独立した行に置く。

void OnTick()
{
  if(OrdersTotal() == 0)
    {
      if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
        {
          double lotSize = 0.01;
          double stopLoss = Bid - 100 * Point;
          double takeProfit = Ask + 200 * Point;
          int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • Linux:Linuxカーネルで使用されるスタイル。タブを使用し、8文字幅。

void OnTick()
{
	if (OrdersTotal() == 0) {
		if (Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
			double lotSize = 0.01;
			double stopLoss = Bid - 100 * Point;
			double takeProfit = Ask + 200 * Point;
			int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
		}
	}
}
  • Horstmann:Allmanスタイルの変形。開き波括弧の後のコードを同じ行に置く。

void OnTick()
{   if(OrdersTotal() == 0)
    {   if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
        {   double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • One True Brace:K&Rスタイルの変形。全ての制御構造で波括弧を使用。

void OnTick() {
    if (OrdersTotal() == 0) {
        if (Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
        }
    }
}
  • Google:Googleのオープンソースプロジェクトで使用されるスタイル。

void OnTick() {
  if (OrdersTotal() == 0) {
    if (Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
      double lotSize = 0.01;
      double stopLoss = Bid - 100 * Point;
      double takeProfit = Ask + 200 * Point;
      int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
    }
  }
}
  • Mozilla:Mozillaプロジェクトで使用されるスタイル。

void OnTick()
{
  if (OrdersTotal() == 0) {
    if (Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
      double lotSize = 0.01;
      double stopLoss = Bid - 100 * Point;
      double takeProfit = Ask + 200 * Point;
      int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
    }
  }
}
  • Pico:最小限のインデントを使用するスタイル。

void OnTick()
{
 if(OrdersTotal() == 0)
 {
  if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0))
  {
   double lotSize = 0.01;
   double stopLoss = Bid - 100 * Point;
   double takeProfit = Ask + 200 * Point;
   int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen);
  }
 }
}
  • Lisp:Lispプログラミング言語で一般的に使用されるスタイル。

void OnTick() {
    if(OrdersTotal() == 0) {
        if(Ask > iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) {
            double lotSize = 0.01;
            double stopLoss = Bid - 100 * Point;
            double takeProfit = Ask + 200 * Point;
            int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, stopLoss, takeProfit, "My order", 0, 0, clrGreen); } } }

✅MQLでのおすすめスタイル

MQLのコミュニティなどやウィザードが生成するコードでは、メタエディターのデフォルト設定(MetaQuotes)が一般的に使用されています。
ただし、個人やチームの好みに応じて他のスタイルを選択することも可能です。オプション設定で好みのスタイルに変更することできます。
重要なのは、選択したスタイルを一貫して使用することです

✅初心者へのアドバイス

  1. 一貫性を保つ:選んだスタイルを全てのコードで統一して使用しましょう。

  2. チームの規約に従う:チームで開発する場合は、チームで決められたスタイルガイドラインに従いましょう。

  3. 読みやすさを重視:どのスタイルを選んでも、最終的には読みやすさが最も重要です。

  4. コメントを盛り込む:コメントも自動的に整形されるので、積極的にコメントを入れましょう。

  5. スタイラーを活用:手動で整形するのは大変なので、積極的にスタイラー機能を使いましょう。

  6. カスタマイズを恐れない:必要に応じて、スタイラーの設定をカスタマイズし、自分やチームのニーズに合わせましょう。

  7. 定期的に適用:コーディング中は適宜スタイラーを適用し、コードの一貫性を保ちましょう。

✅まとめ

コーディングスタイルを意識し、スタイラー機能を効果的に活用することで、より質の高いMQLプログラムを効率的に開発することができます。
一貫したコーディングスタイルは、コードの可読性を高め、バグの発見や修正を容易にし、チーム開発をスムーズにします。

スタイラー機能を上手に活用して、効率的なEA開発を目指しましょう!

最後までお読みいただき、ありがとうございました

スキ・コメント・フォローなどいただけけましたら嬉しいです。

✅作者ホームページ

#メタエディター #MQL #プログラミング #コーディング #スタイラー FX #EA #MT4 #MT5 #メタトレーダー #EA開発 #FX自動売買 #EA開発者


この記事が気に入ったらサポートをしてみませんか?