English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
より優れたプログラマー(第06部): 効果的なコーディングにつながる9つの習慣

より優れたプログラマー(第06部): 効果的なコーディングにつながる9つの習慣

MetaTrader 5 | 19 1月 2022, 11:07
499 0
Omega J Msigwa
Omega J Msigwa

はじめに

コーディングを開始する前に、コーディング中ずっと集中し続けるのに役立つ特定の習慣を、コーディングに追加する必要があります。私達は、ほとんどの場合、コーディングはしているが、集中していない、計画がない、実行計画が不十分であるなど、さまざまな理由で効果的でないことに気づいていません。

効果的なコーディング

内容:

  • コーディング前にプロジェクトを計画する
  • コードスニペットコレクションを作成する
  • ルーチンを持つ
  • 難しい作業をスケジュールする
  • 小さな単一目的関数を作成し、テストする
  • 将来の自分のためにコメントを追加する
  • タッチタイピングの習慣
  • 最高のツールを使用する
  • バージョン管理を行う

免責条項:

この記事で使用されているすべてのコードフラグメントとコーディング例は、教育目的のみを目的としています。注意深くテスト/デバッグされていないものもあります。これらは、私の主張を明確にするためだけに使用されています。コードのいずれかを使用することにした場合は、自己責任で使用することになります。

01: コーディング前にプロジェクトを計画する


コーディングを開始する前にシステムを計画しているかどうかを100人のプログラマーに尋ねたとすると、キーボードでコードを書き始める前に作業を計画していると答えるのは10人未満です。

これは、効果的にコーディングしたい場合に対処しなければならない主要な問題です。

どこに行くのかについての手がかりなしにバスに飛び乗ることができますか?絶対にできません。

キーボードでコードを入力する前に、必要なプログラムの種類、ツール、内部で使用する可能性のあるライブラリなどを書き留めてください。

フリーランスには作業仕様と呼ばれるものがあります。これは、すべての開発者がコーディングを開始する前に必要な作業計画とまったく同じです。

ペンとノートや紙がない場合は、Microsoft WordWPSオフィスなどの無料プログラムを使用して作業の計画を立てることができます。必要なものすべてを説明する図やイラストを描くこともできます。

チャールズ・ケタリングが「よく述べられている問題は半分解決されている」と言いましたが、私はこれに強く同意します。

たとえば、Labouchereの資金管理システムを含むSimpleGridエキスパートアドバイザーを作成したいとします。

これが簡単な作業計画です。

メモ: 以下のすべての初期値は最適化できます/入力変数です。

初期値: Lotsize = 0.01; xgrid = 100; LotIncrement = 0.01;

ストラテジー

ポジションタイプ別のLotsize式

グリッド条件(ストラテジーであるがより明確に)

資金管理

ライブラリ

条件01: ポジションがない場合、買いポジションと売りポジションの両方を開く(タイプごとに1ポジション)

X = Lotsize + (LotIncrement *ポジションタイプ別のポジション数)

 例: BuyLotsize = 0.01 + ( 0.01 * 買いポジションの数);

買い条件は、買いポジションの数が0(ゼロ)の場合または買いポジションがすでに存在し、買呼値が最終買いポジションの始値-xgridポイントを下回っている場合に発生  

StopLoss = 0(デフォルト)

 

標準ポジションクラスライブラリ

標準銘柄情報クラスライブラリ

標準取引クラスライブラリ

条件02(売り条件): 成行価格が前の売りポジションからxgridポイント上昇した場合、Lotsizeが前の売りポジションのLotsize+LotIncrementに等しい売りポジションを開く    売り条件は、売りポジションの数が0(ゼロ)の場合または売りポジションがすでに存在し、売呼値が最終売りポジションの始値+xgridポイントを上回っている場合に発生

TakeProfit = 100(デフォルト)

 
条件03(買い条件): 成行価格が前の買いポジションからxgridポイント下降した場合、Lotsizeが前の買いポジションのLotsize+LotIncrementに等しい買いポジションを開く        

単純な作業計画から、途中で理解しようという漠然とした考え方でコーディングを開始するよりも、作業を実行する方がはるかに簡単であることがわかります。より良い計画は、学ぶ必要がある分野や、忘れた場合に思い出す必要がある分野を特定するのに役立ちます。

コーディングを開始する前に、作業の計画が十分に説明されていることを確認してください。明確であるほど良いです。

02: コードスニペットコレクションを作成する


エキスパートアドバイザー、指標、スクリプトなど、複数のプログラムで関数またはクラスを複数回定義している場合、何度も定義せずに再利用できるように、それらのコレクションが必要になる可能性があります。 これを最も効果的に行うには、オブジェクト指向プログラミング(OOP)を使用します。

作業計画の例から、EAで2つの関数を作成する必要があることがわかりました。 

  1. タイプ別にポジションをカウントする関数
  2. ポジションタイプ別の最後のポジションの始値を提供する関数

これらの関数は、ほぼすべてのグリッドEAで必要であるため、gridmoduleというインクルード(.mqh)ファイルを作成してこれらの2つの関数を格納し、 メインの.mq5 ファイルにインクルードします。

gridmodule.mqhの内部

//+------------------------------------------------------------------+
//|                                                  gridmodule.mqh |
//|                                     Copyright 2021, Omega Joctan |
//|                        https://www.mql5.com/en/users/omegajoctan |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Omega Joctan"
#property link      "https://www.mql5.com/en/users/omegajoctan"
//+------------------------------------------------------------------+
//| Libraries                                                        |
//+------------------------------------------------------------------+ 
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CSymbolInfo   m_symbol;
CPositionInfo m_position;
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
class CGrid
  {
   protected:
     int                   MagicNumber;
  
   public:
                           CGrid(void);
                          ~CGrid(void);
      void                 InitializeModule(int magic) { MagicNumber = magic; }
      double               LastPositionOpenPrice(ENUM_POSITION_TYPE type);
      int                  CountPositions(ENUM_POSITION_TYPE type);
   
  };
//+------------------------------------------------------------------+
//|               Constructor                                        |
//+------------------------------------------------------------------+
CGrid::CGrid(void)
 {
 
 }
//+------------------------------------------------------------------+
//|                Destructor                                        |
//+------------------------------------------------------------------+
CGrid :: ~CGrid(void)
 {
 
 }
//+------------------------------------------------------------------+
//|           Last Position Open Price By Position Type              |
//+------------------------------------------------------------------+
double CGrid::LastPositionOpenPrice(ENUM_POSITION_TYPE type)
 {
  double LastPrice = -1;
  ulong  LastTime = 0; 
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i))
       if (m_position.Magic() == MagicNumber && m_position.Symbol()==Symbol() && m_position.PositionType()==type)
          {
             ulong positionTime = m_position.TimeMsc();
             if ( positionTime > LastTime ) //FInd the latest position
               {
                  LastPrice = m_position.PriceOpen();
                  LastTime = m_position.TimeMsc();
               }
          }
       return LastPrice;
 }
//+------------------------------------------------------------------+
//|                Count Positions By Type                           |
//+------------------------------------------------------------------+
int CGrid::CountPositions(ENUM_POSITION_TYPE type)
 {
   int counter = 0; //variable to store our positions number
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i)) // Select position by its index
        if (m_position.Magic() == MagicNumber && m_position.Symbol() == Symbol() && m_position.PositionType() == type)
          {
            counter++; 
          }
      return counter;
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

こうすることで、コードのデバッグが容易になるため、多くのメリットが得られます。デバッグを1つの場所で実行でき、メインの.mq5ファイルで操作するコードが少なくなります。

03: ルーチンを持つ

ルーチンは適切にコーディングの心の準備をするのに最適で、一般的に生産性を向上させるのに最適です。それはまた、専念し続け、毎日一貫したプログラマーになるのを助けるための最良の方法です。

たとえば、毎日午前8時から午前11時までコーディングすることをルーチンにできます。

同じルーチンを保持すれば、数週間または数か月後には、その時間帯にPCにステップアップするたびに、コーディングを開始することに心が興奮することに気付くでしょう。

自分に最適な時間割を作成します。


04: 難しい作業をスケジュールする

現代では、多くのことに気を取られるのはとても簡単です。最近、特にコーディング時に物事が困難になると、集中するのが難しくなります。創造的になれるほど集中力が高いのは、1日のうちほんの数瞬間/時間です。

