質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

2010閲覧

MQL4のCHARTEVEN_KEYDOWNでファンクションキーを取得したい(が、普通の方法で取得できない)

regi

総合スコア7

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2020/04/06 11:20

お世話になります。
MT4用の言語、MQL4の質問となります。
どうにも対応方法が分からずお教えください。

インディケーターのプログラムにより、
OnChartEventでイベントCHARTEVENT_KEYDOWNからキー入力を捕捉したいと考えてます。

最低限のプログラムとして下記。

MQL4

1#property strict 2 3int OnCalculate(const int rates_total, 4 const int prev_calculated, 5 const datetime &time[], 6 const double &open[], 7 const double &high[], 8 const double &low[], 9 const double &close[], 10 const long &tick_volume[], 11 const long &volume[], 12 const int &spread[]) 13 { 14 return(rates_total); 15 } 16void OnChartEvent(const int id, 17 const long &lparam, 18 const double &dparam, 19 const string &sparam) 20 { 21 printf("%d %d %f %s", id, lparam, dparam, sparam); 22 }

例えば"x"のキーを押せば下記の通り

CADJPY-cd,M15: 0 88 1.000000 45

"z"のキーを押せば下記の通り出力されます。

CADJPY-cd,M15: 0 90 1.000000 44

ですが、ファンクションキーを捕捉することが出来ません
具体的には「F12」を捉えたいのですが、「CHARTEVENT_KEYDOWN」のイベントが発生しません。

元々「F12」はMT4のステップ・バイ・ステップと呼ばれるローソク足を一本分進めるショートカットキーになってまして、
「F12」でチャートが描き変わる度に「CHARTEVENT_CHART_CHANGE」のイベントが発動します。
このイベントを代替手段にする訳にも行かない状況で、肝心の「CHARTEVENT_KEYDOWN」がウンともスンとも言いません。

目的としては「F12」のキーボード押下が取得できれば良いので代替手段でも良いのですが、
良い方法がありましたらお知恵を頂きたくよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Win32 APIのGetAsyncKeyStateでどうでしょうか。

MQL4

1#import "user32.dll" 2short GetAsyncKeyState(int vKey); 3#import 4 5#define VK_F12 0x7B 6 7void OnChartEvent(const int id, 8 const long &lparam, 9 const double &dparam, 10 const string &sparam) 11{ 12 printf("%d %d %f %s", id, lparam, dparam, sparam); 13 14 if (id == CHARTEVENT_CHART_CHANGE && (GetAsyncKeyState(VK_F12) & 0x8000) != 0) 15 { 16 printf("F12"); 17 } 18}

投稿2020/04/18 05:21

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

regi

2020/04/18 13:17

ありがとうございました! CHARTEVENT_CHART_CHANGE && Win32API DLLによるF12 取得ですね。 複数のチャートに同じインディケーターを適用させている時に、発動させたい場合と発動させたくない場合の両方で、CHARTEVENT_CHART_CHANGE && F12 が条件を満たしてしまいそうなので、さらにそれらを区別する必要がありそうに思いました。 トリッキーな仕様になるのも避けたいと思いますので、別の方法を模索することにいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問