
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Это я видел, там нет примера как это использовать правильно, я пытался сам но ни черта не выходит
как? буду признателен за пример. В идеале пример сочетания клавиш нужно Ctrl+(стрелочка вверх)
Посмотрите код и его вывод в журнал:
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+
Посмотрите код и его вывод в журнал:
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+
возвращает четыре значения, как и правильно отлавливать не пойму. Вот что получилось при запуске этого индикатора
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
возвращает четыре значения, как и правильно отлавливать не пойму. Вот что получилось при запуске этого индикатора
На текущий момент написал так, пока работает нормально, единственно надо по графику кликнуть что бы его перевести в фокус. Из таймера не получается отловить правильно, приходит иногда по два по три события подряд.
//---
// Коды состояния клавиш
#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));
}
//+------------------------------------------------------------------+
Подскажите, пож, как в MT5 организовать реакцию советника на нажатие комбинации клавиш, например, Cntrl+Q. Отдельно каждую клавишу CHARTEVENT_KEYDOWN отрабатывает. А "поймать" комбинацию, не получается. PS: если вопрос не по теме, подскажите, где его можно задать. Спасибо
Примеры и готовые решения можно посмотреть вот в этой статье:
Графические интерфейсы X: Элемент "Многострочное текстовое поле ввода" (build 8)
Примеры и готовые решения можно посмотреть вот в этой статье:
Графические интерфейсы X: Элемент "Многострочное текстовое поле ввода" (build 8)
Я эту статью тоже читал, но ни черта не понял как от туда выудить обработку клавиш, если сможете приведите пример таких сочетаний
1. левый Ctrl + стрелка вверх
2. правый Ctrl + стрелка вниз
Я эту статью тоже читал, но ни черта не понял как от туда выудить обработку клавиш, если сможете приведите пример таких сочетаний
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: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
Краткий пример:
//---
Результат:
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