Ошибки, баги, вопросы - страница 37

 
kirill190982:
Скорее всего пока проигнорирую, но в MQL4  таких замечаний компилятор не выдавал
Это совсем другой вопрос, там много чего не было... :)
 
Interesting:

С переменными скорей всего все ОК. Мой пост выше посмотрите плиз...

  Не знаю если привести double к int то точно будет потеря, а если наоборот, то возникнет скорее всего ошибка при нормализации, так как второе значение функции типа int
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting:

Вопрос разработчикам по поводу "пользовательских" событий и нескольких экспертов работающих на одном терминале.

Вот хочу поинтересоваться правильно ли я все хочу замутить или нет?


Идея такова

По ходу пьесы требуется сделать информирование "соседних" экспертов о некоторых происходящих процессах.

...

Если идея стоящая может ее доработать кто согласиться и оформить в виде статьи. Или внести в раздел справки посвященный пользовательским событиям?

Есть пример к функции EventChartCustom:

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
 
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
 
//--- создадим метку для вывода информации
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
 
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- выведем в лог отладочное сообщение
         Print("Кнопка нажата =",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         Print("Отправлено событие с ID =",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
 
//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Получили широковещательное сообщение от графика с id="+lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
         //--- выведем сообщение в метке
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart=ChartFirst();
   int i=0;
   while(i<CHARTS_MAX)          // у нас наверняка не больше CHARTS_MAX открытых графиков
     {
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      currChart=ChartNext(currChart); // на основании предыдущего получим новый график
      if(currChart==0) break;  // достигли конца списка графиков
      i++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Попробуйте его.

 
kirill190982:
  Не знаю если привести double к int то точно будет потеря, а если наоборот, то возникнет скорее всего ошибка при нормализации, так как второе значение функции типа int

Если записывать int в double, то все нормально обрабатывается, компилятор просто просто отбрасывает дробную часть (согласно правилу).

В обратной же ситуации компилятор начинает сомневаться, и выдает предупреждение о возможных проблемах (как ему кажется).

А поскольку мы все знаем о том, что когда КАЖЕТСЯ нужно КРЕСТИТЬСЯ в подобной ситуации  мы и "советуем ему" это сделать. :)

PS

Возможно, разработчики в будущем отключат НЕКОТОРЫЕ предупреждения, и тогда как и в MQL4 компилятор перестанет материться по всяким мелочам...

 
Interesting:

Вопрос разработчикам по поводу "пользовательских" событий и нескольких экспертов работающих на одном терминале.

Вот хочу поинтересоваться правильно ли я все хочу замутить или нет?


Идея такова

По ходу пьесы требуется сделать информирование "соседних" экспертов о некоторых происходящих процессах.

Например такие процессы для начала нужно отследить:

1. Запск эксперта;

2. Выгрузка эксперта;

3. Прекращение совершения торговых операций;

4. Возобновление торговых операций.


Реализация

I. Создаем 4 идентификатора событий:

1 - CHARTEVENT_CUSTOM+1 //Запуск эксперта

2 - CHARTEVENT_CUSTOM+2 //Выгрузка эксперта

3 -CHARTEVENT_CUSTOM+3 //Прекращение совершения торговых опраций

4 - CHARTEVENT_CUSTOM+4 //Возобновление торговых операций


II. Отслеживание событий

При наступлении определенной ситуации в эксперте генерируется ШИРОКОВЕЩАТЕЛЬНОЕ сообщение при помощи EventChartCustom.

При этом эксперт записывает в sparam комментарий (свое имя и тип события, может иную инфу), а lparam идентификатор своего графика.

Эксперты на других графиках (если они смогут правильно разобрать характер события) отвечают уже конкретно данному эксперту.


PS

Если идея стоящая может ее доработать кто согласиться и оформить в виде статьи. Или внести в раздел справки посвященный пользовательским событиям?

А я не вижу смысла использовать сразу несколько советников, особенно если играть несколькими инструментами - то можно спокойно обойтись одним экспертом, модификацию, открытие закрытие также можно осуществить одним экспертом, анализ индикаторов тоже
 
Rosh:

Есть пример к функции EventChartCustom:

Попробуйте его.

Да пример я этот видел еще (даже не знаю сколько времени назад). Я хотел поинтересоваться насколько моя задумка правильна и интересна на с точки зрения реализации.

PS

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

Также будет интересно использовать кастомные события в виде приказов одного эксперта другому (или другим). если все это обобщить то получится на мой взгляд очень интересная статья.

К сожалению у меня нет времени заниматься этим... 

 
kirill190982:
А я не вижу смысла использовать сразу несколько советников, особенно если играть несколькими инструментами - то можно спокойно обойтись одним экспертом, модификацию, открытие закрытие также можно осуществить одним экспертом, анализ индикаторов тоже

Смысл есть всегда, тем более что не все эксперты мультивалютны априори (основываясь на опыте MQL4).

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


Сами разработчики в качестве примеров пока не выкладывали нормальный мультивалютник. а что будет твориться если кому-то захочется запустить скажем 2-3 копии MACD Sample на одном счету одному БОГУ известно.


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

Также подобный вариант будет приемлем в случае если другие эксперты ("соседи") не проводят торговых операций, а только обрабатывают данные или выполняют определенную работу.

Также подобные вещи можно реализовать при общении индюков и экспертов (при определенном подходе).

PS

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

Я думаю, что при желании там материала будет не на одну статью...

 
Interesting:
............

К сожалению у меня нет времени заниматься этим... 

Понимаем. Слишком много времени уходит на комментирование всех и вся....
 
AM2:

 

Я просмариваю значение  vMA и Close[]. В вотче все нормально считает. Еще пробовал так:

 Опять ошибку пишет. Может как то по другому можно простую скользящую среднюю рассчитать.  Или взять хендл iMA и CopyBuffer куда надо?

1. В вотче нужно указывать либо имя массива Close (увидите только общую информацию), либо конкретное значение Close[1], Close[2],..., Close[i]

2. По вашему приведенному коду не видно как заполняется массив mrate

3. Посмотрите стандартную библиотеку MovingAverages.mqh - будет пример расчета МА

 
joo:
Понимаем. Слишком много времени уходит на комментирование всех и вся....


И на комментирование тоже хватит время, и на реализацию определенных идей.

Просто наверняка я не буду заниматься данным вопросом настолько серьезно чтобы охватить всю область его применения (а некоторыми вопросами применения данной идеи я уже занимаюсь, чисто для себя).

Но в любом случае скорей всего я не буду писать статьи на эту тему (по разным причинам)...

Причина обращения: