English Русский 中文 Deutsch Português
preview
ビジュアルプログラミング言語DRAKON:MQL開発者と顧客のコミュニケーションツール

ビジュアルプログラミング言語DRAKON:MQL開発者と顧客のコミュニケーションツール

MetaTrader 5 | 19 2月 2024, 10:10
174 0
Oleh Fedorov
Oleh Fedorov

はじめに

DRAKON言語は、モスクワにある連邦宇宙局(Academician Pilyugin Center)(英語)とロシア科学アカデミー(Keldysh Institute of Applied Mathematics)(英語)が共同で開発したもので、Buran宇宙船プロジェクトに携わった経験から生まれました。

Parondzhanov V. D.

その昔、グラスノスチがソ連にやってきて、それまで機密扱いだったDRAKON(Friendly Russian Algorithmic Language Which Provides Clarity)言語を広く一般に公開しました。現在、この言語の主な普及者はParondzhanov V. D.です。彼はワークショップに参加したり本の執筆に加えて、この言語専用のWebサイトを作成しました。彼の献身的な努力のおかげで、DRAKONは現在、化学者や医師に愛用されています。

他の愛好家たちは、この言語からC、C++、TCL/TK、Java、JavaScriptなど、より広く使われているプログラミング言語へのトランスレータを開発し始めました。実際には、このリストははるかに長くなります。必要であれば、このリストを拡張することもできます。私が知っているすべてのエディターは、読みやすいファイル(プレーンテキスト-*.csv、*.xml、データベース-SQLightなど)を生成するからです。これらのプログラムの多くは、他のアルゴリズム言語への翻訳ルールのためのオープンソースコードを持っています。

今日の他の多くのプログラミング言語とは異なり、DRAKONは「記号的」ではなくグラフィカルです。その中のアルゴリズムはすべて、特別なアイコンを使って文字通り画面上に描かれます。これらのアイコンは、直感的なルールに従ってアルゴリズムに組み合わされます。出来上がった図はとてもシンプルでわかりやすく、プログラマーでなくても理解できます。そして、これらの図は、ワンクリックで動作するプログラムに変換することができます。

アルゴリズムの概念を思い出してみましょう。

アルゴリズムとは、特定のタスクを解決するために、特定のプロセスを通じてパフォーマーを導く明確で理解しやすい記述です。

もっといい定義があるかもしれませんが、私はこれを使うことにします。

この定義によれば、アルゴリズムとは、実行者の努力によって問題を解決する方法です。理想的には、出来上がったアルゴリズムは、他の誰か(あるいは何か)にとっても理解できるものであるべきです。

複雑な正弦波マーチンゲールを使って取引する、非常に収益性の高いEAのアルゴリズムを作成したとします。シグナルは、現在の曜日から指数関数的な分数であるローソクの長さ、および10ピークの前の形成の位相に応じて変化します。簡単です..よね。すべて説明しましたが。

もしあなたが開発者なら、理解してもらうためにはどうすればいいでしょうか。たいていの場合、コーディングに関して何をすべきかを理解できるように、図を描くべきでしょうか。図が完成したら、通常の要求仕様書として完成することができます。これでコードに変換する準備ができました。

これがDRAKON形式の図面です。

もしあなたがプログラマーでこの図を自分で描いたのなら、いくつかのキーを押すだけで、そこから操作可能なコードを得るか、少なくとも信頼できるフレームワークを作成することができます。

もしあなたが顧客なら、特定のケースで何をすべきかを明確に説明した図を見せれば、プログラマーにあなたが望むことを説明するのがずっと簡単になります。

例えば、2つのMAが交差した場合、シグナルを覚えておき、価格が「ジュニア」平均から反発した瞬間に取引すればよくなります(現地時間の19:00までに)。

もちろん、このすべてを言葉で表現することはできます。

しかし、コンピューター(正確には抽象的なパフォーマー)に次のような簡単な質問をする図を描くこともできます。「電流は19を超えるか」、「平均は交差したか」、そして答えが「はい」の場合の対処法と「いいえ」の場合の対処法を説明します。

これによってプログラマーの技術的作業の負担が減るわけではありませんが、少なくともあなたの考えをよりよく理解できるようになるし、最初のバージョンでミスを犯す可能性も少なくなります。これらのエラーは最終的に修正しなければなりませんが、それにはさらなる時間(および/または費用)が必要になるかもしれません。

