初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 576

 

こんにちは。

条件によって、例えばアラートのテキストをEAからクリップボードにコピーすることは可能かどうか教えてください。

その場合、どうすればいいのか。

 
mila.com:

こんにちは。

条件によって、例えばアラートのテキストをEAからクリップボードにコピーすることは可能かどうか教えてください。

その場合、どうすればいいのか。

クリップボードの操作は、システム機能(Windows API)であるため、できません。MQL5では、WinAPIに直接アクセスすることはできません。また、なぜクリップボードで作業するのか?結局、メッセージを自分で生成しているわけですから、メッセージの原文を持っているということです。
 
Karputov Vladimir:
クリップボードの操作は、システム機能(Windows API)であるため、できません。MQL5では、WinAPIに直接アクセスすることはできません。また、なぜクリップボードで作業する必要があるのでしょうか?結局のところ、あなたは自分でメッセージを生成しているわけですから、メッセージのソーステキストを持っているわけです。

そう、ソースコードはあるのですが、ある条件によってクリップボードに必要なのです。

すみません、指定がなかったのですが、MQL4での 実装が必要です。

クリップボードを#import "user32.dll "で何とか開くことはできないでしょうか?

 
mila.com:

そう、ソースコードはあるのですが、ある条件によってクリップボードに必要なのです。

すみません、指定がなかったのですが、MQL4での 実装が必要です。

もしかしたら、#import "user32.dll "を使って何とかクリップボードを開くことができるのでは?

そろそろMQL5で書くか。dllの使用は無謀の極みです。

私の理解では、サードパーティのプログラムから情報を読み取りたいのでしょう。そして、全クライアント端末の共通ディレクトリ にあるファイルへの書き込みを使用します。すでにこのディレクトリから、サードパーティのプログラムでファイルを読み込むことができます。

 
Karputov Vladimir:

MQL5で書くのが当たり前の時代になってきた。DELLを使うなんて、愚の骨頂です。

私の理解では、サードパーティのプログラムからの情報を読みたいということですね。そして、全クライアント端末の共通ディレクトリ にあるファイルへの書き込みを使用します。そのディレクトリから、サードパーティのプログラムでファイルを読み込むことができます。

お薦めをありがとうございます、しかし今私はMQL4 プログラムからクリップボードにテキストをコピーする必要があります。

 
Karputov Vladimir:

順を追って説明しよう。これがそのテンプレートです。

チャートと、スタジオでのチャートのスクリーンショット、および「ログ」タブと「アドバイザー」タブのエントリ(そこに表示される場合)を添付してください。

こんにちは!

手始めにMT5プラットフォームを再起動しました。テンプレートをコンパイルします。コンパイル結果は以下の通りです。スクリーンショットが大量にあるため、捨てざるを得なかった

ナビゲーターにEAが表示されました。

チャートにEAを投入し、3か所で取引を可能に した。

チャートにスマイリーフェイスの代わりにEAアイコンが表示されるようになりました。

以下、ログからの抜粋 2016.05.11 12:44:47.139 Expert Expert Test (GBPUSD,H1) ロードに成功しました。

以下は、EAをロードする際のメッセージの内容です。

