市場シミュレーション(第16回):ソケット(X)
はじめに
前回の「市場シミュレーション(第15回):ソケット(IX)」では、Pythonで記述されるサーバーコードの一部について説明し、そのコード例を示しました。しかし、このコードだけでは、MetaTrader 5とExcelの間で通信システムを使用するには不十分です。そのため、前回の記事で示した内容に加えて、さらにいくつかの要素が必要になります。このPythonコードの中に通信システム全体を実装することも可能であり、その場合でも間違いではありません。しかしそうすると、完全に閉じたシステムに限定されてしまいます。つまり、特定の動作やより特殊なスクリプトに対応するための拡張性が失われてしまいます。一方で、システムを複数の部分に分割して構築することで、より柔軟に実装することができ、それぞれのプログラミング言語の強みを活かすことが可能になります。こうすることで、各言語や各プログラムが持つ最適な機能を最大限に活用できます。
これを非効率だと考える人もいるかもしれません。しかし、ここで示しているのは、MetaTrader 5をこれまでにない全く新しい方法で活用できるということです。Excelの活用方法についても同様で、他のどのようなプログラムにも応用可能です。さらに、この仕組みを特定用途向けに開発された独自プログラムで構築することも可能であり、特定の作業に対する分析・運用モデルを作成することができます。その場合、MetaTrader 5は、私たちが構築したシステムと市場との間で注文を受け渡す役割のみを担うことになり、取引プラットフォーム自体を開発する負担を回避できます。
したがって、ここでの説明はあくまで一例にすぎず、より広い可能性を含んでいると考えることができます。このような仕組みを実現するには、多くの知識と学習が必要です。しかし、もし本当にこのような仕組みを実現したいのであれば、これらの記事はその一例として参考になるでしょう。ただし、これらはすべて、Pythonサーバーを実用的にするために必要な追加実装を理解するまで、実用的な意味を持ちません。そのため本記事では、Excel側(VBAで実装される部分)について説明します。
Excelでの実装を始める
VBAで実装する必要があるコードは、それほど複雑ではありません。実際、多くの部分はすでにVBAでスクリプトを書く人たちが普段おこなっている内容です。ただし、一部にはやや難しく感じられる可能性のあるポイントも存在します。そのため、人によっては複雑に思えるかもしれません。しかし、ここで示す内容はできる限りシンプルかつ教材として分かりやすい形で整理されていることを強調しておきます。さらに、前回の記事で提供したPython側のコードは変更されません。必要なのは、目的に応じて必要な処理や設定を実行するためのVBAコードを追加で作成することだけです。
まず、Excelのインターフェースを確認してみましょう。以下のような画面になります。

Excelをある程度使用したことがある方であれば、上の画像にあるボタンが図形であることに気付くはずです。これにより、角の丸いインターフェースを作成することが可能になります。ただし、その動作は通常のコントロールと大きくは変わりません。というのも、これらの図形はマクロに関連付けることができるためです。そのため、これらの図形をクリックすると、Excelはそれを通常のボタン操作として解釈し、対応するマクロを実行する形で処理を呼び出します。
実際に重要なのは、インターフェースそのものではなく、セルの内容です。たとえば、セルB2には、サーバーがオフラインであるという情報が表示されています。同様に、セルB5には別の情報が格納されており、この場合はMetaTrader 5から情報を取得したい銘柄が記載されています。この時点で、システムの構成が少しずつ見えてきます。まだMQL5側で何を実装するかは分かっていなくても、必要な要素や可能な処理を把握することができます。
サーバーコードの説明を思い出してください。そこでは、あるセルから情報を取得し、それをMetaTrader 5へ送信してデータを取得する仕組みについて説明しました。まさにその対象となるのが、このセルに入力されている値「WDON23」です。この値を使って処理が行われます。しかし、もしこのセルの情報を手動で変更する場合は、次の手順が必要になります。まずサーバーを停止し、セルB5の値を変更した後、再度サーバーを起動します。その後、MetaTrader 5は新しいパラメータを受信し、それを解析することになります。
このような変更は非常に単純であり、いつでも実行可能です。そしてその間、サーバー側は何が起きているのかを知ることはありません。すべてはMetaTrader 5とExcelの間で完結します。しかし前述の通り、そして繰り返しますが、ここでの目的は学習です。とはいえ、より多くの情報を取得したり、別のシンボルにアクセスしたりするための独自プロトコルを作成することも可能です。その場合は、単にExcelの特定のセルにデータを配置するだけで実現できます。ここで「なぜその特定のセルなのか。別のセルではだめなのか。」という疑問が生まれるかもしれません。実際には、サーバーコードはインデックスを使用しており、そのインデックスに応じてセルB5が選択される仕組みになっています。しかし本記事では、サーバー側のコードを変更することなく、別のセルを使用する方法についても説明します。
この内容を理解できれば、次の段階に進むことができます。では、
VBAでどのように実装するかを見ていきましょう。
ユーザーに内部で何が起きているのかを意識させることなく、実際に有用な機能を実現するためには、VBA側でいくつかの作業をおこなう必要があります。そのため、まず最初にするべきことは「モジュール」を作成することです。このモジュールの目的は、共通コードをまとめて配置することにあります。最初に実装すべきコードは、以下の通りです。
01. Private Const szMSG_START_SERVER As String = "Start Server" 02. Private Const szMSG_STOP_SERVER As String = "Stop Server" 03. Private Const szSERVER_SHUTDOWN As String = """/Force Server ShutDown""" 04. Private Const szMSG_MT5_OFFLINE As String = "MetaTrader 5 is offline." 05. Private Const szMSG_MT5_ONLINE As String = "MetaTrader 5 is online." 06. Private Const szMSG_MT5_BUY As String = """Buy in Market >""" 07. Private Const szMSG_MT5_SELL As String = """Sell in Market >""" 08. Private Const iPort As Integer = 9090 09. Private gl_ServerInExec As Boolean 10. Public Const CELL_MT5 As String = "$B$4" 11. 12. Public Sub SwapStatusMT5() 13. Dim c1, c2, c3 As Long 14. 15. If Sheets("System").Range(CELL_MT5).Value = szMSG_MT5_ONLINE Then 16. c1 = RGB(217, 238, 16) 17. c2 = RGB(51, 153, 102) 18. c3 = RGB(255, 80, 80) 19. Else 20. c1 = RGB(132, 130, 122) 21. c2 = c1 22. c3 = c1 23. End If 24. With Sheets("System") 25. .Shapes("Btn_MT5").Fill.ForeColor.RGB = c1 26. .Shapes("Btn_BUY").Fill.ForeColor.RGB = c2 27. .Shapes("Btn_SELL").Fill.ForeColor.RGB = c3 28. End With 29. End Sub 30. 31. Private Sub SwapMsgBtnServer(text As String) 32. Dim c As Long 33. If text = szMSG_START_SERVER Then 34. c = RGB(213, 87, 99) 35. gl_ServerInExec = False 36. Else 37. c = RGB(84, 130, 53) 38. gl_ServerInExec = True 39. SwapStatusMT5 40. End If 41. With Sheets("System").Shapes("Btn_Server") 42. .TextFrame2.TextRange.text = text 43. .Fill.ForeColor.RGB = c 44. End With 45. End Sub 46. 47. Public Sub BtnServer_Click() 48. If gl_ServerInExec Then 49. StopServer 50. Else 51. InitServer 52. End If 53. End Sub 54. 55. Public Sub InitServer() 56. Dim szScript, szCmd As String 57. 58. szScript = Chr$(34) & Application.ActiveWorkbook.Path & "\Server.py" & Chr$(34) 59. szCmd = " ""127.0.0.1""" & Str(iPort) & " ""System"" ""B$2""" 60. VBA.CreateObject("WScript.shell").Run """Python""" & szScript & szCmd, vbHide 61. SwapMsgBtnServer szMSG_STOP_SERVER 62. End Sub 63. 64. Public Sub StopServer() 65. szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34) 66. VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szSERVER_SHUTDOWN, vbHide, True 67. SwapMsgBtnServer szMSG_START_SERVER 68. End Sub 69. 70. Public Sub MT5_BuyInMarket() 71. szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34) 72. VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szMSG_MT5_BUY, vbHide, True 73. End Sub 74. 75. Public Sub MT5_SellInMarket() 76. szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34) 77. VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szMSG_MT5_SELL, vbHide, True 78. End Sub
VBAソースコード
このモジュールには、今後の作業に必要となるすべての要素が含まれています。ご覧の通り、いくつかの定数と複数のプロシージャがここで宣言されています。定数を使用することで、コードをより迅速に修正することができます。それぞれの手順は個別の目的を持っており、すべてが全体のコードの中で重要な役割を担っています。VBAでこのモジュールを正しく修正するためには、細部に注意を払う必要があります。
まず、55行目に注目してください。ここでは通常の順序で処理を追うのではなく、ExcelがPythonサーバーをどのように管理するかという観点から、重要な部分から順に見ていきます。55行目には、サーバーを起動する手続きが存在します。ここで重要なのは、PythonスクリプトをExcelファイルと同じフォルダに配置する点です。58行目でExcelファイルの保存されているディレクトリをVBAで取得しているためです。これにより、Pythonスクリプトの名前と組み合わせて完全なパスを構築することができます。
次に59行目では、スクリプトに渡すパラメータを定義しています。この行を正しく理解するためには、前回の記事に戻り、スクリプトが受け取るべきパラメータの正しい順序を確認してください。60行目では、中核となる部分が実行されます。この行でPythonスクリプトが呼び出され、実際に実行されます。しかしここで主要な問題が発生します。この行は処理の完了を待ちません。つまり、VBAはPythonサーバースクリプトを呼び出し、別プロセスとして実行します。これは厳密な意味でのスレッド処理ではありませんが、そのような動作になります。タスクマネージャーを確認すると、PythonスクリプトはExcelアプリケーションと同じプロセスグループ内に表示されることが分かります。これは以下の画像で確認できます。

