English Deutsch
preview
MetaTraderとGoogleスプレッドシートを使用して取引ジャーナルを作成する方法

MetaTraderとGoogleスプレッドシートを使用して取引ジャーナルを作成する方法

MetaTrader 5 | 9 12月 2024, 11:42
387 0
Sara Sabaghi
Sara Sabaghi

目次

概念

今日、取引の世界では、エラーを減らして勝率を上げることが非常に重要です。すべてのトレーダーは、戦略のパフォーマンスを向上させるために取引ジャーナルを必要とします。しかし、この作業には多くの時間と精度が必要です。これが自動的におこなわれると想像してください。


はじめに

Googleスプレッドシートの取引ジャーナルシステムは、あらゆるレベルのトレーダーにとって欠かせないリソースとして機能し、取引活動を体系的に追跡するのに役立ちます。デイトレーダーとして成長したいなら、取引ジャーナルをつけることが不可欠です。測定しないものを改善することはできません。これにより、ユーザーは取引に対して構造化されたアプローチを維持できるようになり、パフォーマンスの評価と強化に不可欠な洞察が得られます。このシステムのアクセシビリティと使いやすさは、Googleスプレッドシートの共同作業機能によって強化され、トレーダーはジャーナルを共有したり、同僚からフィードバックを求めたりできるようになります。このシステムを採用することで、トレーダーは規律を養い、心理的要因を追跡し、最終的に金融市場で成功する可能性を高めることができます。

この記事では、トレーダーが取引を体系的に記録して追跡するためのパーソナライズされたプラットフォームを設計します。戦略と結果を反映するためのカスタマイズ可能なフィールドと、計算を自動化し、エラーを減らし、時間を節約するための組み込み関数が含まれています。 

HTTP POSTプロトコルを介してカスタムデータをGoogleスプレッドシートに自動的に送信する方法について説明します。また、MetaTraderでHTTPリクエストによってそれらを読み取ったり取得したりする方法も学習します。



利用可能なソリューション

取引ジャーナルを実装するには、将来の分析のために取引データをデータベースに転送する必要があります。 一方、そのデータベースにアクセスし、情報をダウンロードして活用する必要があります。データベースは、Excelファイル、CSV形式のファイル、MySQLまたはMicrosoft SQLサーバーJSONファイル、または必要なデータが行ごとに保存される単純なテキストファイルなど、あらゆる形式にすることができます。データベースの種類に応じて、システムの設計と開発は異なります。

いくつかのソリューションタイプがあります。

  1. Googleスプレッドシート: Googleスプレッドシートを使用すると、取引ジャーナルを簡単に作成できます。これは、取引、エントリポイントとエグジットポイント、利益と損失、取引メモなどの重要な指標を監視するための使いやすいインターフェイスです。公開されているGoogleスプレッドシートの取引ジャーナルを使用すると、トレーダーは取引を整理し、統計を収集して経験から学ぶことができます。さらに、Googleスプレッドシートではカスタマイズが可能なので、トレーダーは特定の戦略に合わせてジャーナルをカスタマイズできます。
  2. PythonとAPIを使用した取引ジャーナル: より洗練されたソリューションを求めるトレーダーにとって、PythonとGoogle Sheets APIを使用して取引ジャーナルを自動化すると、データの入力と分析が大幅に効率化されます。この自動化により、リアルタイムの更新が可能になり、人為的エラーの可能性が軽減されます。取引プラットフォームからデータを抽出し、Googleスプレッドシートに自動的に入力することで、トレーダーは手動でのデータ入力ではなく分析に集中できるようになります。このソリューションは、頻繁に取引をおこない、正確でタイムリーなパフォーマンス分析を必要とする人にとって特に効果的です。
  3. オンライン取引ジャーナル: さまざまなオンライン取引ジャーナルは、Webアプリケーションの使いやすさとアクセシビリティを、トレーダーがスプレッドシートを手動で管理することなく取引を記録できる機能と組み合わせます。ただし、購読料が必要です。これらのプラットフォームには、トレーダーが取引行動のパターンを特定し、より情報に基づいた意思決定をおこなうのに役立つ分析ツールが組み込まれていることがよくあります。

私たちがExcelベースのデータベースとしてGoogleスプレッドシートを選択した主な理由は2つあります。まず、シンプルでわかりやすいです。2番目に、Googleスプレッドシートは本質的に、リンクだけでどこからでもどのコンピューターからでもアクセスできるオンラインデータベースです。データをオンラインでアクセスできるようにするために追加のインフラストラクチャをセットアップする必要はありません。


Googleスプレッドシートとは

Googleスプレッドシートは、Googleが提供する無料のWebベースのExcelで、ユーザーはこれを使用してスプレッドシートを作成、編集、管理できます。Microsoft Excelと同様に、ユーザーはセルや表内のデータを整理し、数百のバーやチャート分析タイプを使用して数学的、統計的、分析的な操作を実行できます。

Googleスプレッドシートの主な機能と利点は次のとおりです。

  • ファイルは自動的にGoogleドライブに保存されるため、インターネットに接続されたどのデバイスからでもアクセスできます。
  • 複数のユーザーが同時に同じファイルで作業し、お互いの変更を即座に確認できます。
  • ソフトウェアのインストールは不要で、ブラウザとGoogleアカウントのみが必要です。
  • ユーザーは、Excel、CSV、PDFなどの形式でデータをインポートおよびエクスポートできます。
  • Excelと同様に、データ分析のための幅広い機能をサポートしています。
  • Googleスプレッドシート、サポートスクリプト、自動化機能もAPIソリューションからアクセスできます。

Googleスプレッドシートは、オンラインで共同作業をおこなうのに最適で、どこからでも簡単にデータにアクセスしたり共有したりできます。したがって、取引ジャーナルに最適です。


GoogleスプレッドシートAPI

Google Sheets APIは、スプレッドシートのデータの読み取りと変更を可能にするRESTfulインターフェイスです。このAPIの最も一般的な用途には、次のタスクが含まれます。

  • スプレッドシートの作成
  • スプレッドシートのセルの値の読み取りと書き込み
  • スプレッドシート書式の更新
  • コネクテッドシートの管理

GoogleスプレッドシートのAPIを使用するには、複雑な手順と300ドルの料金がかかるGoogle開発者アカウントが必要です。

しかし、ここで終わりではありません。私たちはシンプルで無料のソリューションを提供します。では、ステップごとに詳しく見ていきましょう。


Googleスプレッドシートを新規作成する

  1. まず、Googleスプレッドシートを開き、新しい空白のスプレッドシートを作成します。Googleアカウントをお持ちでない場合は、このサービスにアクセスするには新しいアカウントを登録する必要があります。このスプレッドシートは、私たちが扱うすべてのデータの主な保存場所として機能し、取引ジャーナルの情報をシームレスに送受信できるようになります。
  2. スプレッドシートを開いたら、使用する主要なデータ ポイントに対応するヘッダーを追加して最初の行を設定する必要があります。最初の行に、列ごとに次のヘッダーを1つ入力します。

    • ticket:チケット。各取引の一意の識別子を保存します。
    • order:注文。この列は、取引が買い注文か売り注文かを追跡します。
    • symbol: 銘柄。EURUSD や GBPJPYなどの通貨ペアなどの取引商品を記録します。
    • openprice:取引が開始された価格が保存されます。
    • sl: 取引に設定されたストップロス値です。
    • tp:取引の利益確定値を設定します。
    • close:この列には、取引が終了したかどうかが表示されます。
    • lot:ここで、取引量であるロットサイズを記録します。
    • opentime:この列には、取引が開始された正確な時刻が記録されます。

注意:プロジェクトコードでは列名は大文字と小文字が区別されます。したがって、自分のスタイルに合わせて列名を変更する場合は、必ず理解しておいてください。

スプレッドシートを開始する


Google Apps Scriptを作成する

Googleスプレッドシートに機能を追加するには、次の手順としてGoogle Apps Scriptを作成します。Google Apps Scriptを使用すると、タスクを自動化し、Googleサービスを接続するカスタムコードを記述できるため、スプレッドシートを外部プラットフォームにリンクするのに最適なツールになります。

それをおこなうには、以下を実行します。

  • Googleスプレッドシートで、上部の[拡張機能]メニューをクリックします。
  • ドロップダウンメニューから[Apps Script]を選択します。このアクションにより新しいタブが開き、Google Apps Scriptインターフェイスが表示されます。ここでコードを記述および編集して、シートとのやり取りを自動化できます。
  • Apps Scriptエディターが開くと、空白のスクリプトエディターが表示されます。将来簡単に識別できるように、プロジェクトに意味のある名前を付けることをお勧めします。
  • 「私の最初のジャーナル」や「私の取引リスト機能」など、好きな名前を付けることができます。
  • Google Apps Scriptエディターを開いてプロジェクトに名前を付けたら、次の手順では、表示されるデフォルトのコードを削除してスクリプトを変更します。 デフォルトでは、Google Apps Scriptには「myFunction」という名前のシンプルな関数テンプレートが含まれていますが、これはプロジェクトでは必要ありません。

App Script

したがって、そのデフォルト関数を削除し、以下の関数をコピーして貼り付け、デフォルト関数を以下の独自のカスタムスクリプトに置き換えます。

// Original code from https://github.com/jamiewilson/form-to-google-sheets
const sheetName = 'Sheet1'
const scriptProp = PropertiesService.getScriptProperties();

function initialSetup() {  
const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
scriptProp.setProperty('key', activeSpreadsheet.getId());
}

function doPost (e) {  
  const lock = LockService.getScriptLock();
  lock.tryLock(10000);
  
  try {    
    const doc = SpreadsheetApp.openById(scriptProp.getProperty('key'));    
    const sheet = doc.getSheetByName(sheetName);
    const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    const nextRow = sheet.getLastRow() + 1;
    const newRow = headers.map(function(header) {      
      return header === 'Date' ? newDate() : e.parameter[header];
    })
 
    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);

    return ContentService      
      .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
      .setMimeType(ContentService.MimeType.JSON);
  }
  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON);
  }
  finally {
    lock.releaseLock();
  }}

Jamie Wilsonに感謝します。彼のコード(form-to-google-sheets)をプロジェクトに使用しました。

次のステップに進む前に、プロジェクトを保存します([ファイル]>保存アイコン)

この関数は、Googleフォームまたは外部HTTP POSTリクエストをGoogleスプレッドシートに接続し、データをシートに動的に保存できるようにするGoogle Apps Scriptの一部です。

関数コンポーネントの内訳は次のとおりです。

sheetName:以前に作成した新しいスプレッドシートを参照するためのグローバル変数です。デフォルトのシート名は「sheet1」です。

scriptProp:Google Apps ScriptのPropertiesServiceを介してスクリプト固有のプロパティを保存するために使用され、スプレッドシート IDなどの値の永続的な保存が可能になります。

initialSetup:この関数では、SpreadsheetApp.getActiveSpreadsheet()を使用して現在アクティブなGoogleスプレッドシートを取得し、scriptProp.setProperty('key', activeSpreadsheet.getId())を使用してスプレッドシートの一意のIDをスクリプトプロパティに保存します。これにより、スクリプトの他の部分が後でIDによってスプレッドシートにアクセスできるようになります。

doPost:受信したデータをGoogleスプレッドシートにマッピングして、受信したHTTP POSTリクエストを処理するメイン関数です。まず、同時書き込みの問題を防ぐためにロックを取得し、次に保存されたIDで対象のスプレッドシートを取得し、正しいシートを識別します。この関数は、最初の行からヘッダーを読み取り、受信したデータを適切な列にマッピングし、そのデータを次の使用可能な行に追加し、現在の日付を自動的に挿入して「日付」ヘッダーを処理します。操作が完了するとJSON形式で成功メッセージが返され、問題が発生した場合はエラーメッセージが返され、最後にロックが解除されます。



セットアップ機能を実行する

このスクリプトはGoogleによってレビューされていないため、続行する前に警告が表示されます。 これは、検証されていないスクリプトの標準的な手順です。

関数を実行し、Google Apps Scriptを適切に構成するには、以下をおこないます。

  1. 保存アイコンの横にある実行アイコンをクリックします。
  2. 認証が必要なことを示すモーダルウィンドウが表示されます。「権限を確認」をクリックして次の画面に進み、スクリプトがGoogleアカウントにアクセスできるように許可する必要があります。
  3. このスクリプトで使用するGoogleアカウントを選択します。これは必要な権限を付与するアカウントです。
  4. 次の画面で、「Google hasn’t verified this app.」というメッセージが表示される場合があります。 これは、Googleの検証プロセスを経ていないスクリプトに対してよく表示される警告です。続行するには、[詳細]をクリックします。
  5. [詳細]をクリックすると、[無題のプロジェクト (安全でない)に移動] オプションが表示されます。このメッセージは、スクリプトが検証されていないものの、Googleアカウントへのアクセスを許可していることを示します。続行するにはこのリンクをクリックしてください。
  6. 最後に、スクリプトへの権限を付与するように求められます。要求されている権限を確認し、[許可]をクリックして、スクリプトがGoogleスプレッドシートやその他のGoogleサービスとやり取りできるようにします。

スクリプトに必要な権限を与えると、スクリプトの実行が許可されたことを示す実行ログがスクリプトエディターコンソールに表示されます。この時点でスクリプトは準備ができていますが、HTTP POSTリクエストを通じてスクリプトの実行を自動化するには、トリガーを設定する必要があります。


それをおこなうには、以下を実行します。

  1. Google Apps Script エディターページの左側のサイドバーで、[トリガー]をクリックして、トリガーの管理インターフェイスを開きます。このセクションでは、スクリプトをいつどのように実行するかを設定できます。
  2. トリガー ページ内で、[トリガーを追加]ボタンをクリックします。このボタンは通常、プラス(+)アイコンで表されるか、[トリガーの追加]というラベルが明示的に付けられます。
  3. トリガーの詳細を設定できる新しいダイアログが表示されます。HTTP POSTリクエストに応答して関数doPostをアクティブ化するためのトリガーを設定する必要があります。
  4. イベントソースには、[Webアプリから]または[Webアプリ]を選択します(正確なオプションは、Google Apps Scriptインターフェイスの更新に応じて異なる場合があります)。
  5. ドロップダウンメニューからトリガーする機能を選択します。この場合は、doPostを選択します。
  6. 実行するデプロイメントを選択します。  Head
  7. イベントソースを選択::  スプレッドシートから
  8. イベントの種類を[フォーム送信時]に設定します。この構成により、WebアプリのURLに送信されたHTTP POST 要求に応答してスクリプトを実行できるようになります。

次に、[保存]をクリックします。許可が必要な場合は、Googleアカウントで承認する必要があります。


プロジェクトをWebアプリとして公開する

ここで、アプリ ページの青い[デプロイ]ボタンをクリックし、ドロップダウンから[新しいデプロイ]をクリックして、プロジェクトを公開する必要があります。

次に、[タイプを選択]アイコンをクリックし、[Webアプリ]を選択します。

表示されるフォームで、次のオプションを選択します。

  • 説明: これはあなたが望むものなら何でも構いません。わかりやすく記述してください。
  • Webアプリ → 実行者:  自分
  • Webアプリ →アクセスできるユーザー:  誰でも

次に、[デプロイ]をクリックします。

重要 次に表示されるページで、WebアプリのURLをコピーします。このリンクをプロジェクトで使用します。リンクは次のようになります。

プロジェクトリンクhttps://script.google.com/macros/s/AfycbxWxYnDPsdvsvsdvdv236545OfgVnadvkvsASDCV6541scsSDHNfnqPeVkyH5A-r5eDhg/exec


Googleスプレッドシートにデータを投稿(書き込み)する方法

HTTP POSTは 、クライアントからサーバーにデータを送信するためにHTTPプロトコルで使用される方法です。これは通常、Webサイトでフォームデータを送信するときに使用されます。MQL Webサイトのログインフォームのように、Webではこのようなフォームが数多く見られます。

データがURLで渡されるGETメソッドとは異なり、データはリクエストの本文で送信されます。postメソッドを使用すると、データはURLに表示されないため、セキュリティが若干向上し、送信されるデータのサイズが制限されず、大きなファイルやデータの送信が可能になります。

シートスクリプト関数をテストするために、テストデータを収集し、処理のためにサーバーに送信するために使用される単純なHTMLフォームを作成します。フォームの送信方法はPOSTに設定する必要があります。

以下の基本的なHTMLフォームには次の内容が含まれます。

アクションプロジェクトリンクで設定する必要があります (以前の公開手順から)

方法:フォームの投稿メソッドであり、GETまたはPOSTメソッドになります。

Googleスプレッドシートにpostメソッドを使用してアプリスクリプトを記述すると、postを使用してデータをGoogleに送信します。

入力:送信したいすべてのタイプのデータが含まれます。

これが最終的なHTMLフォームです。

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
</head>
<body>
<form method="post" action="https://script.google.com/macros/s/AfycbxWxYnDPsdvsvsdvdv236545OfgVnadvkvsASDCV6541scsSDHNfnqPeVkyH5A-r5eDhg/exec">
<input type="number" size="20" name="ticket" placeholder="ticket">
<input type="text" size="20" name="order" placeholder="order">
<input type="text" size="20" name="symbol" placeholder="symbol"><br>
<input type="number" step="0.00001" size="20" name="openprice" placeholder="openprice">
<input type="number" step="0.00001" size="20" name="sl" placeholder="stoploss">
<input type="number" step="0.00001" size="20" name="tp" placeholder="takeprofit"><br>
<input type="number" step="0.00001" size="20" name="close" placeholder="close price">
        <input type="number" step="0.01" size="20" name="lot" placeholder="volume">
        <input type="datetime-local" size="20" name="opentime" placeholder="opentime">
<input type="submit" value="post">
</form>
</body>
</html>

このテキストをコピーしてローカルのテキストファイルに貼り付け、ファイル形式をHTMLファイルに変更します。この「newfile.html」のように

また、フォームアクションアドレスをスプレッドシートプロジェクトリンクアドレスに置き換えます。

これで、必要なデータをGoogleスプレッドシートに簡単に送信できるようになりました。

フォームの入力内容を入力し、「投稿」をクリックして、Googleスプレッドシートが更新されるのを待ちます。


HTMLフォームをGoogleスプレッドシートに

このステップに成功した場合は次のステップに進みます。そうでない場合は、上記のステップをさらに注意深くお読みください。スプレッドシートの列を再確認し、HTMLフォームの入力名と比較します。

上記で使用したフォームは、HTML POSTによるデータ送信のテストにすぎません。それ以外の場合、この記事の残りの部分では、WebRequestMetaTrader関数を使用してトランザクションデータを自動的に送信します。


HTTP経由でGoogleスプレッドシートを読み取り、アクセスする方法

HTTPメソッドを使用してスプレッドシートからデータを読み取るには、シートに読み取り権限を設定する必要があります。

Googleスプレッドシートを開き、以前に作成したシートを見つけて開きます。

シートページの右上隅で[共有]をクリックし、一般アクセスをリンクを知っている全員に設定し、役割を閲覧者に設定します。

次に、[リンクをコピー]をクリックして、シートアクセスリンクとして使用します。アクセスリンクは次のようになります。

https://docs.google.com/spreadsheets/d/1rYNuscaYWtRu_65W-fPnascNTYHwcU-3fWiNQ4asTBHQo/edit

太字のテキストはシートIDです。

JSONタイプのシートを読み取るには、そのIDが必要です。

アクセスリンク:https://docs.google.com/spreadsheets/d/{YOUR_SHEET_ID}/gviz/tq?tqx=out:json&tq&gid='+gid

{YOUR_SHEET_ID}は、シートURLで確認できるスプレッドシートIDです。

シートURLからIDをコピーし、アクセスリンクの{YOUR_SHEET_ID} を置き換えると、アクセスリンクは次のようになります。

https://docs.google.com/spreadsheets/d/1rYNuscaYWtRu_65W-fPnascNTYHwcU-3fWiNQ4asTBHQo/gviz/tq?tqx=out:json&tq&gid='+gid

