トレーダーライフハック:"静かな"最適化とプロットトレード分布
目次
分布図のメリットは何か?
新たなトレード戦略の開発は、結局のところ、どのように成功したのかを知ることはできません。トレードロボットは、ほとんどの相場参入のシグナルの生成に使用されるルールの基礎となる、エントリーパラメータがあります。その場合には、トレードロボットを書き込んだ後、単に良好なバックテスト結果を示すことになるエントリーパラメータを見つけ、戦略テスターに依存するだけです。
しかし、この記事では、トレードのロボットを作成するプロセスで、異なる考え方を提供します。エントリーパラメータの最適化を実行する前に、エントリの時間に応じて利益と損失の分布を見ます。多くの戦略が相場に参入するための「良好」と「不利」な瞬間があります。この記事では、ポジション収益性の分布図をプロットします。これらのチャートの後、異なる視点からの戦略が可能となります。
チャートは Googleのチャートを呼び出すことにより、プロットされています。そして、視覚的な表現に、HTMLが選択されています。概略的に、分布図、表などのページが表示されます。
図1。HTMLレポートの外観
最初の2行は、全体のトレード口座の要約統計量で、後続の行は、時間、日や月によってエントリの観点から各シンボルの統計を表します。
クイックスタート
DistributionOfProfits.mqh"ファイルは... \MQL5\Include\フォルダに、データカタログに配置する必要があります。est_report.mq5スクリプトは、指定された「開始」日から分析のグラフをプロットするための呼び出しを行います。
+------------------------------------------------------------------+ //| test_report.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | +------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //--- input datetime start=D'2010.05.11 12:05:00'; #include <DistributionOfProfits.mqh> //--- CDistributionOfProfits Analysis; +------------------------------------------------------------------+ //|スクリプトプログラムスタート関数| +------------------------------------------------------------------+ void OnStart() { //--- Analysis.AnalysisTradingHistory(start); Analysis.ShowDistributionOfProfits(); } +------------------------------------------------------------------+
1。トレード履歴からポジションの再構築
ポジションの再構築は、何にために?収益とエントリー時間のポジションの重要なパラメータを知るためのメソッドであるということです。用語を定義します。
position profit - 指定されたポジションにあるすべてのトレードの利益総額;
position opening time - このポジションの時間
ターミナルは、オーダーや情報としてトレード履歴があります。しかし、必要なのはポジションの履歴です。このため、トレードヒストリーに目を向けると、トレードやオーダーの ORDER_POSITION_IDプロパティの DEAL_POSITION_IDプロパティに焦点を当てます。これらの特性を選択する理由は以下の通りです。実際には、ぞれのポジションが変更され、開いたり閉じた各オーダー(ORDER_POSITION_ID)とトレード(DEAL_POSITION_ID)で指定された1意の識別子( POSITION_IDENTIFIER)があります。
図2。POSITION_IDENTIFIER、DEAL_POSITION_IDとORDER_POSITION_IDの接続
同じDEAL_POSITION_IDとトレードがトレード履歴から分離されている場合、ポジションの再構成を保証することができます。ポジション反転の状況は、言及する価値があります。POSITION_IDENTIFIERのドキュメントから:
ポジション反転が逆転につながったオーダーのチケットにPOSITION_IDENTIFIERを変更します。
ポジションが逆転した後、その識別子を変更した場合、別のポジションになることを意味します。どのように識別子は、情報に割り当てられていますか?逆転を引き起こした処理は、前または逆の(新しい)ポジションに属しているのでしょうか?この質問に簡単な例を答えるために - position_reversal_v1.mq5スクリプトがあります。
このスクリプトは、3トレードのアクションを実行します。
- 0.01 買い - ポジション
- 0.02 売り - リバースポジション
- 決済
開始時間はスクリプトのエントリーパラメータで指定する必要があります。このパラメータは、トレード履歴をリクエストするために使用されます。この例では:スクリプトは10時32分59秒で2016年9月5日に実行され、エントリーパラメータは、D'2016年9月5日10時32分〇〇秒'の値を持つ小さなギャップを持っていました。
各アクションの後、識別子、ならびに処理の情報履歴とDEAL_POSITION_IDを出力します。ここでは、Printは、次のとおりです。
10:32:59.487 position_reversal_v1 (EURUSD,M3) Buy 0.01, "EURUSD" 10:33:00.156 position_reversal_v1 (EURUSD,M3) Position EURUSD POSITION_IDENTIFIER #96633525 10:33:00.156 position_reversal_v1 (EURUSD,M3) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96633525 profit 0.00 10:33:00.156 position_reversal_v1 (EURUSD,M3) 10:33:06.187 position_reversal_v1 (EURUSD,M3) Sell 0.02, "EURUSD" 10:33:06.871 position_reversal_v1 (EURUSD,M3) Position EURUSD POSITION_IDENTIFIER #96633564 10:33:06.871 position_reversal_v1 (EURUSD,M3) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96633525 profit 0.00 10:33:06.871 position_reversal_v1 (EURUSD,M3) Deal EURUSD volume 0.02 DEAL_POSITION_ID #96633525 profit -0.06 10:33:06.871 position_reversal_v1 (EURUSD,M3) 10:33:12.924 position_reversal_v1 (EURUSD,M3) PositionClose, "EURUSD" 10:33:13.593 position_reversal_v1 (EURUSD,M3) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96633525 profit 0.00 10:33:13.593 position_reversal_v1 (EURUSD,M3) Deal EURUSD volume 0.02 DEAL_POSITION_ID #96633525 profit -0.06 10:33:13.593 position_reversal_v1 (EURUSD,M3) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96633564 profit -0.10 10:33:13.593 position_reversal_v1 (EURUSD,M3)
最初のトレード操作 - 0.01を買い。POSITION_IDENTIFIERは、96633525に等しいです。また、トレード履歴は,- 96633525のDEAL_POSITION_IDを割り当てられました。この処理では、DEAL_POSITION_IDはトレードがポジションに属することを意味するポジションのPOSITION_IDENTIFIERと一致します。
第2の操作は - 0.02を売り。この動作は逆のポジションを引き起こした:「0.01 売ります」。現在ポジションのPOSITION_IDENTIFIERを変更し、96633564となりました。新しいポジションが得られたことを意味します。そして、その時のトレードのヒストリーの中でどのようになりますか?トレード履歴は現在96633525に等しいDEAL_POSITION_IDを持つ2つの情報があります。同時に、第2の処理は「利益-0.06」を有しています。
そのため、ポジションの逆転につながったトレードは、前のポジションに属します。
第3のトレード操作 - 0.01を買い。96633564及び第2の96633525に等しいDEAL_POSITION_IDを持っていますが、この識別子は変更されました。この段階では、トレードのヒストリーは情報が含まれています。第3の処理は最初の逆転に起因する、第2のポジションに属しています。
1.1に基づいて、正確に再構成された各ポジションの利益計算のアルゴリズムを決定することが可能です。同じDEAL_POSITION_IDを持つすべてのトレードの合計はDEAL_POSITION_IDに等しいPOSITION_IDENTIFIERを持っているポジションの計算された利益になります。関連トレードの操作が売買されているよう、処理の種類に制限を導入する必要があります。 ENUM_DEAL_TYPE列挙から以下の情報を採取する方法は、次のとおりです。
ENUM_DEAL_TYPE
ID | Description |
DEAL_TYPE_BUY | Buy |
DEAL_TYPE_SELL | Sell |
最初のスクリプトを若干変更し、 position_reversal_v2.mq5の名前で保存されました。 position_reversal_v2.mq5スクリプトはまだ、トレーディングブロックを含んでいます - 、0.01買い、0.02売り、決済。再構築されたポジションの利益を計算します。このスクリプト内の新規性は、PrintProfitPositions()です。より詳細に、この関数を調べてみましょう:
+------------------------------------------------------------------+ //|Printプロフィットポジション| +------------------------------------------------------------------+ void PrintProfitPositions(void) { //---構造利益のポジション。 struct struct_positions { long position_id; double position_profit; //---コンストラクタ struct_positions() {position_id=0; position_profit=0.0;} }; struct_positions arr_struct_positions[]; //---リクエストのトレードのヒストリー HistorySelect(start,TimeCurrent()); uint total =HistoryDealsTotal(); ulong ticket =0; long deal_id =0; double profit =0; long type =0; //---すべての情報 for(uint i=0;i<total;i++) { //---チケットを取得 if((ticket=HistoryDealGetTicket(i))>0) { //--- GETの情報のプロパティ deal_id =HistoryDealGetInteger(ticket,DEAL_POSITION_ID); profit =HistoryDealGetDouble(ticket,DEAL_PROFIT); type =HistoryDealGetInteger(ticket,DEAL_TYPE); //---買いまたは売り if(type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL) { bool seach=false; int number=ArraySize(arr_struct_positions); for(int j=0;j<number;j++) { if(arr_struct_positions[j].position_id==deal_id) { arr_struct_positions[j].position_profit+=profit; seach=true; break; } } if(!seach) { ArrayResize(arr_struct_positions,number+1); arr_struct_positions[number].position_id=deal_id; arr_struct_positions[number].position_profit+=profit; } } } } //--- int number=ArraySize(arr_struct_positions); for(int i=0;i<number;i++) { Print("id ",arr_struct_positions[i].position_id," profit ",arr_struct_positions[i].position_profit); } }
まず、struct_positions構造体が宣言されています。
//---構造利益のポジション。 struct struct_positions { long id; double profit; //---コンストラクタ struct_positions() {id=0; profit=0.0;} }; struct_positions arr_struct_positions[];
struct_positions構造体には、2つのフィールドがあります。
id — ポジション識別子;
profit - ポジション利益。
arr_struct_positionsは[]配列が宣言。
履歴を呼び出すための補助変数のブロックは、次のとおりです。
//---リクエストのトレードのヒストリー HistorySelect(start,TimeCurrent()); uint total =HistoryDealsTotal(); ulong ticket =0; long deal_id =0; double profit =0; long type =0;
情報の履歴を呼び出すためのサイクルが続きます。
//---すべての情報 for(uint i=0;i<total;i++) { //---チケットを取得 if((ticket=HistoryDealGetTicket(i))>0) { ... //---買いまたは売り if(type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL) { ... } } }
前述したように、「買い」と「売り」の情報に焦点を当てることを忘れないでください。
そして、ここでコード arr_struct_positions構造です。 position_idフィールドや情報の履歴からDEAL_POSITION_IDを検出した場合、現在の処理の利益は、配列の対応するインデックスに加算されます。
bool seach=false; int number=ArraySize(arr_struct_positions); for(int j=0;j<number;j++) { if(arr_struct_positions[j].id==deal_id) { arr_struct_positions[j].profit+=profit; seach=true; break; } } if(!seach) { ArrayResize(arr_struct_positions,number+1); arr_struct_positions[number].id=deal_id; arr_struct_positions[number].profit+=profit; }
構造体の配列でトレードのないidとDEAL_POSITION_IDが存在しない場合は、、1つの要素によって増加し、この新しい要素がすぐに値がエントリーされます。
構造体の配列を満たした後、配列全体のコードを反復処理は、POSITION_IDENTIFIERとその利益を出力します。
//--- int number=ArraySize(arr_struct_positions); for(int i=0;i<number;i++) { Print("id ",arr_struct_positions[i].id," profit ",arr_struct_positions[i].profit); }
position_reversal_v1.mq5スクリプトへの追加 - トレード履歴からそのパラメータとすべてのオーダーの出力を追加します。このスクリプトは、 position_reversal_v3.mq5として保存されます。
2016.09.06 15:05:34.399 position_reversal_v3 (USDJPY,M1) Buy 0.01, "EURUSD" 2016.09.06 15:05:35.068 position_reversal_v3 (USDJPY,M1) Position EURUSD POSITION_IDENTIFIER #96803513 2016.09.06 15:05:35.068 position_reversal_v3 (USDJPY,M1) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96803513 profit 0.00 2016.09.06 15:05:35.068 position_reversal_v3 (USDJPY,M1) Order EURUSD initial_volume 0.01 ORDER_POSITION_ID #96803513 ORDER_TICKET 96803513 2016.09.06 15:05:35.068 position_reversal_v3 (USDJPY,M1) 2016.09.06 15:05:41.088 position_reversal_v3 (USDJPY,M1) Sell 0.02, "EURUSD" 2016.09.06 15:05:41.767 position_reversal_v3 (USDJPY,M1) Position EURUSD POSITION_IDENTIFIER #96803543 2016.09.06 15:05:41.767 position_reversal_v3 (USDJPY,M1) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96803513 profit 0.00 2016.09.06 15:05:41.767 position_reversal_v3 (USDJPY,M1) Deal EURUSD volume 0.02 DEAL_POSITION_ID #96803513 profit -0.08 2016.09.06 15:05:41.767 position_reversal_v3 (USDJPY,M1) Order EURUSD initial_volume 0.01 ORDER_POSITION_ID #96803513 ORDER_TICKET 96803513 2016.09.06 15:05:41.767 position_reversal_v3 (USDJPY,M1) Order EURUSD initial_volume 0.02 ORDER_POSITION_ID #96803543 ORDER_TICKET 96803543 2016.09.06 15:05:41.767 position_reversal_v3 (USDJPY,M1) 2016.09.06 15:05:47.785 position_reversal_v3 (USDJPY,M1) PositionClose, "EURUSD" 2016.09.06 15:05:48.455 position_reversal_v3 (USDJPY,M1) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96803513 profit 0.00 2016.09.06 15:05:48.455 position_reversal_v3 (USDJPY,M1) Deal EURUSD volume 0.02 DEAL_POSITION_ID #96803513 profit -0.08 2016.09.06 15:05:48.455 position_reversal_v3 (USDJPY,M1) Deal EURUSD volume 0.01 DEAL_POSITION_ID #96803543 profit -0.05 2016.09.06 15:05:48.455 position_reversal_v3 (USDJPY,M1) Order EURUSD initial_volume 0.01 ORDER_POSITION_ID #96803513 ORDER_TICKET 96803513 2016.09.06 15:05:48.455 position_reversal_v3 (USDJPY,M1) Order EURUSD initial_volume 0.02 ORDER_POSITION_ID #96803543 ORDER_TICKET 96803543 2016.09.06 15:05:48.455 position_reversal_v3 (USDJPY,M1) Order EURUSD initial_volume 0.01 ORDER_POSITION_ID #96803543 ORDER_TICKET 96803561
このスクリプトは、ヘルプから次の引用を可視化します:
POSITION_IDENTIFIERは、各オープンポジションに割り当てられた固有の番号です。そのライフサイクルを通じて変化せず、ポジションを開くために使用されるためのチケットに相当します。
よって、ポジション開く時間を決定するために見つかったオーダー(ORDER_TIME_DONE)の時間をPOSITION_IDENTIFIER(POSITION_IDENTIFIER)に等しいチケット(ORDER_TICKET)とのオーダーのトレード履歴を検索し、取得します。
再構成されたポジションは、struct_positions配列に格納されます。
struct struct_positions { long id; datetime time; double loss; double profit; string symbol_name; //---コンストラクタ struct_positions() {id=0; time=0; loss=0.0; profit=0.0; symbol_name=NULL;} };
ただし、
id — ポジション識別子;
time — エントリー時間;
loss - ポジション損失、およびこのフィールドのデータは、(これはチャートのより良い視覚的に表現するために必要である)、「+」記号で書かれます
profit - ポジション利益
symbol_name - ポジションが開かれているシンボルの名前。
別のグラフをプロットするときに、トレード履歴のデータベースとして使用される構造のstruct_positions配列であるポジションに連結されています。
2。Googleのチャート
Googleのチャートサービスは、分析を表示するために使用されます。これを行うには、チャートをHTMLページに配置されます。その後、ページが(Win APIのShellExecute関数を使用して)オペレーティングシステムではデフォルトで設定され、ブラウザで開かれます。
2つのグラフの種類は、記事で使用されます。: ヒストグラムと円グラフ。詳細に調べてみましょう。
「バー」タイプは、HTMLページで、次のチャートを表示することができます:
最初のグラフのコードです。*.html の拡張子を付けて保存(またはダウンロードbar.html)とブラウザでこのファイルを開きます。
<html> <head> <!--Load the AJAX API--> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['bar']}); google.charts.setOnLoadCallback(drawChart1); function drawChart1() { var data1 = google.visualization.arrayToDataTable([ ['Symbol', 'Profit', 'Loss'], ['Si-6.16', 82.00, 944.00], ['Si-9.16', 56.00, 11.00], ['SBRF-9.16', 546.00, 189.00], ]); var options1 = { chart: { title: 'Profit/loss by Symbols', subtitle: 'Summary', }, bars: 'vertical', vAxis: {format: 'decimal'}, width: 440, height: 400, colors: ['#5b9bd5', '#ed7d31', '#7570b3'] }; var chart = new google.charts.Bar(document.getElementById('chart_div1')); chart.draw(data1, options1); } </script> </head> <body> <!--Div that will hold the pie chart--> <div id="chart_div1"></div> <br/> </body> </html>
Googleのチャートを使用するには、以下に記述されたコードの配置ルールに準拠する必要があります。
ローダファイルとライブラリファイルは、<head>のブロックに含めます:
<!--Load the AJAX API--> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript">
その後、グラフの種類と描画のデータと関数(drawChart)を指定します。
google.charts.load('current', {'packages':['bar']}); google.charts.setOnLoadCallback(drawChart1);
drawChart()関数は3つのブロックがあります。
- "var data1" - グラフをプロットする基礎として使用されるデータのブロック
- "var options1" - チャートのパラメータを指定するオプションのブロック
- チャートを表示するために、コンテナのポイントをブロックします:
function drawChart1() { var data1 = google.visualization.arrayToDataTable([ ['Symbol', 'Profit', 'Loss'], ['Si-6.16', 82.00, 944.00], ['Si-9.16', 56.00, 11.00], ['SBRF-9.16', 546.00, 189.00], ]); var options1 = { chart: { title: 'Profit/loss by Symbols', subtitle: 'Summary', }, bars: 'vertical', vAxis: {format: 'decimal'}, width: 440, height: 400, colors: ['#5b9bd5', '#ed7d31', '#7570b3'] }; var chart = new google.charts.Bar(document.getElementById('chart_div1')); chart.draw(data1, options1); }
この場合、最後のコンマ下で
['SBRF-9.16', 546.00, 189.00],
HTMLページのコードのパフォーマンスに影響を与え、大幅にデータブロックを作成するためのアルゴリズムをシンプル化していません。注意:プロットチャートは「バー」型であるため、タイプを指定します。
var chart = new google.charts.Bar(document.getElementById('chart_div1'));
コンテナ自体はに配置されています。
</script> </head> <body> <!--Div that will hold the pie chart--> <div id="chart_div1"></div> <br/> </body> </html>
この記事では、このチャートを使用します。
円グラフの作成を生成するHTMLページのコードです。*.html の拡張子を持つこのコードを保存し(または、この記事の最後の corechart.htmlファイルをダウンロード)ブラウザでこのファイルを開きます。
<html> <head> <!--Load the AJAX API--> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart2); function drawChart2() { var data2 = google.visualization.arrayToDataTable([ ['Symbols', 'Profit'], ['Si-6.16', 82.00], ['Si-9.16', 56.00], ['SBRF-9.16', 546.00], ]); var options2 = { title: 'Profit by Symbols, %', pieHole: 0.4, width: 440, height: 400, }; var chart = new google.visualization.PieChart(document.getElementById('chart_div2')); chart.draw(data2, options2); } </script> </head> <body> <!--Div that will hold the pie chart--> <div id="chart_div2"></div> <br/> </body> </html>
関数ブロックは、データ表現のわずかな変化で、上記の例と同様に配置されています。次のように円グラフの場合、データを指定する必要があります。
var data2 = google.visualization.arrayToDataTable([ ['Symbols', 'Profit'], ['Si-6.16', 82.00], ['Si-9.16', 56.00], ['SBRF-9.16', 546.00], ]); var options2 = { title: 'Profit by Symbols, %', pieHole: 0.4, width: 440, height: 400, };
プロットされたグラフは、「corechart」型であるため、以下のように、コンテナを指すブロックが見えます:
var chart = new google.visualization.PieChart(document.getElementById('chart_div2'));
chart.draw(data2, options2);
2.3。ヒストグラム(「バー」タイプ)+円グラフ( 'corechart」タイプ)+ヒストグラム(「バー」タイプ)
この例のコードは、bar_corechart_bar.htmlファイルに保存され、この記事の最後でダウンロードすることができます。例自体は(画像が縮小)次のようになります。
正しくdrawChart***()関数を表示するため、ブロックコンテナにそのポイントを配置する必要があるように、異なるチャートタイプが同時に存在している構成は、より複雑なケースです。単1ページで(たとえば、ヒストグラムと円グラフ)いくつかの種類のグラフを配置する場合、以下のメソッドがあります。
google.charts.load('current', {'packages':['bar', 'corechart']});
bar_corechart_bar.htmlファイルのスキームは次のようになります。
<html> <head> <!--Load the AJAX API--> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['bar', 'corechart']}); google.charts.setOnLoadCallback(drawChart1); google.charts.setOnLoadCallback(drawChart2); google.charts.setOnLoadCallback(drawChart4); function drawChart1() { var data1 = ... var options1 = ... var chart = new google.charts.Bar(document.getElementById('chart_div1')); chart.draw(data1, options1); } function drawChart2() { var data2 = ... var options2 = ... var chart = new google.visualization.PieChart(document.getElementById('chart_div2')); chart.draw(data2, options2); } function drawChart4() { var data4 = ... var options4 = ... var chart = new google.charts.Bar(document.getElementById('chart_div4')); chart.draw(data4, options4); } </script> </head> <body> <!--Div that will hold the pie chart--> <table> <tr> <td><div id="chart_div1"></div></td> <td><div id="chart_div2"></div></td> <td><div id="chart_div4"></div></td> </table> <br/> </body> </html>
drawChart1 と drawChart4関数はヒストグラムを描き、drawChart関数は、円グラフを描画します。
3。(現在のトレード口座の)ターミナルから分析チャートを実行
最もシンプルなオプションは、小さなスクリプトを使用することです。チャートに取り付けられたとき、ブラウザを起動し、エントリーの時間に応じてトレード分布の分析チャートを表示します。重要なことは、分析をプロットするための開始日を指定することです(「開始"エントリーパラメータ):
+------------------------------------------------------------------+ //| test_report.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | +------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //--- input datetime start=D'2010.05.11 12:05:00'; #include <DistributionOfProfits.mqh> //--- CDistributionOfProfits Analysis; +------------------------------------------------------------------+ //|スクリプトプログラムスタート関数| +------------------------------------------------------------------+ void OnStart() { //--- Analysis.AnalysisTradingHistory(start); Analysis.ShowDistributionOfProfits(); } +------------------------------------------------------------------+
ファイル"DistributionOfProfits.mqh"の分布は、システムDLLへの呼び出しを使用するので、スクリプトの実行時にDLLのインポートを許可する必要があります。
4. 戦略テスターから分析チャートを実行
例えば、(\MQL5\Experts\Examples\MACD\MACD Sample.mq5)標準的なセットから MACD Sample.mq5を使用してみましょう。変更は、元のファイルに影響を与えないように、別のフォルダにこのEAをコピーします。その後 MACD Sample report.mq5を変更します。EAを次のように変更します
+------------------------------------------------------------------+ //| MACD Sample report.mq5 | //| Copyright 2009-2016, MetaQuotes Software Corp. | //| https://www.mql5.com | +------------------------------------------------------------------+ #property copyright "Copyright 2009-2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "5.50" #property description "It is important to make sure that the expert works with a normal" #property description "chart and the user did not make any mistakes setting input" #property description "variables (Lots, TakeProfit, TrailingStop) in our case," #property description "we check TakeProfit on a chart of more than 2*trend_period bars" #define MACD_MAGIC 1234502 //--- #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\AccountInfo.mqh> #include <DistributionOfProfits.mqh> //--- input double InpLots =0.1; // ロット input int InpTakeProfit =50; // テイクプロフィット ( pips) input int InpTrailingStop =30; // (pips)トレーリングストップレベル input int InpMACDOpenLevel =3; // MACDオープンレベル input int InpMACDCloseLevel=2; // MACD close level (in pips) input int InpMATrendPeriod =26; // MAのトレンド期間// //--- int ExtTimeOut=10; //トレードの操作間の秒単位のタイムアウト CDistributionOfProfits ExtDistribution; +------------------------------------------------------------------+ //|MACDサンプルエキスパートクラス| +------------------------------------------------------------------+ class CSampleExpert { protected:
1番最後にOnTester()関数を追加します。
+------------------------------------------------------------------+ //|テスター関数| +------------------------------------------------------------------+ double OnTester() { //--- double ret=0.0; ExtDistribution.AnalysisTradingHistory(0); ExtDistribution.ShowDistributionOfProfits(); //--- return(ret); }
テストを開始する前に、ターミナルの設定でDLLの使用を許可する必要があります。
時間によって利益/損失分布のチャートを見ることができます。
収益性の高いポジションが開かれ、不採算のものは明らかです。2つの時間間隔は、チャート上にマークされています。指定された不利な時間でトレードを制限する場合はどうなりますか?損失の代わりに利益を得るために、トレードシグナルを逆にしますか?読者はこれをテストするとよいでしょう。
興味深い結果は、戦略テスターにおける多通貨EAを実行することによって得ることができます。例として、マルチ通貨エキスパートコードベースを使用します。また、#include <DistributionOfProfits.mqh>ファイルが指定され、「CCDistributionOfProfits ExtDistribution」変数は、EAのヘッダで宣言され、コードの末尾に追加されました。実行後、次の統計情報が受信されました:"TestAnalysis.htm"。
すべてのチャートがインタラクティブであることに注意してください。例えば、最初のヒストグラムで、各シンボルの値の任意の列をホバリングすることで見ることができます。
円グラフ:トレードの損益の各シンボルの寄与を示しています。
チャートの残りの部分は、ポジションエントリーの時間に応じて、シンボル毎の収益性を示しています。
「静かな」最適化
プロットトレードディストリビューションでタスクが完了しました。その時、トレード履歴がポジションに連結され、そして全ての分析チャートはポジションに排他的にプロットされています。時間、曜日及び月:利益やポジションの損失は3通りのメソッドでエントリー時間によって分析されます。
この記事に提供されたソースコードの助けを借りて、任意の戦略は、有利と不利な時間や日をチェックすることができます。代わりに最初の戦略の新しい組み合わせ、トレンドとカウンタートレンド戦略を得るかもしれません。(ヨーロッパ、アメリカ、アジア)のトレード時間帯を回避するのか、トレードすべきか、明確になることがあります。戦略テスター内の任意の実行を必要としないこの"静かな"最適化メソッドを、自由に使ってください。
変更
この記事の公開後、コードに加えられた変更について簡単に説明します。
DistributionOfProfits.mqh" v.1.027:最適化のプログラム動作の導入。コンストラクタは、ファイル名「Non File」を含んでおり、2つのパブリック関数は、MQL_OPTIMIZATION定数のチェックを実行します。
+------------------------------------------------------------------+ //|コンストラクタ| +------------------------------------------------------------------+ CDistributionOfProfits::CDistributionOfProfits(void) : m_name_file("Non File"), m_color_loss("ed7d31"), m_color_profit("5b9bd5"), m_width("440"), m_height("400"), m_data_number(1) { } +------------------------------------------------------------------+ //|分析トレード履歴| +------------------------------------------------------------------+ bool CDistributionOfProfits::AnalysisTradingHistory(const datetime start_time=0) { //--- if(MQLInfoInteger(MQL_OPTIMIZATION)) return(false); +------------------------------------------------------------------+ //|利益の表示(ブラウザの開始)| +------------------------------------------------------------------+ void CDistributionOfProfits::ShowDistributionOfProfits(void) { //--- if(MQLInfoInteger(MQL_OPTIMIZATION)) return;
DistributionOfProfits.mqh" v.1.033:ポジションを分析することが可能です。
次のように分析タイプが設定されています:
+------------------------------------------------------------------+ //| test_report.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | +------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs +------------------------------------------------------------------+ //|レポートの種類| +------------------------------------------------------------------+ enum ANALYSIS_TYPE { ONLY_MONEY=0、//お金 ONLY_POINTS=1、//ポイント MONEY_AND_POINTS=2、//お金とポイント }; //--- input datetime start=D'2016.06.28 09:10:00'; input ANALYSIS_TYPE report_type=MONEY_AND_POINTS; //--- #include <DistributionOfProfits.mqh> //--- CDistributionOfProfits Analysis; +------------------------------------------------------------------+ //|スクリプトプログラムスタート関数| +------------------------------------------------------------------+ void OnStart() { //--- Analysis.SetTypeOfAnalysis(report_type); Analysis.AnalysisTradingHistory(start); Analysis.ShowDistributionOfProfits(); } +------------------------------------------------------------------+
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/2626
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索