![アルゴリズム取引システムを設計する理由と方法を学ぶ](https://c.mql5.com/2/49/learnhow_your_trading_system_600x314.jpg)
アルゴリズム取引システムを設計する理由と方法を学ぶ
はじめに
プログラミングやコーディングの重要性が世界のあらゆる分野で日々高まっていることは間違いありません。プログラミングやコーディングが私たちの生活を楽にするだけでなく、望みや事前に決定したものに沿った正確な出力を保証するのにどのように貢献できるかを観察できます。
取引の世界(この壮大な分野とキャリア)に関して言えば、プログラミングまたはコーディングによってプログラムから得たいものを正確に持つ優れたプログラムを完了した後、作成されたプログラムを通じて取引が簡単かつ体系的になり、その容易さと自動化が実現します。コーディングの世界は多くの利益をもたらすことができますが、私の意見では、コーディングから取引への最も重要な利益は、規律を守るように訓練されるのを助けることです。トレーダーは皆、取引決定で規律を守るという課題が常にあることを知っています。規律は取引と投資の結果に影響を与える大きくて重要な特性であるため、取引で規律を保つことはオプションではありません。いつも言っていますが、規律は取引と生活全体での成功の鍵です。簡単な方法で規律を特定することは、周囲の状況が何であれ、適切なタイミングでしなければならないことをすることを意味します。つまり、これを達成するのに役立つツールを見つけるときは、注意深く、それが何であるかを学ぶ必要があります。そして、これに適したツールはコーディングです。
ご存知のように、取引中に規律を保つのを妨げることになる最も一般的な要因は感情であり、これらの感情を回避するか、これらの感情が取引決定に及ぼす影響を否定的に回避する必要があります。人間の干渉なしに、事前決定されたパラメータで機能するシステムがあったらどうなるか想像してみてください。この場合、取引決定に対する感情の悪影響は回避されます。良いニュースは、それを行うのに役立つツールがあることです。ここでは、MetaTraderプラットフォーム用のMQL(MetaQuotes言語)について説明します。この優れたプログラミング言語やツールは、特定のアクションまたは特定の取引決定を保証する特定のパラメータを使用して取引システムを設計するのに役立ちます。
この概念についてもっと理解したい場合は、この例に言及しましょう。2人の投資家(A&B)がいて、取引ストラテジーが同じで上昇トレンドの間に買って保持しトレンドが逆転するときに売るとしますが、それぞれの振る舞いは異なります。投資家Aは規律がありますが、投資家Bにはありません。以下の図を見てください。
前の図によると、良い結果を得るには規律が不可欠であり、規律の欠如は悪い結果につながることが明らかですが
この記事では、シンプルな取引システムである単純移動平均クロスオーバーを共有し、MQL5コーディングの基本のいくつかを例と共有して、これらの基本を実践し、深く理解することで、独自のシステムを設計する方法を学びます。目的は、このすばらしいツールを使用して何ができるかについての概要を説明することです。
この記事の主な目的は、いくつかのMQL5の基本を説明した後で、初心者が簡単な取引システムのアイデアのためにMQL5の基本を学ぶことによってMQL5でアルゴリズム取引システムを設計する方法を学ぶガイドを提供し、記事内で段階的にコーディングすることです。 スクリプトでコーディングし、コード実行後に結果を表示します。理解を深めるために、ここで読む内容を自分で適用してコーディングすることをお勧めします。これは、言及されたコードの概念を深く理解するのに役立ちます。また、この記事で作成されたすべてのコード、プログラム、取引ストラテジーは、教育目的でのみ設計されており、他の目的がないことに注意してください。また、コードの記述にはMQL5を使用します。
アルゴリズム取引を設計するために必要なもの
この部分では、ツールとして持ちたいもの、そしてこれらのツールについて知りたいのことを説明します。
- MetaTrader 5プラットフォーム(MetaTrader 5ターミナル): ターミナルを介して注文を実行し、コードをテストします。MetaTraderは非常に人気のある取引プラットフォームです。
デモ口座: 証券会社にデモ口座を開設して、同じ市場環境でリスクのない取引ストラテジーをテストするための仮想通貨を手に入れることができます。口座で取引を実行するプログラムを作成して実行する必要があるため、コーディングにはリアル口座ではなく、このデモ口座を使用してください。
MetaQuotes言語エディター: コードやプログラムを記述します。次のスクリーンショットは、MetaTraderとともにインストールされているMetaQuotes言語エディターを開く方法を示しています。3つの方法があります。
- [ツール]メニューをクリックしてから、MetaQuotes言語エディターをクリックします。
または、MetaQuotesエディターアイコンをクリックします。
または、開いているターミナルでキーボードからF4ボタンを押します。
次のスクリーンショットをご覧ください、プログラムを書いて取引システムを設計するための作業のほとんどはここで行われます。
次に、このエディターを使用して最初のコードを作成する必要があるため、次の手順に従ってその方法を確認してください。
[新規]をクリックすると、複数の種類のプログラムから選択できます。
ここで言及する必要があるのは、エキスパートアドバイザー、カスタムインジケーター、スクリプトです。
- エキスパートアドバイザー: EAは、設定したパラメータに従って分析および取引プロセスを自動化するために開発および使用されるターミナル内のプログラムです。
- カスタム指標: コード化されたプログラムです。 基本的に、事前に計算された依存関係をグラフィカルに表示することを目的としています。
- スクリプト: 任意のアクションを1回実行することを目的としたプログラムであり、分析機能と取引機能の両方を実行できます。エキスパートアドバイザーとは異なり、ティックではなく要求に応じて実行されます。
Hello World!プログラム
この部分では、最初のプログラムと最初のコードをMQL5で作成する方法を学習します。プログラミングまたはコーディングのすべての初心者の旅は、「Hello World」コードをコーディングすることから始まります。まず、ターミナル画面に「Hello World」を出力するプログラムを作成することから始めます。やってみましょう…
上記のようにMetaEditorを開き、[新規]をクリックして、オプション(スクリプト)から選択し、[次へ]をクリックします。
[次へ]をクリックすると、次のウィンドウが表示されます。必要なスクリプトのデータを入力します。
- 名前はスクリプトの名前です
- 作成者はスクリプト作成者です
- リンクがリンクです
- パラメータはスクリプトに設定する必要のあるパラメータですが、このスクリプトにはパラメータを設定しないため、スキップします。
[完了]をクリックすると、次のウィンドウが開きます。このウィンドウでプログラムがコーディングされます。 前に述べたように、ターミナルで「Hello World!」を表示するプログラムをここで設計する必要があります。 2つの中括弧の間にコードを書き始めます。
ここでは以下を使用します。
- 警告: これは、私が決定した内容を出力するか、プログラムで事前に定義されたメッセージ(ここでは「Hello World!」)を表示します。
- ( “ ”): 欲しいものまたはあらかじめ決められたメッセージ「Hello World!」の間に書き込むこと。 または他の何か。
- ; - 文を区切ります。
コードは次のようになります。
//+----------------------------------------------------------+ //| Hello World!.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+----------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+----------------------------------------------------------+ //| Script program start function | //+----------------------------------------------------------+ void OnStart() { Alert("Hello World!"); } //+----------------------------------------------------------+
コードを記述したら、[コンパイル]をクリックし、エラーや警告がないことを確認します。次の図で説明したのと同じようにプログラムが実行されるようにするには、コードのコンパイル後に[エラー]タブにエラーがないようにする必要があります。次に、F4キーを押してターミナルに移動し、コードをテストします。
取引ストラテジーのアイデア(2つの単純移動平均クロスオーバー)
この部分では、教育目的でのみ取引ストラテジーのアイデアを紹介します。これは、MQL5の基本とMQL5でのプログラミング方法の学習を支援することを目的としています。
免責事項
情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。過去の実績は将来の結果を保証するものではありません。これらの資料を取引口座で使用することを選択した場合は、自己責任で使用してください。
ここで、ストラテジーのアイデアは、2つの単純移動平均指標のシグナルからの確認を使用してトレンドで取引を試みることです。
- 単純移動平均は、特定の期間の平均終値を計算するテクニカル指標です。そのシグナルが価格アクションのシグナルの後に来るため、この指標は遅れています。
- ストラテジーは次のとおりです。
- より短い単純移動平均(その周期は20)が、より長い単純移動平均(その周期は50)と交差してそれを超える場合、シグナルは買いです。
- より短い単純移動平均(周期は20)が、より長い単純移動平均(周期は50)と交差してそれを下回る場合、シグナルは売りです。
ここでは、それを行うためのプログラムを設計する必要があります。
アルゴリズム取引システムの青写真
この部分では、システムを簡単かつスムーズにコーディングするために実行する必要のある非常に重要な手順について説明します。この手順は、システムに正確に実行させたい一連の手順としてストラテジーと取引のアイデアの青写真を作成することです。これは、たとえば、明確な青写真を提供する図を使用して行うことができます。次はここでの(2つの単純移動平均クロスオーバー)システムの青写真の例であり、コーディングが必要なものと、このシステムから得られると期待されるものを明確に示しています。
まずMQL5の基本のいくつかを理解してから、設計に必要なものを使用しましょう。
変数とその型および使用方法
この部分では、以下を特定して理解します。
- 変数とは何か
- 変数の型
- 使用法
一般的に、プログラムでは、データ値は定数または可変になります。値が変数の場合、プログラムとユーザーが変更できます。変数はメモリの場所で、その場所に関連付けられている名前を持ちます。したがって、メモリ位置はデータを保持するために使用されます。MQL5のプログラムには、数十から数百の変数を含めることができます。各変数の非常に重要な特性は、プログラムでその値を使用できるということです。この可能性の制限は、変数の値が使用可能なプログラム内の場所である変数スコープに関連しています。すべての変数にはスコープがあります。
MQL5にはスコープに応じてローカルとグローバルの2種類の変数があります。ローカル変数は、関数内で宣言された変数です。ローカル変数のスコープは、変数が宣言されている関数の本体です。ローカル変数は、その型に対応する定数または式で初期化できます。グローバル変数は、すべての関数を超えて宣言されます。グローバル変数のスコープはプログラム全体です。グローバル変数は、その型に対応する定数(式ではない)によってのみ初期化できます。グローバル変数は、特殊関数の実行を示す前に1回だけ初期化されます。
変数のスコープに関係なく、次の型の変数があります。
- intは数値型です。さまざまな長さの数値を格納するためのさまざまな種類の整数があります。
- double: 取引で使用される数値を処理するプログラムを構築するには、浮動小数点数を管理できるデータ型が必要です。したがって、MetaTraderは、これらのデータを処理するためにfloatおよびdoubleデータ型を提供します。それらの違いは、メモリに割り当てられたバイト(floatは4バイト、doubleは8バイト)で、最小値と最大値は次のようになります。
- float - 最小1.175494351e-38、最大3.402823466e+38
- double - 最小2.2250738585072014e-308、最大1.7976931348623158e+308
これらの型のデータを宣言するには、floatキーワードとdoubleキーワードを使用します。 - stringは非常に重要なデータ型であり、MQL5コーディングでも広く使用されています。文字列を使用すると、英数字の文字列を格納および操作できます。
- bool - ブール値は、trueまたはfalseのいずれかの値をとることができる論理型です。
変数の使用例を見てみましょう。
//+------------------------------------------------------------------+ //| Variables.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int myInteger = 5; double myDouble = 10.56; string myString = "My name is Mohamed"; bool myBoolean = true; Alert(myInteger); Alert(myDouble); Alert(myString); Alert(myBoolean); } //+------------------------------------------------------------------+
前のコードをコンパイルした後、上記のように記述した場合、エラーや警告は表示されず、以下のスクリーンショットのようなアラートウィンドウが表示されます。
次は変数を使用する別の例です。
- message1の等価値
- Cの等価値
- resultの等価値
- message2の等価値
//+------------------------------------------------------------------+ //| Variables 2.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int A = 10; int B = 5; int C; double var1 = 2.5; double var2 = 4; double result = var1 / var2; string greeting = "Hello"; string space = " "; string name = "Mohamed"; string message1; string message2; C = A + B; message1 = greeting + space + name; message2 = "Value of A is: " + string(A); Alert(message1); Alert(C); Alert(result); Alert(message2); } //+------------------------------------------------------------------+
ブール演算
ブール値: 論理演算に対してtrueまたはfalseを返すだけです。
- ==は等しいことを意味します
- !=は等しくないことを意味します
- <はより小さいを意味します
- <=は以下を意味します
- >はより大きいことを意味します
- >=は以上を意味します
//+------------------------------------------------------------------+ //| Boolean Operations.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { bool result = 4 < 5; Alert (result); //true } //+------------------------------------------------------------------+
ここでは、アラートメッセージでtrueを4<5として返す必要があります。
Whileループ
while演算子は、チェック式と演算子で構成されており、これらを実行する必要があります。式がtrueの場合、式がfalseになるまで演算子が実行されます。次の例では、最初にループの開始と終了を知るために開始時にアラートを出し、次にプログラムがカウンタの値をチェックし、3未満の場合はその値を表示することを理解できます。次に、この場合=または> 3になるまで前の結果に1を追加し、ループが終了したときに最後のアラートを出します。したがって、このコードからのStart of script、1、2、Loop has finishedのメッセージがアラートメッセージに表示されます。//+------------------------------------------------------------------+ //| While Loop.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //While (Loop) Alert("Start of script"); int counter = 1; while(counter < 3) //true? { Alert(counter); counter = counter + 1; } Alert("Loop has finished"); }
Forループ
for演算子は、3つの式と実行可能演算子で構成されています。
for(expression1; expression2; expression3)
operator;
Expression1は、ループの初期化を記述します。Expression2は、ループ終了の条件をチェックします。trueの場合、forのループ本体が実行されます。ループは、falseになるまでexpression2を繰り返します。falseの場合、ループは終了し、次のオペレーターに制御が渡されます。Expression3は、各反復後に計算されます。
次のforのループ例では、コードを実行すると、Helloのメッセージが5つ(I = 0、I = 2、…………、I = 4)になると予想できます。その後will = 5になるので、ループは終了します。
//+------------------------------------------------------------------+ //| For Loop.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { for(int i=0; i<5 ; i++) { Alert("Hello"); } } //+------------------------------------------------------------------+
If、Elseステートメント
IF-ELSE演算子は、選択が必要な場合に使用されます。正式には、構文は次のとおりです。
if (式)
operator1
else
operator2
式がtrueの場合、operator1が実行され、operator2に続く演算子が制御されます(operator2は実行されません)。式がfalseの場合、operator2が実行されます。
例: 次の例では、最初に呼買値のアラートを受信する必要があります。次に、入札値>1.146600かどうかを判断すると、The price is above 1.146600 -> BUYというアラートが表示されます。そうでない場合は、The price is below 1.146600 -> SELLというアラートが表示されます。以下はコードとその実行結果です。
//+------------------------------------------------------------------+ //| If-else statement.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { double level = 1.146600; double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); Alert("Bid Price = " + string(Bid)); if(Bid > level) { Alert ("The price is above " + string(level) + " -> BUY"); } // What if the condition is false and we need to take an action also here we can use else function instead of writing another if code else { Alert ("The price is below " + string(level) + " -> SELL"); } } //+------------------------------------------------------------------+
トレーダーによる入力
この部分では、コードを調整する代わりに、プログラムの入力または優先パラメーターを決定する方法を学習します。
Properties (#property): すべてのMQL5プログラムでは、プログラムを明示的に起動しなくても、クライアントターミナルがプログラムを適切に処理できるように、#propertyという名前の追加の特定のパラメータを指定できます。
script_show_inputs: スクリプトを実行する前にプロパティを含むウィンドウを表示し、この確認ウィンドウを無効にします
入力変数: 入力ストレージクラスは外部変数を定義します。入力修飾子がデータ型の前に示されます 。
//+------------------------------------------------------------------+ //| Trader Inputs.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 10; input int StopLoss = 10; void OnStart() { double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10) double StopLossLevel = Bid - StopLoss * 0.00001; Alert("Price now = " + string(Bid)); Alert ("TakeProfitLevel = ", TakeProfitLevel); Alert ("StopLossLevel = ", StopLossLevel); } //+------------------------------------------------------------------+
注文を開く
この部分では、注文を開くためのコードの記述方法を紹介します。
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); } } //+------------------------------------------------------------------+
エラー処理テクニック
プログラムを実行すると、誰でもクラッシュを見つけることができ、何かがうまくいかなかった。したがって、実行されたすべての注文またはコードをチェックし、問題が発生した場合に警告するために、この手法をコードに含める必要があります。言い換えれば、それはトレーダーが彼と彼の資金を不適切な状況から保護するための保護技術です。
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); if (ticket <= 0) { Alert("Error!"); //in Case of error and the order did not open, appears "Error!" } else { Alert("Your ticket # is: " + string(ticket)); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); } } } //+------------------------------------------------------------------+
注文の決済
この部分では、注文を開閉するコードを作成して、注文を閉じる方法を学びます。//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); Sleep(2000); trade.PositionClose(ticket,-1); Alert("Order Closed..."); } } //+------------------------------------------------------------------+
OrderModifyによる注文の調整
この部分では、順序の変更に役立つコードを作成する方法を学習します。以前に開いた注文または保留中の注文の特性を変更します。
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); double TakeProfitLevel2 = (TakeProfitLevel+0.00100); double StopLossLevel2 = (StopLossLevel-0.00050); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); Sleep(5000); trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2); Alert("Order Modified..."); Alert("Modified TakeProfit = ", TakeProfitLevel2); Alert("Modified StopLoss = ", StopLossLevel2); } } //+------------------------------------------------------------------+
2つの単純移動平均クロスオーバーシステム
この部分では、すべてをまとめて、2つの単純な移動平均クロスオーバーをコーディングします。上記の青写真に従って、すべてが必要なすべてを実行します。
ここでは、MetaEditorから[新規]をクリックして新しいプロジェクトを開始するときにエキスパートアドバイザーを選択します。
すべてを覚えておくために、ここに詳細な取引システムの青写真があります。
- 短い単純移動平均(期間は20)が長い単純移動平均 (期間は50) と交差する場合、 シグナルは買いです。
- 短い単純移動平均(期間は20)が長い単純移動平均(期間は50)と交差してそれを下回る場合、シグナルは売りです。
//+------------------------------------------------------------------+ //| SMA crossover.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //create an array for several prices double myMovingAverageArray1[], myMovingAverageArray2[]; //define the properties of MAs - simple MA, 1st 20 / 2nd 50 int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE); int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE); //sort the price arrays 1, 2 from current candle ArraySetAsSeries(myMovingAverageArray1,true); ArraySetAsSeries(myMovingAverageArray2,true); //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1); CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2); //Check if we have a buy entry signal if ( (myMovingAverageArray1[0]>myMovingAverageArray2[0]) && (myMovingAverageArray1[1]<myMovingAverageArray2[1]) ) { Comment("BUY"); } //check if we have a sell entry signal if ( (myMovingAverageArray1[0]<myMovingAverageArray2[0]) && (myMovingAverageArray1[1]>myMovingAverageArray2[1]) ) { Comment("SELL"); } } //+------------------------------------------------------------------+
プログラムを実行すると、このストラテジーに従って現在のシグナル(買いまたは売り)とともにチャートにコメントが表示されます。これを次の図に示します。
[アルゴリズム取引を許可する]オプションを有効にして、[OK]をクリックします。その後、エキスパートアドバイザーがチャートに添付され、正常にロードされるとメッセージが[ジャーナル]タブに表示されます。
そこで、自動化された2つの単純移動平均クロスオーバープログラムを作成して実行しました。そして、ここで言及したいのは、これは私たちが取引のためにコーディングできるものの簡単な例であるということです。ただし、このすばらしいツールMQL5を使用して、他の取引ストラテジーをコーディングおよび自動化できます。
繰り返しになりますが、この記事の主な目的はこのストラテジーを使用することではありませんが、主な目的はMQL5の基本のいくつかを学び、私たちができることを想像し、取引をより簡単で収益性の高いものにするために何を作成できるかを学ぶことです。したがって、このストラテジーには多くの機能強化が必要であり、それを使用する場合は、それが唯一の責任になります。
終わりに
MQL5は、優れた収益性の高いアルゴリズム取引システムを設計することで、取引を容易にし、収益性を高めるのに役立つ優れたツールです。したがって、このすばらしいツールの学習と使用への投資は、非常にやりがいのある投資になります。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/10293
![DoEasyライブラリのグラフィックス(第94部): 複合グラフィカルオブジェクトの移動と削除](https://c.mql5.com/2/44/MQL5-avatar-doeasy-library3-2__6.png)
![MetaTrader 5のWebSocket — WindowsAPIの使用](https://c.mql5.com/2/44/huge81r.png)
![単一チャート上の複数インジケータ(第02部): 実験1](https://c.mql5.com/2/45/variety_of_indicators.png)
![マーケットからエキスパートアドバイザーを選択する正しい方法](https://c.mql5.com/2/44/mql5_avatar_adviser_choose.png)
![MQL5 - MetaTrader 5クライアントターミナルにビルトインされたトレードストラテジーの言語](https://c.mql5.com/i/registerlandings/logo-2.png)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
こんにちは、@Mohamed Abdelmaaboudです。
MT4で同じことをする方法と、EAを作成するためにカスタムインジケータを 使用する方法を説明してもらえますか?
こんにちは、Laudable222です。
MQL4がサポートされないので、MQL5がサポートされないので、記事で公開することはできません。
親愛なるモハメド。
私はトレーディングの世界では新参者です。最初の質問は、"いつポジションをオープンしクローズするか "です。
私の大きな疑問の答えに導いてくれる、分かりやすい記事に大感謝です。
あとは、トレーディングの変化や市場の問題を感じるために、多くの練習をしなければならないと思います。
ありがとうございました。
トト・サローノ
親愛なるモハメド。
私はトレーディングの世界では新参者です。最初の質問は、"いつポジションをオープンしクローズするか "です。
私の大きな疑問の答えに導いてくれる、分かりやすい記事に大感謝です。
あとは、トレーディングの変化や市場の問題を感じるために、多くの練習をしなければならないと思います。
ありがとうございました。
トト・サローノ
親愛なるTotoさん。
私の記事がお役に立てたようで、うれしく思います。
そして、私がここで確認しなければならないのは、トレーディングやその他の分野で成功するためには、練習と一貫性が重要な鍵であるということです。
幸運を祈ります。
親愛なるTotoさん。
私の記事がお役に立てたようで、うれしく思います。
そして、私がここで確認しなければならないのは、練習と一貫性が、取引やその他の分野で成功するための重要な鍵であるということです。
頑張ってください。
全くその通りです......!
あなたの記事とシンプルなEAを作るためのガイダンスに出会えて、本当にラッキーでした。
良い一日をお過ごしください。