一般的に、DRAKON図は、プログラマーにとっても、プログラミングに不慣れだがEAを性格にどのように動作させたいかを正確に理解している顧客にとっても有益です。

端的に言えば、次のようになります。

  • 言葉の構成は、本当に考える助けになります。図という形でアルゴリズムを見ると、モジュール内の部分間の関係やモジュール自体の関係を理解するのがずっと簡単になり、図がなければわからないようなエラーを見つけたり、解決策を使ったりすることもできます。
  • DRAKONは顧客をよりよく理解するのに役立ちます。
  • もし何か提案があれば、それを顧客に伝えやすくなります。
  • 顧客が私のミスを批判するのがより簡単になります。
  • 顧客がDRAKON図を描いていれば、それをコードに移し替えて要求仕様が完成したとみなすことができます。これは、コーディング中に生じる疑問や問題に対処するよりもはるかに簡単です。顧客にとっては明らかでも、開発者にとってはそうでない機能があるかもしれません。この図は、潜在的な誤解をなくすものです。

私にとって、アルゴリズムにおけるグラフィックは不可欠なコミュニケーションツールです。2人の人間が結果に興味を持ち、対話をする場合、同じ言語を話す方が良くなります。DRAKON図の言語は、一度理解すればどの分野の専門家にとっても普遍的です。


DRAKONの基本開発環境

この記事を書くにあたり、私は主に3つのツールを使いました。

  • まず、Drakonhubです。これはあらゆる種類のDRAKON図を描画できるオンラインエディターで、非常に便利なインターフェイスを持っていますが、図をコードにエクスポートすることはできません。また、プログラマー向けの別プロジェクトdrakon.techもありますが、JavaScriptでのみ動作します(少なくとも私が見つけたものによると)。それに、プログラマー以外が利用できる図の数は、Drakonhubに比べるとかなり少ないようです。一般的に、顧客にとっては完璧であり、開発者にとっては、例えば、生成後に変数の型付けを手作業で行ないたいのであれば、普通のことです。ロシア語、英語、ノルウェー語のインターフェイスがあります。
  • Fabulaダウンロードリンク)もあります。このプログラムは無料で、ロシア語と英語のインターフェイスがあり、Windows用のオフラインアプリケーションもあります(QTライブラリを使って書かれていますが、クローズドソース)。インターフェイスは私にとってほぼ完璧です。データは、ZIPアーカイバでパックされたXMLで保存されます(これは、必要に応じてXSLTを記述し、プログラムを直接ブロードキャストできることを意味します)。アルゴリズムをトレースできるので、プレゼンテーションや擬似コードの作成に利用できます。擬似コードは、一連のオートコレクトを使って、完全に動作するプログラムに変えることができます。この記事のほとんどの図はFabulaを使って作成します。
  • 3つ目は、DRAKONエディターです。アイコンは手動で配置しなければならないので、インターフェイスは少し不便です。その上、いくつかのアイコンがなく、いくつかのキャプションは最良の方法で実装されていません。一方、私は図をMQL5のコードに変換することができます。さらに、いくつかのキーワードを強調することもできます。また、TCL/TKで書かれているため、クロスプラットフォームであり、WineなしでLinux上で自然に動作します。このエディターの主な利点は、多くのプログラミング言語をサポートしていることです。DRAKON図は、C++、Java、JavaScript、D、TCL、Go、その他多くの言語に簡単に変換できます。DRAKONが好きなプログラマーにとっては、とても便利です。しかし、生成されるコードは必ずしも美しいとは限りません。ファイルを準備する方法も明白ではありません。ドキュメントを読む必要があります。でも、一度わかってしまえば、とてもうまくいきます。インターフェイスはロシア語と英語です。
  • IS Drakonもあります。私にとっての主な欠点は、それが有料製品であるとです。そのインターフェイスを深く掘り下げることはしませんでした。DRAKONエディターと似ているような気もしましたが、観察している限りでは特に長所は感じられませんでした。

すでに述べたように、ここでのほとんどの図はFabulaを使って作られています。その図は、複雑な準備なしに最も美しく見えます。

図からコードを生成する場合は、DRAKONエディターでおこないます。


基本的な言語コマンド

DRAKON言語は、当時プログラマーによく知られていたフローチャートをベースに開発されました。そのため、主な言語要素は、一般的にブロック図のGOST (All-Union State)規格に準拠しています。しかし、この開発の主な力は、これらの要素を平面上に配置するためのルールにあります。

言語の最初の機能要素は「アイコン」です。アイコンは、アルゴリズムの行動、条件、または操作を定義する特別なグラフィカル銘柄名です。

画像
名前(カッコ内は別名)
詳細
開始
開始
プログラムの開始地点。ここからアルゴリズムの実行が始まります。
終了
終了
プログラムの完成。アルゴリズムの実行はここで終了します。
アクション
アクション(プロセス)
普通のアクションのブロック。順番に実行されるコマンドが含まれています。
問題
問題(条件、解決)
問題アイコンは、状態をチェックするために使用します。条件が満たされれば、プログラムはある分岐をたどり、そうでなければ別の分岐をたどります。
選択
選択(解析)
選択はいくつかのオプションの分配ノードです。プログラムは選択で定義された条件によって異なる行動を実行します。問題とは異なり、選択肢は2つ以上あるかもしれません。
オプション
オプション
オプションアイコンはDRAKON言語の選択アイコンに関連する条件または実行の分岐を表します。選択ブロックの特定の条件が真である場合に、どのような行動を実行するかを定義します。
分岐名
分岐名
分岐名アイコンは、あるモジュール内の特定のフラグメント、アルゴリズムの特定のステージ、またはプログラムの状態を表します。
アドレス
アドレス
アドレスは分岐実行後の行き先を示します。
挿入
挿入
挿入は、現在のアルゴリズムに別の図や行動のブロックを挿入するために使用します。これにより、コードをより緻密かつ論理的に配置し、構造化することができます。
棚

棚アイコンはいくつかの値を持つことができます。
トップ ボトム
パフォーマーへの注文 パフォーマー。例えば、会計士。 注文(例:請求書の印刷)
送信者から受信者へのメッセージ送信 送信者と受信者。例えば、ブラウザーとアプリケーションサーバー。 「Facebookでログオン」要求などのメッセージ
オブジェクトに対するアクションの実行 アクションを伴うキーワード アクションが実行されるオブジェクト。
変数への値の代入 変数
「トリプルシェルフ」が使われることもあります。著者
パラメータ
パラメータ

パラメータには、アルゴリズムの入力データが含まれます。

例えば、ルートを作るには、出発地と目的地を知る必要があります。

プログラムによっては、入力と出力のパラメータを分けることができます。その場合、入力は左側に、出力パラメータは右側に配置されます。

Forループ開始
FORループ開始
このアイコンは通常、次のアイコンと一緒に使われます。あるアクションを既知の(計算可能な)回数繰り返すこと。

例えば、1から10まで数えたり、配列のすべての要素を反復処理したりする必要がある場合...。
Forループ終了
FORループ終了
このアイコンは通常、前のアイコンと一緒に使われます。あるアクションを既知の(計算可能な)回数繰り返すこと。
出力
出力
出力アイコンは、プログラムのデータや結果がユーザー、プログラムの別の部分、または外部デバイスに転送されるポイントを表します。

最上部には、キーワードやキーフレーズが含まれています。通常、そこには動詞があります。

最下部には、オブジェクトや説明的な情報が含まれています。


  入力  入力 入力は、プログラムがユーザー、他のプログラム、または外部ソースからの入力を受け取るのを待つ場所を示します。入力と同じように、トップとボトムを含みます。
  一時停止  一時停止 一時停止は、特定のイベントや時間まで番組が一時停止される瞬間を示します。
  タイマー  タイマー タイマーは、時間間隔を制御し、行動を計画するために使用されます。時間アイコンと一緒に使われることが多いです。
  時間  時間 時間は、時間とその会計に関する操作を視覚化します。これにより、プログラムは時間間隔とイベントを追跡できます。
  並列プロセス 並列プロセス

並列プロセスは、メインプログラムと同時に実行されるタスクの実行を制御します。
最上部には開始ブレイクポイント終了再開のいずれかが表示されます。

並列プロセスはバックグラウンドで実行され、そのアルゴリズムは別のDRAKON図で定義されます。メインプロセスは、並列タスクの完了を待たずに実行を続けます。並列プロセスとの通信は、入出力アイコンを使って確立できます。

 
  本線コメント 本線コメント 本線コメントは、図をより明確にするのに役立ちます。プログラムの動作には影響しませんが、不明瞭な部分を明確にすることができます。
  右コメント左コメント 左右のコメント
右と左のコメントアイコンを使って、どのような行動が発生したかを具体的にコメントすることができます。通常、変数とパラメータについて説明します。
  キャプション キャプション
キャプションアイコンは、アルゴリズムの一部を説明する必要がある場合に、右コメントや左コメントの代わりに使用されることが多いです。プログラムに変換されたアルゴリズムで使われることはほとんどありません。より多くの場合、これは人間の言語で書かれたアルゴリズム(例えば、医師向け)で注目を集めるための方法であり、顧客がいくつかの強調表示されたポイントの助けを借りて説明を明確にしたい場合です。
  並列プロセス 並列プロセス
並列プロセスアイコンは、同時に実行する複数のタスクやプロセスを起動するために使用します。このアイコンの矢印は、それぞれ異なるスレッドやタスクを表すことができます。
  ループ矢印 ループ矢印
矢印は、正確な繰り返し回数が不明な繰り返し事象を表します。

例えば、やかんが沸騰しているかどうか、沸騰するまで確認します。
  シルエット矢印 シルエット矢印
あるアクションの継続と、シルエットの次の分岐への移行を示すためにだけ私用されます(下記参照)。

単純入力(出力アイコンの上部に似ている)や丸みを帯びた四角形など、他のアイコンが使われることもあります。プログラムによっては、すべてのアイコンを使用できないものもありますが、一般的に、この表は、図が構成される断片をほぼ網羅的に示しています。


簡単な視覚的図(「プリミティブ」)の作成

DRAKON言語図はある法則に従って構築されます。

すでに述べたように、図の主な構成要素はアイコンです。しかし、それらが適切に交流するためには、コミュニケーションラインが必要です。

コミュニケーションラインは水平でも垂直でも構いません。

アクションは垂直方向にのみ実行されます。

水平方向の接続は、いくつかのオプションの中から1つを選択する場合、またはその他の補助的な動作の場合にのみ表示されます。あるアルゴリズムに対して、関数へのパラメータの入力やコメントのような補助的なアクションがない場合、アルゴリズム全体が1本の垂直な「串」の上に配置されます。

例えば、2つの数の和を求める必要があります。ユーザーから両方の数値を受け取り、printfまたはPrint関数を使ってコンソールにデータを出力します。DRAKON言語図はどのようになるでしょうか。とてもシンプルです。

2つの数値の和

図1:2つの数値の和のアルゴリズム

このコードをプログラムする場合、ほとんどの場合、関数が必要になり、パラメータ(補助動作)を受け取らなければなりません。よって、こう描きます。

和(関数として)

図2:関数としての和

私の図に従ってプログラムが生成したコードは、次の通りです。

double Summ(double a, double b) {
        // item 6
        return (a+b);
    }

したがって、最初のルール:DRAKON図の主な方向は上から下です。つまり、アルゴリズムが線形に実行される場合、そのプリミティブは常に垂直に描かれ、上から下に実行されなければなりません。したがって、図に矢印は必要ありません。なくてもすべてがクリアになります。

しかし、分岐が必要な場合はどうでしょうか。ある特定の条件下でのみ実行されるアクションがあるとしたらどうでしょうか。例えば、移動平均線の交差のみに基づいて取引を開始する場合は、質問のアイコンを使用して決定されます。

平均線を越えて取引に入る

図3移動平均をクロスさせて取引に入るアルゴリズム

各条件アイコンには、常に2つの出力があります。1つは下から、もう1つは右からです。言い換えれば、アルゴリズムにおけるアクションは常に上から下へ、左から右へと起こります。矢印はもう必要ありません。アルゴリズムをテストする場合は、単に最後まで線をたどります。

時には、2つではなく3つ以上の選択肢に基づいて決断しなければならないこともあります。ユーザーがあるキーを押したとしましょう。どのキーが押されたかによって、プログラムは特定のアクションを実行します。もちろん、これを普通の問題で描くこともできますが、図が煩雑になります。

この場合、選択の方がはるかに適しています。

キー入力の処理

図4:キー入力の処理