ブラウザでこのリンクを使用すると、シートの完全な詳細がJSONファイル形式でダウンロードされます。

結果は次のようになります。

google.visualization.Query.setResponse(
{
    "version": "0.6",
    "reqId": "0",
    "status": "ok",
    "sig": "529900317",
    "table":
    {
        "cols": [
        {
            "id": "A",
            "label": "ticket",
            "type": "number",
            "pattern": "General"
        },
        {
            "id": "B",
            "label": "order",
            "type": "string"
        },
        {
            "id": "C",
            "label": "symbol",
            "type": "string"
        },
        {
            "id": "D",
            "label": "openprice",
            "type": "number",
            "pattern": "General"
        }],
        "rows": [
        {
            "c": [
            {
                "v": 5.64123564E8,
                "f": "564123564"
            },
            {
                "v": "buy"
            },
            {
                "v": "EURUSD"
            },
            {
                "v": 1.2215,
                "f": "1.2215"
            },
            {
                "v": 1.21,
                "f": "1.21"
            },
            {
                "v": 1.23,
                "f": "1.23"
            },
            {
                "v": 0.0,
                "f": "0"
            },
            {
                "v": 0.01,
                "f": "0.01"
            },
            {
                "v": "Date(2024,8,11,18,27,0)",
                "f": "2024-09-11 18:27"
            }, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
            {
                "v": null
            }]
        },
        {
            "c": [
            {
                "v": 123123.0,
                "f": "123123"
            },
            {
                "v": "sell"
            },
            {
                "v": "USDJPY"
            },
            {
                "v": 147.22,
                "f": "147.22"
            },
            {
                "v": 147.44,
                "f": "147.44"
            },
            {
                "v": 146.0,
                "f": "146"
            },
            {
                "v": 0.0,
                "f": "0"
            },
            {
                "v": 0.02,
                "f": "0.02"
            },
            {
                "v": "Date(2024,8,4,20,43,0)",
                "f": "2024-09-04 20:43"
            }, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
            {
                "v": null
            }]
        }],
        "parsedNumHeaders": 1
    }
});

すべての列名、数値、値が含まれます。上記のデータはすべて、ポジション詳細の2行分のみです。

この JSONファイルを使用して、エキスパートアドバイザー(EA)のシートを読み取ります。

話の最も興味深い部分、Metatraderプラットフォームで言ったことのすべてを自動的に実装する部分に行きましょう。


MetaTraderを使用して取引ジャーナルのツールを実装および更新する

MetaTraderを使用してGoogleシート取引ジャーナルを実装するには、プロセスに主要な手順が含まれます。

まず、ポジションの詳細やポジションのコメントなどの取引の詳細を保存および管理するためのGoogleスプレッドシートを作成する必要があります。前にもやりました。

次に、Google Apps Scriptを使用して、シートがHTTPリクエストを介して外部システムとやり取りできるようにします。以前もやりました。

ここで、MetaTraderで、WebRequest関数とHTTP POSTプロトコルを使用して、取引データ(銘柄、ボリューム、注文タイプなど)をGoogleスプレッドシートに送信するカスタムEAを作成します。シートはクラウドデータベースとして機能し、さまざまなアカウントや場所で取引をリアルタイムで監視、保存、共有できるようになります。


データを投稿するためのエキスパートアドバイザー(EA)を作成する

ポジションと注文の詳細をGoogleスプレッドシートに送信するには、EAが必要です。

したがって、コードには2つの主要部分が必要です。

  1. このタスクを実行する関数は、MetaTraderのアカウントのポジションと保留中の注文をチェックします。これを「OrderList」と呼びます。
  2. WebRequest関数を介してOrderListデータをGoogleスプレッドシートに送信するタスクを持つ関数。これを「UpdateDatabase」と呼びます。


実行中の注文とポジションのリストを取得する

OrderList」関数は次のような構造になります。