多くの場合、私たちの心がそのレベルに到達するためには、気を散らすことなく長時間作業する必要があります。その状態に到達できるようにするには、長時間のコーディングをノンストップで何日もスケジュールする必要があります。

通常のルーチンで作業しているときに直面す難しい作業の大部分をこなせるのは長時間の難しい作業を通じてです。すべてのコーダーに、気を散らさずに一生懸命働く特定の日を計画することをお勧めします。

05: 単一目的の関数を作成し、テストする

1つの関数内で操作が多すぎないようにします。主要な操作をコーディングする必要があることに気付くたびに、別の関数を作成することを検討してください。

Ontick関数(またはその他の主要な関数または主要でない関数)のループが多すぎると、すぐに害を及ぼすことになります。ポケットに入れている手榴弾のピンを抜くようなものです。

すべてのロジックを1つの場所に集結することで単純なアルゴリズムを複雑にすることは、バグを作成するための最良の方法の1つで、お金と人生で最も価値のあるリソースである時間が犠牲になります。

一貫してコーディングできるようにするには、コーディングは大抵の場合に楽しければなければならないと思います。コードを読んでいる人がどれほど経験豊富で賢くても、複雑なアルゴリズムは楽しくありません。各関数が1つの操作を実行することを確認し、その上に、関数の内容を読みやすく理解しやすくするような関数名が必要です。

前の例からポジションタイプの引数を持つ関数CountPositionsを見てください。

int CGrid::CountPositions(ENUM_POSITION_TYPE type)
 {
   int counter = 0; //variable to store our positions number
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i)) // Select position by its index
        if (m_position.Magic() == MagicNumber && m_position.Symbol() == Symbol() && m_position.PositionType() == type)
          {
            counter++; 
          }
      return counter;
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

関数名を見るだけで、この関数はタイプごとにポジションをカウントするためのものであることが誰にでもわかります。関数の内部で行われているのはこれがすべてであり、それ以上でもそれ以下でもありません。

06: 将来の自分のためにコメントを追加する

コードにコメントするという単純な習慣は、コーディングの時期尚早な方法と見なすことができますが、効果的に使用する方法を知っている人にとっては、ゲームチェンジャーになり得ます。

input    group        "Money management"
input    double       InitialLots = 0.01; //Initial position volume
input    int          EquityUse = 50;  // Percentage of equity to be used in all trading operations
input    group        "Average True Range";
input    int          AtrBarSignal = 1; //Atr value will be calculation taken from this candle

現在作成している変数、関数、コードスニペットのほとんどは、数週間後、さらには数日後には忘れられてしまいます。意味のあるコメントがなければ、以前に書いたコードがよくわからないでしょう(それがどれほど愚かであるかを考えてみてください)。

MQL5でコメントを追加すると、IDE MetaEditorで使用するたびに思い出しやすくなります。

Metaeditorコメントリマインダー

MetaEditorが役立ちにくくする理由は、私にはあるようには思えません。

このキャリアがあるのは自分だけではないことを覚えておいてください。コードベースなどで他の開発者が簡単に渡して使用できるコードが常に必要であり、それを行う唯一の方法はコメントによってコードを読みやすく理解しやすくすることです。

07: タッチタイピングの習慣


効果的にコーディングするには、優れたキーボードライターになる必要があることを忘れてはいけません。すべてのコーダーは、キーボードタイピング能力の開発と改善に努める必要があります。コードの入力がうまくなるための最良の方法は、タッチタイピングの習慣を身に付けることです。つまり、実際にキーボードを見ずに、キーボードの正しい文字を打つ習慣を身に付けることです。

ほとんどの人は、未熟なタイピング形式であることに気付かずに、キーボードと画面を同時に見ながらコーディングする傾向があります。

雨だれ式タイピングの習慣を打ち破り、キーボードを見ないで(画面だけを見て)タイピングする練習をする必要があります。これは、筋肉の記憶のタイピングによって可能になります。

この習慣を身に付けるのは少し難しいですが、一度身に付けると、タイピングは自動化された練習になります。

私は、keybr.comという無料のサイトで数週間練習した後、この習慣を身に付けることができました。このサイトは、この習慣を身に付けたいと思っているすべての人におすすめする最高のサイトです。

08: 最高のツールを使用する 