この動作は重要な意味を持ちます。つまり、Excelを終了するとPythonスクリプトも同時に終了します。タスクマネージャー上でPythonスクリプトがExcelのプロセスとは別に表示されている場合、Excelを終了してもスクリプトは動作し続けることになります。その場合は手動で終了させる必要があります。61行目では、31行目の手続きを呼び出しています。この手続きでは、サーバーの開始・停止ボタンに対応するオブジェクトの状態を変更しています。この処理はシンプルであり、図形に直接関連しているため、特に追加の説明はありません。
ただし重要な点として、31行目および55行目の手続きは、サーバーの開始・停止ボタンそのものに直接紐づいているわけではありません。実際にボタン操作に関連付けられているのは、47行目の別の手続きです。そのため、サーバーの開始・停止ボタンはBtnServer_Click手続きを実行することになります。これにより、Excel上での制御をシンプルかつ効果的におこなうことが可能になります。ただし、この説明はあくまで全体の始まりに過ぎず、このモジュール内にはまだ4つのプロシージャが残っています。
次に、サーバー制御ボタンがどのようにリンクされているかを見ていきます。BtnServer_Click手続きでは、サーバーの起動処理だけでなく停止処理も呼び出されています。これは49行目にあり、64行目を参照しています。StopServerでは、少し異なる方法を使用しています。なぜかと言えば、ExcelとPythonの間のインタラクションにはいくつかの方法が存在するためです。VBAからPythonで定義された変数やプロシージャを読み取ったり、実行したり、書き換えたりすることも可能です。そのため、単純に「サーバー停止フラグ」をVBA変数に書き込むこともできます。そしてPython側がその変数を読み取ることで、サーバー停止を認識することができます。
また、Excelと同じホスト上でサーバーを動かすこともできますし、別のマシンに分離することも可能です。その場合はソケット通信を使用してやり取りします。そのため、この手続きでは別の方法を使っています。65行目では、Pythonスクリプトの場所を指定しています。このスクリプトはサーバーへメッセージを送信する役割を持ちます。このメッセージは実際にはコマンドです。66行目では、サーバーへ送信されるコマンド内容を定義しています。このPythonスクリプトについては現時点では深く考える必要はありません。後ほど記事の後半で説明されます。
次の手続きは70行目にあり、MetaTrader 5へのリクエスト送信を目的としています。75行目のプロシージャも同様です。これらはそれぞれボタンに紐づけられており、ユーザーがExcelから直接操作できるようになっています。ただし注意点として、StopServer、MT5_BuyInMarket、MT5_SellInMarketのすべての手続きは同じPythonスクリプトを使用しています。しかし、StopServerは完全に動作する手続きであるのに対し、MT5_BuyInMarketとMT5_SellInMarketはまだ完成していません。これらは教育目的で設計されており、実際にはMetaTrader 5のターミナルにメッセージを表示するだけの処理となっています。この点は次回詳しく説明します。
これら2つの手続きを動作させるためには、通信プロトコルを定義する必要があります。このプロトコルは、MetaTrader 5に銘柄情報を伝え、さらにストップロスやテイクプロフィットなどの情報を定義するものです。多くの学習者にとって、この部分は興味深い課題となり、個人的なチャレンジにもなるでしょう。しかし実装自体はそれほど難しくありません。VBAでMetaTrader 5が解釈できるメッセージを構築する方法を定義するだけです。これにより、Excelから直接取引を発注することが可能になります。この詳細は次の記事で扱いますので、現時点では気にする必要はありません。
このモジュールの最後の要素は12行目にあります。この手続きの目的は、Excelのインターフェースおよび制御ボタンがMetaTrader 5の現在の状態と一致するようにすることです。つまり、MetaTrader 5がオフラインの場合、ボタンは無効化(グレー表示)され、オンラインの場合は有効化(カラー表示)されます。これにより、ユーザーはMetaTrader 5に対してコマンドを送信できる状態かどうかを視覚的に判断できます。
これでVBAモジュールの説明は終了です。しかし、Excelのメイン要素のプログラミングが完全に終わったわけではありません。まだ補助機能とインタラクションの改善のための作業が残っています。次におこなうべき処理は以下の通りです。

そして、どのコードを使用すべきかについての混乱を避けるため、画像と同じコードを以下に示します。
1. Private Sub Worksheet_Change(ByVal Target As Range) 2. If Target.Address = CELL_MT5 Then 3. SwapStatusMT5 4. End If 5. End Sub
VBAソースコード
しかし、このコードは実際に何をしているのでしょうか。VBAプログラミングにまだ慣れていない場合、特にExcel用のコード作成に慣れていない場合は、少し分かりにくいかもしれません。しかしこのコードの役割は単純で、MetaTrader 5へコマンドを送信するボタンの状態(有効・無効や色)を制御するための設定をおこなっています。そのために、サーバーによって指定されたセルの値が常に監視されています。このセルの値が何らかの理由で変更されると、3行目の処理がトリガーされます。その結果、MetaTrader 5とサーバーの状態に応じて、ボタンの色が自動的に変化するようになります。
つまり、ユーザーも開発者も特定のセルの中身を確認する必要はありません。ボタンの色を見るだけで、MetaTrader 5がオンラインなのかオフラインなのかを一目で分かるようになります。Excelでこのような処理をおこなうことに慣れていない方にとって重要なポイントがあります。上の画像を確認し、このコードをどのシートに配置する必要があるのかを必ず理解してください。このコードを誤ったシートに配置してしまうと、期待通りの動作は得られません。そのため、この点には特に注意が必要です。
これまでと同様に、もう一つ対応すべき作業があります。コードの配置場所に注意する必要があったのと同じように、今回も特定の場所にコードを配置する必要があります。そのため、以下のコードを挿入してください(画像の通りです)。

もしどこに何を配置すべきか不明な場合は、上の画像と同じコード内容を確認してください。
1. Private Sub Workbook_BeforeClose(Cancel As Boolean) 2. ThisWorkbook.Save 3. StopServer 4. End Sub 5. 6. Private Sub Workbook_Open() 7. InitServer 8. End Sub
VBAソースコード
このオプションはさらに単純で、2つの非常に基本的なイベントハンドラのみで構成されています。最初の関数であるWorkbook_BeforeCloseは、ユーザーがExcelワークブックを閉じようとしたときに呼び出されます。このイベントが発生すると、2つの処理が実行されます。1つ目は2行目にあります。ここでは、Excelに対してワークブックの保存を指示しています。そのため、ワークブックに変更が加えられていた場合でも、Excelは保存確認ダイアログを表示せず、プログラム終了時に自動的に保存されます。2つ目は3行目にあります。ここではモジュール内で定義された手続きを呼び出しており、この目的はサーバーを停止することです。
次に6行目では、さらに単純な処理がおこなわれています。この行ではWorkbook_Openイベントハンドラが使用されており、7行目でモジュール内のサーバー起動手続きを呼び出しています。このWorkbook_Openは、Excelでワークブックが開かれたときに実行されます。そのため、ユーザーまたはエンドユーザーがファイルを開くと、自動的にサーバーが起動し、MetaTrader 5からのデータ受信を待機する状態になります。
ここまでで基本的な動作は完成です。前回の記事で示したPythonコードと同じサーバーを構築し、簡単なスプレッドシートを作成し、いくつかのボタンまたは図形を追加して操作できるようにし、さらにVBAコード内の図形名が正しく一致していることを確認すれば、システムをテストすることができます。その結果、問題なくサーバーを起動できることが確認できるはずです。しかし、まだ不足している要素があります。それはExcelとPythonサーバーを実際に連携させるコードです。
ここまでの説明を理解していれば、もう1つのPythonコードが必要であることに気付くはずです。このファイルは「MsgFromExcel.py」という名前にする必要があります。ExcelおよびVBAの解説を完了するためには、この最終的なスクリプトを確認する必要があります。理解できていないと感じて焦る必要はありません。一度ここで立ち止まり、全体の流れを整理して考えてみましょう。
Excelが起動すると、Workbook_Open手続きが呼び出されます。この処理によって、VBAモジュール内のInitServer手続きが実行されます。この手続きは、ワークブックと同じフォルダ内にあるServer.pyファイルを探します。これは前回の記事で示されたPythonサーバースクリプトです。この処理が完了すると、Excelは通常通りユーザーのコマンドや操作に応答できる状態になります。
システムを起動しようとしてサーバーが開始されない場合は、今説明した手順に戻って確認してください。サーバーは本来、自動的に起動するように設計されています。もし起動しない場合は、コード内にエラーがあるため、それを修正してから先に進む必要があります。
次の段階はサーバーの停止時に発生します。これはExcelアプリケーションを閉じる操作、またはStopServer手続きを呼び出す操作によって実行されます。これらのいずれかが実行されると、モジュール内の65行目が処理されます。ただし、この時点で実行されるコードはまだ説明されていません。分かりやすくするため、この部分は別のトピックで扱われます。
Excel用クライアント
そうです、その通りです。MsgFromExcel.pyスクリプトは実際にはクライアントであり、Excelセッション内で起動・稼働しているサーバーと通信する役割を持ちます。分かりやすくするために、ファイルのコードを以下に示します。
01. import socket as sock 02. import sys 03. 04. if sys.argv[2]: 05. conn = sock.socket(sock.AF_INET, sock.SOCK_STREAM) 06. try: 07. msg = '<mt5 with excel>:' + sys.argv[2] 08. conn.connect(('localhost', int(sys.argv[1]))) 09. conn.send(msg.encode()) 10. conn.close() 11. except: 12. sys.exit(1)
Pythonソースコード
Pythonの経験をある程度持っている方は、このコードを解析したときに、おそらく次のように感じたはずです。「これは接続を開いて、データを送信して、すぐに接続を閉じるクライアントではないか。これに何の意味があるのか。」その通りです。上記のコードはPythonによるTCPクライアントであり、その役割はまさにそのままです。接続を開き、サーバーへ情報を送信し、その後すぐに接続を閉じ、再び必要に応じて呼び出されるようになっています。
この理由は、このクライアントが常時サーバーに接続し続ける必要がないためです。MetaTrader 5上で動作するMQL5のクライアントとは異なり、このクライアントは単発のコマンド送信のみを目的としています。つまり、何かを実行させるため、あるいは情報を送信するために使用されます。そのため、StopServer、MT5_BuyInMarket、MT5_SellInMarketといった複数の手続きから同じコードが呼び出されているのです。この設計の目的は、Excelとサーバーが異なるマシン上に存在していた場合でも実行できるようにすることです。
したがって、このスクリプトは2つのパラメータを受け取ります。1つ目は使用するポート番号です。2つ目はサーバーに送信するコマンドまたはメッセージであり、サーバーが実行する処理、またはMetaTrader 5へ転送する内容になります。これが完了すると、このクライアントが開いた接続はすぐに閉じることができます。
ここで、重要かもしれない点、あるいは疑問を抱かせるかもしれない点について、いくつかコメントしたいと思います。もしあなたがPythonやVBAのプログラミングを始めたばかりで、これらの教材を興味深いと感じたのであれば、これはあくまで私が見つけた教育的なアプローチに過ぎないということを理解しておいてください。ここでおこなわれている多くの内容は改善可能であり、実際にはかなり大きく改善することができます。主な理由は、コード内に多くのチェック処理を含めていないためです。しかし、この特定のPythonクライアントは、VBAコードへ容易に置き換えることができるという点を強調しておきたいと思います。
そのため、Pythonで実装されるモジュールはサーバーを作成する部分のみになります。ただし、PythonコードはVBAで同じクライアント機能を実装する場合と比較して大幅にシンプルで分かりやすいため、この設計ではPythonを採用しています。しかし、もし同じ処理をVBAで実装しようとする場合は注意が必要です。ここでおこなっていることと同等の処理をVBAで実現することは、より複雑になる傾向があります。
まとめ
本記事では、まだExcelとMetaTrader 5の通信を完全に確立する方法の説明は完了していません。このチャレンジも終盤に差し掛かっていますが、その前に、今回の内容と前回の記事の2つの記事をしっかり理解しておく必要があります。そうすることで、次の記事をより深く理解できるようになります。次の記事では、MQL5プログラミングに関連する部分のみを扱う予定です。また、できるだけ分かりやすく説明するように努めます。しかし、これら2つの記事の内容を理解していない場合、次の記事を理解することは難しくなるでしょう。内容が段階的に積み重なっていく構造になっているからです。達成すべき目標に近づくほど、必要となる理解や実装すべき要素は増えていきます。
次の記事を読む際には、すでにここまでの内容を理解し、実際に適用できる状態になっていることを願っています。疑問がある場合は、以前の記事を再度学習することをお勧めします。最初に述べたように、ソケット通信のテーマは非常に密度が高く、多くの詳細が含まれています。その中には単純なものもあれば、かなり複雑なものもあります。しかし、このテーマを理解することは、将来的に起こり得る問題を理解するため非常に重要です。
また、ソケットのテーマはリプレイ/シミュレーションシステムとは無関係だと考えるかもしれませんが、その認識は改める必要があります。もし将来的に、これまでのようにMetaTrader 5内部の仕組みに依存しないリプレイ/シミュレーションシステムを構築したい場合、ソケットの仕組みを理解する必要があります。そうすることで、必要なものをすべてシミュレートできるようになります。つまり、私が示してきたような方法ではなく、自分自身で取引サーバーを模倣し、そのサーバーにMetaTrader 5を接続させる形でシミュレーションすることができるようになります。
しかし、私たちの目的は別にあります。そのため、この話題についてはまた別の機会に扱うことにします。それでは、次回の記事でお会いしましょう。
| ファイル | 説明 |
|---|---|
| Experts\Expert Advisor.mq5 | Chart TradeとEA間の相互作用をデモンストレーションする(相互作用にはMouse Studyが必要) |
| Indicators\Chart Trade.mq5 | 送信する注文を設定するウィンドウを作成する(Mouse Studyが必要) |
| Indicators\Market Replay.mq5 | リプレイ/シミュレーションサービスと対話するためのコントロールを作成する(Mouse Studyが必要) |
| Indicators\Mouse Study.mq5 | グラフィカルコントロールとユーザー間のインタラクションを提供する(リプレイシステムと実市場での運用の両方に必要) |
| Services\Market Replay.mq5 | 市場リプレイ/シミュレーションサービス(システム全体のメインファイル)を作成および維持する |
| VS Code C++ Server.cpp | C++で作成されたソケットサーバーを作成および維持する(ミニチャット版) |
| Python Code Server.py | MetaTrader 5とExcel間の通信用のPythonソケットを作成および維持する |
| ScriptsCheckSocket.mq5 | 外部ソケットとの接続を確認する |
| Indicators\Mini Chat.mq5 | インジケーターを介してミニチャットを実装する(サーバーが動作している必要がある) |
| Experts\Mini Chat.mq5 | EAを介してミニチャット機能を実装する(サーバーが動作している必要がある) |
MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/12828
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
市場シミュレーション(第17回):ソケット(XI)
バトルロイヤル最適化(BRO)
サンゴ礁最適化(CRO)
初級から中級まで:構造体(IV)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索