CO 0 10:35:45.020 Terminal Alpari Limited MT5 x64 build 1325 開始しました。
HD 0 10:35:45.020 端末 Windows 8.1 (x64 ベース PC), IE 11.00, UAC, Intel Core i5-2320 @ 3.00GHz, RAM: 2209 / 4078 Mb, HDD: 45023 / 149999 Mb, GMT+03:00をサポート。
ND 0 10:35:45.020 Terminal C:\UsersBoris﹑AppData﹑Roaming﹑MetaQuotes﹑TerminalⒸ73D45AFCBD5653CAF29C407A081F030C
LI 0 10:35:47.200 ネットワーク '50016841': mt5.nl.3 経由で Alpari-Ltd-MT5 で認証済み (ping: 57.34 ms)
NG 0 10:35:47.200 ネットワーク '50016841': 前回成功した認証が 79.172.69.175 から 2016.05.10 23:47:58 に実行されました。
FK 0 10:35:47.617 ネットワーク '50016841': Alpari Limited と端末が同期されました。
RM 0 10:35:47.617 ネットワーク '50016841': 取引が有効化されました - ネッティングモード
OH 0 10:35:48.253 ネットワーク '50016841': アクセスポイントのためにネットワークをスキャンしています。
CL 0 10:35:51.446 ネットワーク '50016841': ネットワークのスキャンが終了しました。
ND 1 12:00:49.011 ネットワーク '50016841': Alpari-Ltd-MT5への接続が失われました。
MR 0 12:01:08.842 ネットワーク '50016841': mt5.nl.3 を通じて Alpari-Ltd-MT5 で認証済み (ping: 56.41 ms)。
HR 0 12:01:08.842 ネットワーク '50016841': 前回成功した認証が 79.172.69.175 から 2016.05.11 10:35:52 に実行されました。
PQ 0 12:01:08.907 ネットワーク '50016841': Alpari Limited と端末が同期されました。
PH 0 12:01:08.907 ネットワーク '50016841': 取引が有効化されました - ネットワーキング・モード
KL 0 12:41:45.169 Expert Advisor Test (GBPUSD,H1) ロードに成功しました。

ぜひご覧ください。もしかしたら、原因が見つかるかもしれません。困ったなぁ、もしかしてビルドの問題かな?

ありがとうございました !!!



ありがとうございました !!!

 
Boris.45:

こんにちは!

手始めにMT5プラットフォームを再起動しました。テンプレートをコンパイルします。コンパイル結果は以下の通りです。スクリーンショットが大量にあるため、捨てざるを得なかった

ナビゲーターにEAが表示されました。

チャートにEAを投入し、3か所で取引を可能に した。

チャートにスマイリーフェイスの代わりにEAアイコンが表示されるようになりました。

以下、ログからの抜粋 2016.05.11 12:44:47.139 Expert Expert Test (GBPUSD,H1) ロードに成功しました。

以下は、EAをロードする際のメッセージ内容です。

CO 0 10:35:45.020 Terminal Alpari Limited MT5 x64 build 1325 開始しました。
HD 0 10:35:45.020 端末 Windows 8.1 (x64 ベース PC), IE 11.00, UAC, Intel Core i5-2320 @ 3.00GHz, RAM: 2209 / 4078 Mb, HDD: 45023 / 149999 Mb, GMT+03:00をサポート。
ND 0 10:35:45.020 Terminal C:\UsersBoris﹑AppData﹑Roaming﹑MetaQuotes﹑TerminalⒸ73D45AFCBD5653CAF29C407A081F030C
LI 0 10:35:47.200 ネットワーク '50016841': mt5.nl.3 経由で Alpari-Ltd-MT5 で認証済み (ping: 57.34 ms)
NG 0 10:35:47.200 ネットワーク '50016841': 前回成功した認証が 79.172.69.175 から 2016.05.10 23:47:58 に実行されました。
FK 0 10:35:47.617 ネットワーク '50016841': Alpari Limited と端末が同期されました。
RM 0 10:35:47.617 ネットワーク '50016841': 取引が有効化されました - ネッティングモード
OH 0 10:35:48.253 ネットワーク '50016841': アクセスポイントのためにネットワークをスキャンしています。
CL 0 10:35:51.446 ネットワーク '50016841': ネットワークのスキャンが終了しました。
ND 1 12:00:49.011 ネットワーク '50016841': Alpari-Ltd-MT5への接続が失われました。
MR 0 12:01:08.842 ネットワーク '50016841': mt5.nl.3 を通じて Alpari-Ltd-MT5 で認証済み (ping: 56.41 ms)。
HR 0 12:01:08.842 ネットワーク '50016841': 前回成功した認証が 79.172.69.175 から 2016.05.11 10:35:52 に実行されました。
PQ 0 12:01:08.907 ネットワーク '50016841': Alpari Limited と端末が同期されました。
PH 0 12:01:08.907 ネットワーク '50016841': 取引が有効化されました - ネットワーキング・モード
KL 0 12:41:45.169 Expert Advisor Test (GBPUSD,H1) ロードに成功しました。