最後のオプションアイコンは空白のままであることに注意してください。MQLでは、このオプションはデフォルト演算子に相当します。他のオプションが適切でない場合、デフォルトのアクションが実行されます。

この例を使って、もうひとつのDRAKONルールをたどってみましょう。すべての垂直分岐は左から右に配置され、右に行くほど悪い選択肢になります。一番左の選択肢は「王道」あるいは「ハッピーパス」と呼ばれることもあります。

オプションが同等であれば、何らかの基準に従って並べるだけです。例えば、ボタンのアルファベット順に並べてみました。

時には、プログラムの最後まで行かずにブロックの最初に行く必要があります。これらはDO-WHILEループです。

待ちループ(DO WHILE)

図5:シグナルが現れるまで待つ。「シグナルを待つ」アクションは、いかなる状況でも少なくとも1回は実行されます。

あるいは、同じループを、最初に条件を確認し、それから何らかのアクションを実行するように書き換えることもできます。

DO-WHILEループ

図6:シグナルが現れるまで待つ。シグナルがすでに到着している場合、「シグナル待ち」アクションは一度も実行されないことがあります。

いずれにせよ、ここでの矢印はすでに必要な要素です。これがないと、図はもっと読みにくくなります。

ループについては、もうひとつ重要なルールがあります。ループの出口はいくつあってもよいが、入口は1つしかないということです。言い換えれば、プログラム内の任意の場所からループ内の任意の場所に矢印をドラッグすることはできません。私たちは常に初心に戻らなければなりません。


DRAKONのシルエット図

DRAKONは視覚言語なので、図が読みやすいことが重要です。そのためには、図全体が画面(またはシート)に完全に含まれる方がよいです。

この要件は常に実現可能というわけではありませんが、努力しなければなりません。言語アイコンを配置する「シルエット」と呼ばれるもう1つの方法が、これを助けることができます。

シルエットとは、複雑な関数を構成要素に分割し、実行段階に分け、同時に1つの全体として残す方法です。

例えば、標準的なEAにおけるティック処理はどのようなものか、シルエットの形で書いてみましょう。

シルエット

図7:シルエットはDRAKON言語の2番目の主要な図構成です

各分岐の先頭には、従来の人間の言語での名称が記されています。下は、トランジションアドレス(この分岐が完了した後、コマンドのフローをどこにリダイレクトするか)です。原則として近隣の分岐に移りますが、別の場所に行く必要がある場合もあります。

さらに右側に移った場合は、単に分岐名が表示されます。

同じ分岐の始まり、または左の分岐への移行の場合、対応する分岐の始まりと終わりのマーカーは黒い三角形で示されます。

片方の分岐でのループ

図8:片方の分岐シルエットでループ

このようなループを使わなければならない場合は、プログラムを別の分岐に導く終了条件があることを確認してください。そうでなければ、ループがエンドレスになりかねません。

私の図では、そのようなループは避けるようにしています。私が解決する問題の95.4%はループなしで解決できます。

実際、シルエットはステート図です。通常、エディターは各分岐をこのように正確に理解します。ある瞬間のプロセスの特定の状態として理解し、シルエットを内部のswitch-case演算子を使って状態を選択できる無限ループとして解釈します。プログラムはどこで切り替えればいいのかを知る必要があるし、ユーザーはどのフラグメントがある時点でアクティブなのかを知る必要があります。

分岐へのエントリは、その開始地点を通じてのみ可能です。最後の分岐からの退出は、「終了」アイコンによっておこなわれます。


DRAKON図のニュアンス

上の図では、接続がない限り、どの線も交差していないことにお気づきでしょうか。これは図に明快さを加える基本的なポイントです。交差点はあってはなりません。パスの合流や移動はマークでしかできません。交差点があるところでは、解決策に向かうときにこの道を選ぶことができます。

図7では、ポジションを追加するための分岐(左から3番目)が少し不正確です。図にはできるだけ平行線を入れません。この規則もまた、明確さを増しています。残念なことに、Fabulaは正しい分枝の描き方を知りません。これは誤りではありませんが、むしろ解釈の不正確さです。

「下か右のどちらかに移動する」というルールの例外は、図の一番下の線で、シルエットの「串」を1つの全体としてつなげています。常にプロセスを最初に戻し、新しい状態を選択します。したがって、私たちは矢印に沿って右から左へ移動します。

原則的に、ほとんどのプログラムでは、1枚のシートに複数の図を作成することができます。それが正当化されることもあります。

図が小さく、ほとんどが縦長であれば(シルエットは非常にコンパクトにできる)...そして、図と図の間に十分な距離があれば(あるいは、図と図の間に色がついていたり、さらに枠線がついていたりする)...これらの条件をすべて満たせば、組み合わせたときの図の鮮明度が増します。

図を紙に印刷することを想定しているのであれば、前の段落の推奨事項を参考に、できるだけコンパクトに配置するのが理にかなっています。

しかし、それ以外の場合は、各図を別々のスペースに配置した方がよいです。特に、その中に大きな「シルエット」があったり、これらの図が白黒で紙に印刷することを意図している場合はなおさらです。多くの場合、DRAKONはコンパクトさよりも明瞭さを重視します。視覚化によって精神的な労力を軽減し、その労力を効果的な解決策の開発に向けることができます。


DRAGONからMQLへの図のインポート

グラフィカルなアイコンを使って優れた大きなアルゴリズムを構成する場合、図をコードに変換する労力を最小限にしたいものです。

このような目的には、原則としてDRAKONエディターを使います。

エディターを開いたら、まずファイルを作成します(または既存のファイルを開く)。

DrakonEditor-ファイル作成ダイアログ

図9:DRAKONエディターのファイル作成ダイアログ

DRAKONエディター(DE)はオートセーブを採用しています。画面上のすべての変更は即座にファイルに保存されます。

赤で強調表示されたSMART編集モードに関する文章に注目してください。

図をJavaに変換します。MQL用の特別なパーサーを書きたくないのであれば(私は書きたくありません)、これが最もシンプルなオプションです。Javaファイルの構造はMQL5プログラムの構造にできるだけ近いため、生成されたファイルは最小限の修正でコンパイルされます。

メインプログラムウィンドウの左上隅に、ファイルの説明を開くボタンと、「ファイルメニュー」にこの項目があります。

ファイルのプロパティメニューとボタン

図10DRAKONエディターのファイルのプロパティメニューとボタン

ファイルの説明は機能的です。

一般的な説明に加え、既製のプログラムに完全に移行される2つのセクションを挿入することができます。まだ何もありませんが、これらのセクションは非常にシンプルに見えるでしょう。

===header===

===class===
class Main {

「class===」の後に「classMain{」を追加すれば十分です。ここに中括弧1つあることに注意してください。もう1つは、生成中にエディターによってインストールされます。

ファイル内には1つのクラスしか存在できません。

header===」文字列のに挿入されたものはすべて、DEによってファイルに直接貼り付けられます。従って、プログラムを全てDRAKON言語で記述する場合は、グローバル変数、#include文、構造体や列挙体の記述などを全てこのセクションに記述する必要があります。

「===header===」セクションよりにあるものはすべて無視されます。ここにはどんな説明でも挿入できます。

単純な指標を書く場合、最終ファイルからclassMain{と閉じ中括弧を削除する必要があります

OOPの仕組みを理解しているのであれば、関数の実装を除いて、同じヘッダーの中にあるクラスの説明をそのまま使うことができます。関数は図に実装されます。ただ、Javaにはクラスがあり、MQLにはグローバルスコープで操作する関数があることを覚えておいてください。

ローソク足のサイズが、そのローソク足の前にある他のローソク足のサイズよりも小さい場合に、そのローソク足をマークするシンプルなNR4指標の作成方法を紹介したいと思います。「大」ローソクの本数は入力で指定します。このようなローソク足の出現は、差し迫った急激な動きの可能性を示すことが多いです

これが私の説明コードです。

===header===
//+------------------------------------------------------------------+
//|                                                          NR4.mq5 |
//|                                       Oleg Fedorov (aka certain) |
//|                                   mailto:coder.fedorov@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Oleg Fedorov (aka certain)"
#property link      "mailto:coder.fedorov@gmail.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot NRBars
#property indicator_label1  "NRBarsUp"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  0
//--- plot NRBars
#property indicator_label2  "NRBarsDn"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  0
//--- input variables
input int NRPeriod=4;

//--- indicator buffers
double         NRBarsBufferUp[];
double         NRBarsBufferDn[];

===class===
class Main {

ファイルの説明を閉じます。

ここで、ファイルをJavaに変換することをエディターに知らせる必要があります。

[ファイル]→[ファイルのプロパティ]を開き、新しいダイアログウィンドウの一番上の行でJavaを選択します。

図を変換する言語の選択

図11:図を変換する言語の選択

セットアップ完了です。これでアルゴリズムのプログラミングを開始できます。

アイコンの中にどんなテキストでも書くことができますが、この場合、各アイコンには最終的なファイルに入るコードの断片が含まれます。顧客向けのデモであれば、人間の言葉でコメントを書くだけで十分ですが、コンパイルしたコードを図に格納したいのであれば、何が起こるべきかを十分に詳細に書くことです。私の場合は2番目のケースです。

DEの挿入アイコンはコンパイル中に機能しないので、行動アイコンを使う必要があります。

各関数はそれ自身の図を持たなければなりません。

DEはこれを明確に要求します(他のエディターはもっと「忠実」です)。ここでは、ツールバーボタンを使用して複数の図実体を作成するか、Ctrl+Nを押さなければ、複数の図を作成することはできません。

私の場合、OnInitとOnCalculateの2つの関数しかありません。以下です。

OnInit

図12:OnInit関数

OnCalculate

図13:OnCalculate関数

画像のテキストが小さすぎる場合は、DRAKONエディターをダウンロードしてインストールしてください(Webサイトには詳細な手順と依存関係がすべて記載されています)。次に、下に添付した図のファイルを開きます。

図をコンパイルされたコードに変換します(DRAKON->Generate code)。図にエラーがある場合(例えば、線が他の線やアイコンに達していない場合)、DEは下のパネルで警告します。エラーがなければ、拡張子が*.javaのファイルがプロジェクトファイルのフォルダに表示されます。

indicatorsディレクトリに保存し、拡張子を*.mq5に変更し、必要であればクラスの説明を削除し、コンパイルして実行します。

以下は、不要な要素を削除する前のファイルの内容です。

// Autogenerated with DRAKON Editor 1.31
//+------------------------------------------------------------------+
//|                                                          NR4.mq5 |
//|                                       Oleg Fedorov (aka certain) |
//|                                   mailto:coder.fedorov@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Oleg Fedorov (aka certain)"
#property link      "mailto:coder.fedorov@gmail.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot NRBars
#property indicator_label1  "NRBarsUp"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  0
//--- plot NRBars
#property indicator_label2  "NRBarsDn"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  0
//--- input variables
input int NRPeriod=4;

//--- indicator buffers
double         NRBarsBufferUp[];
double         NRBarsBufferDn[];

class Main {

    int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) {
        // item 15
        int i,j, limit;
        // item 16
        if (rates_total < NRPeriod) {
            // item 19
            return 0;
        } else {
            // item 20
            if (prev_calculated < NRPeriod) {
                // item 23
                limit = NRPeriod;
                // item 24
                ArrayInitialize(NRBarsBufferUp, EMPTY_VALUE); 
                ArrayInitialize(NRBarsBufferDn, EMPTY_VALUE);
            } else {
                // item 25
                limit = rates_total - NRPeriod;
            }
            // item 310001
            i = limit;
            while (true) {
                // item 310002
                if (i<rates_total-1) {
                    
                } else {
                    break;
                }
                // item 340001
                j=1;
                while (true) {
                    // item 340002
                    if (j<NRPeriod) {
                        
                    } else {
                        break;
                    }
                    // item 36
                    if (high[i]-low[i]>high[i-j]-low[i-j]) {
                        // item 39
                        break;
                    } else {
                        
                    }
                    // item 340003
                    j++;
                }
                // item 40
                if (j==NRPeriod) {
                    // item 43
                    NRBarsBufferUp[i]=high[i];
                    NRBarsBufferDn[i]=low[i];
                } else {
                    
                }
                // item 310003
                i++;
            }
        }
        // item 48
        return(rates_total);
    }

    int OnInit() {
        // item 11
        //--- indicator buffers mapping
        SetIndexBuffer(0,NRBarsBufferUp,INDICATOR_DATA);
        SetIndexBuffer(1,NRBarsBufferDn,INDICATOR_DATA);
        // item 12
        //--- setting a code from the Wingdings charset as the property of PLOT_ARROW
           PlotIndexSetInteger(0,PLOT_ARROW,218);
           PlotIndexSetInteger(1,PLOT_ARROW,217);
        // item 13
        //---
           IndicatorSetString(INDICATOR_SHORTNAME,"NR4 ("+IntegerToString(NRPeriod)+")");
        // item 14
        //---
           return(INIT_SUCCEEDED);
    }
}

もう一度言っておきますが、このシンプルな指標を機能させるには、上と下の黄色で強調表示されたテキストを削除します。ここでは、読者がこのファイルがDEオートメーションによってどのようにフォーマットされるかを正確に評価できるように、あえてスタイラーは使用しませんでした。

このコードを読むのは、手で書いた場合よりも難しいですが、うまくいきます。でも、読む必要はありません。図を見てください。


結論

もしあなたが開発者で、DRAKONが気に入ったのであれば、上記で紹介した図作成ツールをご自由にお使いください。リストアップされた各エディターをご自分でテストし、何が自分にとってより良いか、自分なりの意見を形成することをお勧めします。実際、どれも比較的シンプルです。

顧客との仕事を順序立てて手配したい場合、Dragon.Techdrakonhubへのリンクを渡し、人間の言葉でプロジェクトの作り方やアイコン同士の関係を簡単に説明し、見たいものを言葉で表現しても構わないことを伝えます。主なことは、明確な構造を持つことです。

もしあなたがお客さまであり、この時点に至っているのであれば、何をすべきかはもうお分かりでしょう。

インタラクティブなプレゼンテーションにおけるDRAGONの使い方、(コンピュータプログラムだけでなく)あらゆる情報を記憶しやすいように並べる方法、DRAKON言語やすべてのグラフィカル言語に対する批判など、舞台裏には多くのトピックが残されています。

もし興味があれば、DMでご連絡いただくか、この記事にコメントを残してください。ディスカッションは大歓迎です。V.D.ParondzhanovのWebサイトもご訪問ください。そこでは、もっとたくさんのものを見つけることができます。

このアプローチに興味を持ってもらえたこと、そして、この記事を読んだ人の少なくとも2、3人がこの素晴らしいツールを仕事に使い始めることを願っています。

この記事で説明した他のアルゴリズムのソースコードが必要な方がいらっしゃいましたら、ご連絡ください。

添付ファイル:アーカイブには、前節で説明した指標アルゴリズムを含むDRAKONエディタープロジェクトファイルが含まれています。このファイルにより、NR4指標の完全な動作コードを生成することができます。

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

添付されたファイル |
FullIndicator.zip (3.28 KB)
データサイエンスと機械学習(第15回):SVM、すべてのトレーダーのツールボックスの必須ツール データサイエンスと機械学習(第15回):SVM、すべてのトレーダーのツールボックスの必須ツール
取引の未来を形作るサポートベクターマシン(SVM)の不可欠な役割をご覧ください。この包括的なガイドブックでは、SVMがどのように取引戦略を向上させ、意思決定を強化し、金融市場における新たな機会を解き放つことができるかを探求しています。実際のアプリケーション、ステップバイステップのチュートリアル、専門家の洞察でSVMの世界に飛び込みましょう。現代の複雑な取引をナビゲートするのに不可欠なツールを装備してください。SVMはすべてのトレーダーのツールボックスの必需品です。
ペアトレード ペアトレード
本稿では、ペアトレードについて、その原理は何か、実用化の見込みはあるのかを考えてみたいと思います。また、ペアトレード戦略にも挑戦します。
ニューラルネットワークが簡単に(第58回):Decision Transformer (DT) ニューラルネットワークが簡単に(第58回):Decision Transformer (DT)
強化学習の手法を引き続き検討します。この記事では、一連の行動を構築するパラダイムでエージェントの方策を考慮する、少し異なるアルゴリズムに焦点を当てます。
MetaTrader 5用のMQTTクライアントの開発:TDDアプローチ(第2回) MetaTrader 5用のMQTTクライアントの開発:TDDアプローチ(第2回)
この記事は、MQTTプロトコルのネイティブMQL5クライアントの開発ステップを説明する連載の一部です。今回は、コードの構成、最初のヘッダーファイルとクラス、そしてテストの書き方について説明します。この記事には、テスト駆動開発(Test-Driven-Development)の実践と、それをこのプロジェクトにどのように適用しているかについての簡単なメモも含まれています。