void OrderList {
   for(int conter = PositionsTotal() - 1; conter >= 0; conter -= 1)
   {
      const ulong ticket = PositionGetTicket(conter);
      if(ticket == 0 || !PositionSelectByTicket(ticket)) continue;
      string   symbol      =  PositionGetString(POSITION_SYMBOL);
      int      order_type  =  PositionGetInteger(POSITION_TYPE);
      double   volume      =  PositionGetDouble(POSITION_VOLUME);
      double   open_price  =  PositionGetDouble(POSITION_PRICE_OPEN);
      datetime open_time   =  PositionGetInteger(POSITION_TIME);
      double   stop_loss   =  PositionGetDouble(POSITION_SL);
      double   take_profit =  PositionGetDouble(POSITION_TP);      
      // Send trade details via WebRequest
      UpdateDatabase(symbol, order_type, volume, open_price, stop_loss, take_profit, ticket, open_time);
   }
} 

MQL4の場合、コードは次のようになります。

void OrderList {
   // Loop through all open trades
   for(int conter = OrdersTotal() - 1; conter >= 0; conter -= 1) {
      if(OrderSelect(conter, SELECT_BY_POS, MODE_TRADES)) {
         // Collect trade data
         int      ticket      =  OrderTicket();
         string   symbol      =  OrderSymbol();
         int      order_type  =  OrderType();
         double   volume      =  OrderLots();
         double   open_price  =  OrderOpenPrice();
         datetime open_time   =  OrderOpenTime();
         double   stop_loss   =  OrderStopLoss();
         double   take_profit =  OrderTakeProfit();
         // Send trade details via WebRequest
         UpdateDatabase(symbol, order_type, volume, open_price, stop_loss, take_profit, ticket, opentime);
      }
   }
}

この関数コードには、0から開始してオープン注文の合計数 OrdersTotal()またはPositionsTotal()までのループが含まれています。

各ループは、MetaTraderの注文リストからポジションまたは注文を選択し、それを OrderSelect関数で選択します。

次に、PositionGetString、PositionGetDouble、PositionGetIntegerによって目的の情報を読み取ります。

その他のデータについて必要な詳細については、MQL4取引関数およびMQL5取引関数を参照してください。


注文リストデータをGoogleスプレッドシートに送信する

プレビュー関数OrderListからすべての注文の詳細を取得した後、OrderListデータをシートに投稿するためにUpdateDatabaseという別の関数が必要になります。

銘柄、注文タイプ、数量、始値、ストップロス、テイクプロフィット、チケット番号などのポジションの詳細を関数入力として受け取り、フォーマットされた文字列に準備します。このデータは、WebRequest()関数を介してHTTP POSTリクエストを使用して送信されます。リクエストが成功した場合は、取引データが送信されたことを確認します。そうでない場合は、エラーメッセージを出力します。

void SendTradeData(string orderSymbol, int orderType, double orderVolume, double openPrice, double stopLoss, double takeProfit, ulong orderTicket, datetime openTime)
{ 
   // Database url. Replace with your own url
   string url  = "https://script.google.com/macros/s/AfycbxWxYnDPsdvsvsdvdv236545OfgVnadvkvsASDCV6541scsSDHNfnqPeVkyH5A-r5eDhg/exec";
   int   digit = (int)SymbolInfoInteger(orderSymbol,SYMBOL_DIGITS);
   string datastring = "?
                  +"&ticket="+string(orderTicket)
                  +"&order="+string(orderType)
                  +"&symbol="+string(orderSymbol)
  +"&openprice="+DoubleToString(openPrice,digit)
                  +"&sl="+DoubleToString(stopLoss,digit)
                  +"&tp="+DoubleToString(takeProfit,digit)
                  +"&close=0"
  +"&lot="+DoubleToString(orderVolume,2)
  +"&opentime="+(string)openTime;   

   int   res;     // To receive the operation execution result
   char  data[];  // Data array to send POST requests  
   char  result[];
   //--- Create the body of the POST request for authorization
   ArrayResize(data,StringToCharArray(datastring,data,0,WHOLE_ARRAY,CP_UTF8)-1);
   ResetLastError();
   res=WebRequest("POST", url, NULL, 0, data, result, str);
   string responsestring   = CharArrayToString(result, 0, 0, CP_UTF8);
   Print(responsestring);
   if(res == -1)
      Print("Error in WebRequest: ", GetLastError());
   else
      Print("Trade data sent: ", data);
}

この関数では、OrderList関数から注文またはポジションデータを取得し、標準の投稿メソッドに準備します。

URLはシートの公開URLです。

次に、GETメソッド形式で文字列変数「datastring」を作成します。

StringToCharArray関数を使用して、文字列をdataという名前で配列に格納します。

次の行でPOSTメソッドurldataを使用してWebRequest関数が開始されます。 配列と応答文字列はresult変数に格納されます。

次に、レスポンス配列を文字列responsestringに変換し、MetaTrader [Expert]タブのログに出力します。


取引リストの簡単な分析

開いて注文するたびにシートが更新され、Googleシート分析チャートですべてのデータを分析できます。

買いポジションの合計数、売りポジションの合計数、注文ロットの合計数、勝ちまたは負けポジションの合計数、平均勝ち、平均負けなど、考えられるすべてのものを計算します。

ジャーナル用のテンプレートを作成しました。このリンクからアクセスできます。生の位置リストから詳細を計算して分析する方法については、列の式を確認してください。

https://docs.google.com/spreadsheets/d/1rYcRJKzVWtRu_65W-fPnQgODSzTU-3fWiNQHZz3P2Qo/edit?usp=sharing


結論

この記事では、Googleスプレッドシートを使用して取引ジャーナルを作成し、MetaTraderにリンクして自動データ追跡をおこなうプロセスを説明しました。Googleスプレッドシートの設定、ヘッダーの追加、Google Apps Script を使用してHTTP POSTリクエスト経由で取引データを送信する方法について説明しました。このシステムにより、時間が節約され、エラーが削減され、取引をリアルタイムで追跡しやすくなります。

また、MetaTraderでEAを作成し、取引の詳細を Googleスプレッドシートに直接送信して、リアルタイム分析を可能にする方法も学びました。このシンプルなセットアップにより、複雑なツールを必要とせずに、取引パフォーマンスを整理および改善する効率的な方法が得られます。

MetaTrader 4と5の 2つのバージョンに必要なコードを用意しました。

ご質問やご意見がございましたら、遠慮なくコメントを残してください。 

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

この著者による他の記事

どんな市場でも優位性を得る方法(第5回):FRED EURUSD代替データ どんな市場でも優位性を得る方法(第5回):FRED EURUSD代替データ
本日の議論では、セントルイス連邦準備銀行の広義のドル指数に関する代替日次データとその他のマクロ経済指標の集合を使用して、EURUSDの将来の為替レートを予測しました。残念ながら、データはほぼ完璧な相関関係にあるように見えますが、モデルの精度において際立った向上は実現できず、投資家は代わりに通常の市場相場を使用した方がよい可能性があることを示唆している可能性があります。
データサイエンスとML(第30回):株式市場を予測するパワーカップル、畳み込みニューラルネットワーク(CNN)と再帰型ニューラルネットワーク(RNN) データサイエンスとML(第30回):株式市場を予測するパワーカップル、畳み込みニューラルネットワーク(CNN)と再帰型ニューラルネットワーク(RNN)
本稿では、株式市場予測における畳み込みニューラルネットワーク(CNN)と再帰型ニューラルネットワーク(RNN)の動的統合を探求します。CNNのパターン抽出能力と、RNNの逐次データ処理能力を活用します。この強力な組み合わせが、取引アルゴリズムの精度と効率をどのように高めることができるかを見てみましょう。
新しい指標と条件付きLSTMの例 新しい指標と条件付きLSTMの例
本記事は、テクニカル分析とディープラーニング(深層学習)予測を融合した自動取引用エキスパートアドバイザー(EA)の開発に焦点を当てます。
化学反応最適化(CRO)アルゴリズム(第1回):最適化におけるプロセス化学 化学反応最適化(CRO)アルゴリズム(第1回):最適化におけるプロセス化学
この記事の最初の部分では、化学反応の世界に飛び込み、最適化への新しいアプローチを発見します。化学反応最適化(CRO)は、熱力学の法則から導き出された原理を使用して効率的な結果をもたらします。この革新的な方法の基礎となった分解、合成、その他の化学プロセスの秘密を明らかにします。