Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1080

 
Artyom Trishkin:

Тут лучшая рекомендация - чаще читать справку.

Там указаны свойства, которые можно получить/установить для графика.

В частности - прокрутка графика левой кнопкой мышки.

 Это место в документации я читал.

Когда для графика установлено CHART_EVENT_MOUSE_MOVE = 1 - график получает сообщения о передвижении мыши, а если CHART_EVENT_MOUSE_MOVE = 0 - то нет. Это понятно.
Но это не относится к моему вопросу... Неважно какое значение выставлено для CHART_EVENT_MOUSE_MOVE у меня всегда есть возможность при выключенном AUTOSCROLL
"сдвигать" график в окне в прошлое (по времени) просто нажав на левую кнопку мыши и не отпуская кнопку сдвигать мышь вправо.
При этом график в окне сдвигается ВСЕГДА.
Однако, если я нажму Ctrl+F (вызову Crosshair) - то потом при нажатии на левую кнопку мыши, ее удержании в нажатом состоянии и перемещении по графику я буду видеть луч
заканчивающийся перекрестием рядом с которым в виде тултипа будут данные о перемещении мыши и цена уровня на котором в данный момент находится указатель мыши.
И что самое главное - САМ ГРАФИК В ЭТОТ МОМЕНТ ПЕРЕМЕЩАТЬСЯ В ОКНЕ НЕ БУДЕТ.

Вот про то, как достигнуть этого эффекта без включения Crosshair я и спрашиваю...

P.S. Могу видео с экрана снять и показать как это выглядит.

 
Maksims Ignatovs:

 Это место в документации я читал.

Когда для графика установлено CHART_EVENT_MOUSE_MOVE = 1 - график получает сообщения о передвижении мыши, а если CHART_EVENT_MOUSE_MOVE = 0 - то нет. Это понятно.
Но это не относится к моему вопросу... Неважно какое значение выставлено для CHART_EVENT_MOUSE_MOVE у меня всегда есть возможность при выключенном AUTOSCROLL
"сдвигать" график в окне в прошлое (по времени) просто нажав на левую кнопку мыши и не отпуская кнопку сдвигать мышь вправо.
При этом график в окне сдвигается ВСЕГДА.
Однако, если я нажму Ctrl+F (вызову Crosshair) - то потом при нажатии на левую кнопку мыши, ее удержании в нажатом состоянии и перемещении по графику я буду видеть луч
заканчивающийся перекрестием рядом с которым в виде тултипа будут данные о перемещении мыши и цена уровня на котором в данный момент находится указатель мыши.
И что самое главное - САМ ГРАФИК В ЭТОТ МОМЕНТ ПЕРЕМЕЩАТЬСЯ В ОКНЕ НЕ БУДЕТ.

Вот про то, как достигнуть этого эффекта без включения Crosshair я и спрашиваю...

P.S. Могу видео с экрана снять и показать как это выглядит.

Разве я не ответил?
Если что-то смещаете на графике мышкой, запрещаете в этот момент сдвиг графика. Как только отпустили кнопку мыши - разрешили сдвиг графика.

 

Можно ли обращаться к полям структуры с помощью индексации, т.е. как к одномерному массиву? Можно ли создать массив полей структур?

Значит идея такая. Есть структура 

struct MyStruct {int qw;double qe;}; MyStruct qr; 
//пример по сложнее
struct MyStruct1{int qw[5];double qe[5];}; MyStruct1 qr1;

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

qr.qw qr.qе и т.д. естественно поставить это дело в цикл и обработать одним потоком не получится. Я хочу создать массив полей который будет хранить эти элементы следующим образом 

Massiv[2];
//Massiv[0] отвечает за эту запись qr.qw
//Massiv[1] отвечает за эту запись qr.qе

В результате имеем возможность обращаться к этим элементам с помощью индексации, и естественно вторую структуру уже можно поставить в цикл и обрабатывать qw qe уже через цикл.

Можно ли так сделать, в интернете видел когда-то давно такие записи но может я что-то не так понял потому что сайт потерял? Может в этом вопросе помогут typedef enum union макросы?

 
Artyom Trishkin:
Разве я не ответил?
Если что-то смещаете на графике мышкой, запрещаете в этот момент сдвиг графика. Как только отпустили кнопку мыши - разрешили сдвиг графика.

 Я ничего не смещаю на графике. Если я ставлю  CHART_EVENT_MOUSE_MOVE = 0 это не помогает - график все равно можно двигать. 
 Как запретить графику обработку  
ChartNavigate я не знаю. И в документации такого не нашел. 
 При этом "перекрестие" ка-то справляется с этим делом. Вот поэтому я и спрашиваю - как?
 Вы мне отвечаете - поставьте нужное значение для CHART_EVENT_MOUSE_MOVE. Я пробовал - это не помогает.
 При любом значении 
CHART_EVENT_MOUSE_MOVE сохраняется возможность мышкой двигать график по времени вперед-назад просто зажав левую кнопку мыши на графике и передвигая мышь.
 При этом  в зависимости от направления перемещения мыши по горизонтали график будет смещаться в окне если я двигаю мышь вправо - график смещается влево (в прошлое по истории),
 а если двигаю мышь влево - график смещается в будущее до тех пор пока не появятся текущий бар. После этого попытка сдвинуть его в окне левее мышью ничего не даст. Но это и понятно.
 Но если я с помощью 
ChartNavigate переставлю график в окне на некую дату в прошлом - что мне надо сделать чтобы ни при каких условиях (никаких манипуляций с нажатиями и движениями мыши на   гнрафике) та часть графика которую я вижу - не смещалась? Что для этого конкретно нужно сделать?


 
Maksims Ignatovs:

 Я ничего не смещаю на графике. Если я ставлю  CHART_EVENT_MOUSE_MOVE = 0 это не помогает - график все равно можно двигать. 
 Как запретить графику обработку  
ChartNavigate я не знаю. И в документации такого не нашел. 


ChartSetInteger(0, CHART_MOUSE_SCROLL, 0); // Выключим прокрутку графика
 
Добрый день, исправьте пожалуйста индикатор, нужно вывести серверное время через кнопку, при условии что кнопка в исходном положении должна показывать
Вот что у меня НЕ получилось:
#property copyright "Copyright 2014, ForexDE"
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window

string s1="";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   PutButton("B",50,50,"KNOPKA");
   
   if(DayOfWeek()==1)
      s1="Понедельник  /  ";
   if(DayOfWeek()==2)
      s1="Вторник  /  ";
   if(DayOfWeek()==3)
      s1="Среда  /  ";
   if(DayOfWeek()==4)
      s1="Четверг  /  ";
   if(DayOfWeek()==5)
      s1="Пятница  /  ";
   if(DayOfWeek()==6)
      s1="Суббота  /  ";
   if(DayOfWeek()==0)
      s1="Воскресенье  /  ";

   ObjectCreate("WeekDay1",OBJ_LABEL,0,0,0);          
   ObjectSet("WeekDay1",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
   ObjectSet("WeekDay1",OBJPROP_XDISTANCE,5);
   ObjectSet("WeekDay1",OBJPROP_YDISTANCE,2);
   ObjectSet("WeekDay1",OBJPROP_SELECTABLE,false);
   ObjectSet("WeekDay1",OBJPROP_HIDDEN,true);
   ObjectSet("WeekDay1",OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   ObjectSet("WeekDay1",OBJPROP_COLOR,Black);
   ObjectSet("WeekDay1",OBJPROP_SELECTABLE,false);
   ObjectSet("WeekDay1",OBJPROP_SELECTED,false);
   ObjectSetText("WeekDay1",s1+TimeToString(CurTime(),TIME_DATE)+"  -  " +TimeToString(CurTime(),TIME_SECONDS),13,"Arial",Red);
   
   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[])
 {
 
   if(DayOfWeek()==1)
      s1="Понедельник  /  ";
   if(DayOfWeek()==2)
      s1="Вторник  /  ";
   if(DayOfWeek()==3)
      s1="Среда  /  ";
   if(DayOfWeek()==4)
      s1="Четверг  /  ";
   if(DayOfWeek()==5)
      s1="Пятница  /  ";
   if(DayOfWeek()==6)
      s1="Суббота  /  ";
   if(DayOfWeek()==0)
      s1="Воскресенье  /  ";
 
   ObjectSetText("WeekDay1",s1+TimeToString(CurTime(),TIME_DATE)+"  -  " +TimeToString(CurTime(),TIME_SECONDS),13,"Arial",Red);

  return(rates_total);
 }/*******************************************************************/

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {

  if(id == CHARTEVENT_CLICK)
   {
   
         if(!ObjectGetInteger(0,"B",OBJPROP_STATE,false))
           {
   ObjectSet("WeekDay1",OBJPROP_XDISTANCE,7000); // скрываю 
           }
         else
           {
   ObjectSet("WeekDay1",OBJPROP_XDISTANCE,5);    // показываю обратно
           }
   


   }
   
 }
/*******************************************************************/
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
  }
 

vebster005:
Добрый день, исправьте пожалуйста индикатор, нужно вывести серверное время через кнопку, при условии что кнопка в исходном положении должна показывать
Вот что у меня НЕ получилось:

что конкретно у вас НЕ получилось ? то есть своими словами что хотели сделать...

сделана кнопка, при нажатии она убегает за экран (если тот неширокий)

чем результат вас не устраивает ?

 
Maxim Kuznetsov:

что конкретно у вас НЕ получилось ? то есть своими словами что хотели сделать...

сделана кнопка, при нажатии она убегает за экран (если тот неширокий)

чем результат вас не устраивает ?

тем что когда нажали на кнопку, время скрылось и тут же появилось потому что оно обновляется из за того что в калькуляторе

 
Maxim Kuznetsov:

что конкретно у вас НЕ получилось ? то есть своими словами что хотели сделать...

сделана кнопка, при нажатии она убегает за экран (если тот неширокий)

чем результат вас не устраивает ?

Могли бы вы добиться результата что бы работали секунды и всё остальное, как в терминале, и можно было бы отключить кнопку
ибо у меня когда отключаем кнопку(убираем с экрана) время снова появляется

 
vebster005:

Могли бы вы добиться результата что бы работали секунды и всё остальное, как в терминале, и можно было бы отключить кнопку
ибо у меня когда отключаем кнопку(убираем с экрана) время снова появляется

Тут очень многие могут добиться практически любых результатов.

Важно чтобы вы сами пробовали их добиться, а не выпрашивали других это сделать за вас. Помочь тут всегда готовы, но помочь, а не сделать за вас.