プログラマーとしての全体的な生産性を向上させるための大半はツールである可能性があります。最高ではないにしても、より優れたツール(ハードウェアとソフトウェアの両方)が必要であると言っても過言ではありません。

常に最高のライブラリ(MQL5標準ライブラリをお勧めします)を使用するようにしてください。行き詰まったときや、新しいことを学んで試す必要があるときも、最高の情報源を用意する必要があります(詳細はこの記事を読んでください)。そして何よりも、優れたPCと優れたインターネット接続が必要です。

09: バージョン管理を行う


プログラムをコーディングして変更を加えた後、何らかの理由で、以前に作成したコードに戻りたかったことがあるでしょうか。

進行状況を追跡し、いつでも以前のバージョンのコードに戻ることができるように、コードのバージョン管理を行うことは常に良い習慣です。

私はこれを行う2つの方法を知っています。1つ目はGitを使用する方法で、2つ目はテキストファイルでコードを保存するために手動でコピペするプロセスです。

b>Gitの使用

これは、GitとGithubに慣れていない場合に、数分で教えられる簡単な修正方法です。Gitのドキュメントを読むことをお勧めします。

b>テキストファイルを介する

プロジェクト用のフォルダーを作成し、そのプロジェクトに必要なすべてのファイルを追加します。次に、ファイルエクスプローラーでそのフォルダーを開き、フォルダーの内容を表示します(前の例の以下の画像を参照してください)。

テキストファイルを介する


新しい関数を追加するなど、.mq5に大きな変更を加えた後、コードのバージョンと追加した内容を指定するような名前でテキストファイルを作成します。画像をご覧ください。

テキストファイルを使用したバージョン管理

メインの.mq5またはmqhファイルと一緒にテキストファイルを開き、ウィンドウでCTRL + F7を1回クリックするだけで両方を保存できます。 エディターで開いているすべてのファイルをコンパイルします。コンパイルが成功したら、そのテキストファイルからのエラーをすべて無視して閉じることができます。

mq5ファイルとテキストファイル


終わりに

この記事はこれで終わりです。あなたが何か前向きなことを手に入れて、より優れたプログラマーになるためにさらに一歩前進できたことを願っています。他の知恵をお持ちでしたら、以下のディスカッションセクションで私や他のプログラマーと共有してください。この記事で使用されているすべてのコードは以下に添付されています。

ご精読ありがとうございました。


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/9923

添付されたファイル |
gridmodule.mqh (3.58 KB)
時間の取扱い(第2部): 関数 時間の取扱い(第2部): 関数
証券会社のオフセットとGMTを自動で特定します。おそらく不十分な答えしかくれない(欠如した時間について説明することはいとわないでしょうが)証券会社にサポートを求める代わりに、時間が変わる週に証券会社が価格をどのように計算するかを自分で見ます。結局のところ、私たちはPCを持っているので、面倒な手作業ではなくプログラムを使用します。
手動のチャート作成および取引ツールキット(第III部)最適化と新しいツール 手動のチャート作成および取引ツールキット(第III部)最適化と新しいツール
この記事では、キーボードショートカットを使用してチャート上にグラフィカルオブジェクトを描画するというアイデアをさらに発展させます。ライブラリに新しいツールが追加されました。これには、任意の頂点を通る直線や、反転時間とレベルの評価を可能にする一連の長方形が含まれます。また、この記事では、パフォーマンス向上のためにコードを最適化する可能性を示しています。実装例が書き直され、他の取引プログラムと一緒にShortcutsを使用できるようになりました。初心者より少し上回るコード知識レベルが必要とされます。
MQL言語を使用したゼロからのディープニューラルネットワークプログラミング MQL言語を使用したゼロからのディープニューラルネットワークプログラミング
この記事は、MQL4/5言語を使用してディープニューラルネットワークを最初から作成する方法を読者に教えることを目的としています。
MQL5クックブック - 経済指標カレンダー MQL5クックブック - 経済指標カレンダー
この記事では、経済指標カレンダーのプログラミング機能に焦点を当て、カレンダーのプロパティに簡単にアクセスしてイベント値を受け取るためのクラスの作成について考察し検討します。実用的な例として役立つように、CFTCの投機筋ネットポジションを使用して指標を開発します。