ぜひご覧ください。もしかしたら、原因が見つかるかもしれません。困ったなぁ、もしかしてビルドの問題かな?

ありがとうございました !!!



ありがとうございました !!!

この故障している端子の上に端子を取り付けます。治るかもしれません。
 
Karputov Vladimir:

MQL5で書くのが当たり前の時代になってきた。DELLを使うなんて、愚の骨頂です。

私の理解では、サードパーティのプログラムからの情報を読みたいということですね。そして、全クライアント端末の共通ディレクトリ にあるファイルへの書き込みを使用します。すでにこのディレクトリから、サードパーティのプログラムでファイルを読み込むことができます。

もし「愚の骨頂」であれば、それは禁じ手であろう。

WinAPIはMQLの機能を大幅に拡張します。そして、DLLがなくてもバカなことはできる。

そして、クリップボードに文字列を渡す例を紹介します。

#define  CF_UNICODETEXT 13
#define  GHND 0x0042

#import "User32.dll"
   int OpenClipboard( uint );
   int EmptyClipboard();
   int CloseClipboard();
   uint SetClipboardData( uint uFormat, uint hMem );
#import "Kernel32.dll"
   uint GlobalAlloc( uint uFlags, uint dwBytes );
   uint GlobalLock( uint hMem );
   int GlobalUnlock( uint hMem );
#import "msvcrt.dll"
   uint memcpy( uint dest, string src, uint count );
#import

string str = "АБВГД";

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uint hwnd = (uint)ChartGetInteger( 0, CHART_WINDOW_HANDLE );
   
   int strSize = StringLen( str ) * 2 + 2;  // Получаем размер строки в байтах
   
   if( OpenClipboard( hwnd ) )    // Открываем буфер
   {
      EmptyClipboard();           // Очищаем буфер
      
      uint hMem = GlobalAlloc( GHND, strSize ); // Выделяем память
      uint pMem = GlobalLock( hMem );    // Получаем адрес выделенной памяти
      memcpy( pMem, str, strSize );     // Копируем строку в память
      GlobalUnlock( hMem );
   
      SetClipboardData( CF_UNICODETEXT, hMem );  // Передаём память со строкой в буфер
      
      CloseClipboard();  // Закрываем буфер
   }
}
 
Artyom Trishkin:


Artemさん、教えてください。On Start関数の下からOn Tick関数にすべて挿入すると、スクリプトは同じように、各ティックで実行されますよね?

それとも、何かを変える必要があるのでしょうか?

現在のローソク足以外の前のローソク足は1ティックごとに変化しないので、例えば現在のローソク足が閉じる1~2秒前に一度だけチェックする条件を追加すればいいのでは?それとも意味がなく、すべてのティックにチェックを入れたままでよいのでしょうか?

 
Andrey Koldorkin:

Artemさん、教えてください。On Start関数の下からOn Tick関数にすべて挿入すると、スクリプトは同じように、各ティックで実行されますよね?

それとも、何かを変える必要があるのでしょうか?

現在のローソク足以外の前のローソク足は1ティックごとに変化しないので、例えば現在のローソク足が閉じる1~2秒前に一度だけチェックする条件を追加すればいいのでは?それとも意味がなく、すべてのティックにチェックを入れたままでよいのでしょうか?

まあ、私はそれを関数にすべて形成し、私がそれを必要とするときに呼び出すだろう - 毎ティック(それが合理的かつ必要である場合)、または新しいローソクの 開始時に - H1を扱う場合、例えば、1時間に一度。
理由: