реакция на нажатие горячих клавиш в MT5 - страница 3

 
Sergey Gritsay:
Это я видел, там нет примера как это использовать правильно, я пытался сам но ни черта не выходит
Сейчас погляжу...
 
Sergey Gritsay:
как? буду признателен за пример. В идеале пример сочетания клавиш нужно Ctrl+(стрелочка вверх) 

Посмотрите код и его вывод в журнал:

#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   int ctrl= TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL);
   int up = TerminalInfoInteger(TERMINAL_KEYSTATE_UP);
   Print(__FUNCTION__,": ctrl = ",ctrl,", up = ",up);
  }
//+------------------------------------------------------------------+
Т.е. если нужно ловить момент, когда обе клавиши ЗАжаты, то -127 и -127. Просто нажаты - 1. Можно еще через события реализовать.
 
Alexey Kozitsyn:

Посмотрите код и его вывод в журнал:

#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   int ctrl= TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL);
   int up = TerminalInfoInteger(TERMINAL_KEYSTATE_UP);
   Print(__FUNCTION__,": ctrl = ",ctrl,", up = ",up);
  }
//+------------------------------------------------------------------+
Т.е. если нужно ловить момент, когда обе клавиши ЗАжаты, то -127 и -127. Просто нажаты - 1. Можно еще через события реализовать.

возвращает четыре значения, как и правильно отлавливать не пойму. Вот что получилось при запуске этого индикатора

2017.02.15 13:31:53.014 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:31:54.024 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:31:55.041 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:31:56.051 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:31:57.133 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:31:58.081 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:31:59.088 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 1
2017.02.15 13:32:00.111 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:01.197 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:02.132 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:03.155 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:04.171 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:05.182 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:06.187 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:07.212 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:08.222 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:09.231 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:10.251 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:11.263 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:12.298 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:13.297 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 1
2017.02.15 13:32:14.308 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 1
2017.02.15 13:32:15.312 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 1
2017.02.15 13:32:16.352 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:17.353 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:18.354 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:19.365 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:20.392 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:21.405 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 0
2017.02.15 13:32:22.411 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 0
2017.02.15 13:32:23.431 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:24.432 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:25.458 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:26.475 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:27.525 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 0
2017.02.15 13:32:28.502 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:29.511 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 0
2017.02.15 13:32:30.521 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:31.541 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:32.561 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 0
2017.02.15 13:32:33.563 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:34.588 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 0
2017.02.15 13:32:35.588 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 0
2017.02.15 13:32:36.604 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 0
2017.02.15 13:32:37.616 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:38.629 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:39.673 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -128, up = 1
2017.02.15 13:32:40.672 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:41.686 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 1
2017.02.15 13:32:42.688 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:43.713 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 1
2017.02.15 13:32:44.723 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:45.743 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -127
2017.02.15 13:32:46.748 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 0
2017.02.15 13:32:47.763 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = 0
2017.02.15 13:32:48.773 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = -127, up = -128
2017.02.15 13:32:49.793 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:50.805 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:51.821 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:52.827 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:53.854 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:54.863 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:55.873 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:56.896 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:57.913 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:58.925 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:32:59.923 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:33:00.950 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:33:01.970 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:33:02.966 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:33:03.989 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 1, up = 0
2017.02.15 13:33:04.993 KeyBoardKlick (Ger30Mar17,M1)   OnTimer: ctrl = 0, up = 0


 

 
Sergey Gritsay:

возвращает четыре значения, как и правильно отлавливать не пойму. Вот что получилось при запуске этого индикатора

0 - клавиша была отжата, 1 - клавиша была нажата, -127 - клавиша зажата после того, как была отжата, -128 - клавиша зажата после того, как была нажата:)
 

На текущий момент написал так, пока работает нормально, единственно надо по графику кликнуть что бы его перевести в фокус. Из таймера не получается отловить правильно, приходит иногда по два по три события подряд.

#property strict

//---
// Коды состояния клавиш
#define KEY_CTRL  0x11//1017
#define KEY_SHIFT 0x10//1016
#define KEY_SPACE 0x20 //
#define KEY_LEFT  0x25//1037
#define KEY_UP    0x26//1038
#define KEY_RIGHT 0x27//1039
#define KEY_DOWN  0x28//1040
#define KEY_0  0x60

#include<Trade\Trade.mqh>
#include<Trade\AccountInfo.mqh>

CTrade trade;

double volumes=0.0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   EventSetMillisecondTimer(15);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {

   if(id==CHARTEVENT_KEYDOWN)
     {
      //Print("lparam = ",lparam,":",0x60);
      double bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
      double ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      if(KeyPressed(KEY_CTRL) && lparam==KEY_UP)
        {
         trade.BuyLimit(NormalizeVolume(_Symbol,volumes),bid);
        }
      if(KeyPressed(KEY_CTRL) && lparam==KEY_DOWN)
        {
         trade.SellLimit(NormalizeVolume(_Symbol,volumes),ask);
        }
      if(KeyPressed(KEY_SHIFT) && lparam==KEY_UP)
        {
         trade.Buy(NormalizeVolume(_Symbol,volumes));
        }
      if(KeyPressed(KEY_SHIFT) && lparam==KEY_DOWN)
        {
         trade.Sell(NormalizeVolume(_Symbol,volumes));
        }
        
        //if(KeyPressed(KEY_SPACE) && lparam==KEY_0)
        //{
        // trade.PositionClose(_Symbol);
        //}
     }
  }
//+------------------------------------------------------------------+
bool KeyPressed(int key_code) {return((TerminalInfoInteger(ENUM_TERMINAL_INFO_INTEGER(key_code+1000))&0x80)!=0);}
//+------------------------------------------------------------------+
double NormalizeVolume(string symbol,double lot)
  {
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double volume_step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   int volume_digits=(int)(MathLog(1.0/volume_step)/MathLog(10.0));

   if(lot<MinLot)lot=MinLot;
   if(lot>MaxLot)lot=MaxLot;

   return(NormalizeDouble(lot,volume_digits));
  }
//+------------------------------------------------------------------+

 

...
 
MrVIS:
Подскажите, пож, как в MT5 организовать реакцию советника на нажатие комбинации клавиш, например, Cntrl+Q. Отдельно каждую клавишу CHARTEVENT_KEYDOWN отрабатывает. А "поймать" комбинацию, не получается. PS: если вопрос не по теме, подскажите, где его можно задать. Спасибо

Примеры и готовые решения можно посмотреть вот в этой статье: 

Графические интерфейсы X: Элемент "Многострочное текстовое поле ввода" (build 8) 

 
Anatoli Kazharski:

Примеры и готовые решения можно посмотреть вот в этой статье: 

Графические интерфейсы X: Элемент "Многострочное текстовое поле ввода" (build 8) 

Я эту статью тоже читал, но ни черта не понял как от туда выудить обработку клавиш, если сможете приведите пример таких сочетаний 

1. левый Ctrl + стрелка вверх 

2. правый Ctrl + стрелка вниз

 
Sergey Gritsay:

Я эту статью тоже читал, но ни черта не понял как от туда выудить обработку клавиш, если сможете приведите пример таких сочетаний 

1. левый Ctrl + стрелка вверх 

2. правый Ctrl + стрелка вниз

Краткий пример:

//+------------------------------------------------------------------+
//|                                                      Test003.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//---
#define KEY_LEFT               37
#define KEY_UP                 38
#define KEY_RIGHT              39
#define KEY_DOWN               40
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   ::ChartSetInteger(0,CHART_KEYBOARD_CONTROL,false);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ::ChartSetInteger(0,CHART_KEYBOARD_CONTROL,true);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
      //--- Если "Ctrl + Left"
      if(lparam==KEY_LEFT && KeyCtrlState())
         {
          Print("Ctrl + Left");
          return;
         }
      //--- Если "Ctrl + Up"
      if(lparam==KEY_UP && KeyCtrlState())
         {
          Print("Ctrl + Up");
          return;
         }
      //--- Если "Ctrl + Right"
      if(lparam==KEY_RIGHT && KeyCtrlState())
         {
          Print("Ctrl + Right");
          return;
         }
      //--- Если "Ctrl + Down"
      if(lparam==KEY_DOWN && KeyCtrlState())
         {
          Print("Ctrl + Down");
          return;
         }
      //---
      return;
     }
  }
//+------------------------------------------------------------------+
//| Возвращает состояние клавиши Ctrl                                |
//+------------------------------------------------------------------+
bool KeyCtrlState(void)
  {
   return(::TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL)<0);
  }
//+------------------------------------------------------------------+

//---

Результат:

2017.02.15 13:04:08.598 Test_003 (EURUSD,D1)    Ctrl + Left
2017.02.15 13:04:09.129 Test_003 (EURUSD,D1)    Ctrl + Up
2017.02.15 13:04:09.710 Test_003 (EURUSD,D1)    Ctrl + Down
2017.02.15 13:04:10.174 Test_003 (EURUSD,D1)    Ctrl + Right
 
Anatoli Kazharski:

Краткий пример:

/

//---

Результат:

2017.02.15 13:04:08.598 Test_003 (EURUSD,D1)    Ctrl + Left
2017.02.15 13:04:09.129 Test_003 (EURUSD,D1)    Ctrl + Up
2017.02.15 13:04:09.710 Test_003 (EURUSD,D1)    Ctrl + Down
2017.02.15 13:04:10.174 Test_003 (EURUSD,D1)    Ctrl + Right
Спасибо!
Причина обращения: