Вопросы от "чайника" - страница 6

 
pusheax:

Некоторые ДЦ на реальных счетах именам символов присваивают всякие префиксы типа "." или "FXF".

Как мне подставлять эти префиксы?

я делал так:

#define DEF_SPEC "FXF"

string SymbolsTrade[] = {"AUDCAD"DEF_SPEC ... -так не выходит

string SymbolsTrade[] = {"AUDCAD"+DEF_SPEC ... -и так тоже не получается

в итоге вместо нужного AUDCADFXF получаю просто FXF.

Не подскажите как это реализовать?


Во первых заполнение массива перечислением возможно только в глобальной области, поэтому никакие + там не пройдут, только string константы.

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

Проще всего написать функцию которая распределит и заполнит динамический массив, в ней можно всё, складывать дефиниции с константами итд.

 
Urain:

Во первых заполнение массива перечислением возможно только в глобальной области, поэтому никакие + там не пройдут, только string константы.

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

Проще всего написать функцию которая распределит и заполнит динамический массив, в ней можно всё, складывать дефиниции с константами итд.

Можно еще перебрать все валютные пары существующие в ДЦ/у БРОКЕРА и проанализировать в них составные валюты.

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

Насколько помню это один из универсальных вариантов для МТ5.

 
Urain:

Во первых заполнение массива перечислением возможно только в глобальной области, поэтому никакие + там не пройдут, только string константы.

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

Проще всего написать функцию которая распределит и заполнит динамический массив, в ней можно всё, складывать дефиниции с константами итд.

Короче, если я правильно Вас понял, то в глобальной области нельзя создать статический string массив из составных констант, да?

 
uncleVic:

Посмотреть код можно в исходнике. Для поиска дивергенции используются два метода:

1. Метод bool CSignalMACD::ExtState(int ind) - подготавливает данные для поиска;

2. Метод bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start) - ищет рыночную модель с указанными параметрами.

Если поможет, вот комментарии к методам на русском языке:

Для метода bool CSignalMACD::ExtState(int ind)

Для метода bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start)

У меня тоже вопрос - как при создании советника с использованием сигнала по MACD указать именно вариант с дивергенцией? В справочнике дается несколько вариантов сигналов.
 
strelec:
У меня тоже вопрос - как при создании советника с использованием сигнала по MACD указать именно вариант с дивергенцией? В справочнике дается несколько вариантов сигналов.

Как все уже заметили, любой сигнал может обнаруживать несколько рыночных моделей. Для управления использованием моделей вызывайте метод PatternsUsage(int value), где value - битовая карта  использования моделей (номер бита и номер модели совпадают). Бит равен 1 - модель используется, бит равен 0 - модель не используется (по-умолчанию все биты равны 1). Нумерация моделей как и битов начинается с 0.

Таким образом, если Вы хотите использовать только дивергенцию нужно использовать PatternsUsage(16);. Почему 16? 16 в двоичном виде 10000b (то есть бит 4 равен 1, остальные биты равны 0). А как раз model 4 "divergence of the oscillator and price"

Единственное "но", это придётся сделать "ручками".

После завершения работы Мастера, в редакторе откроется исходник. Найдите в нёт примерно такое место:

//--- Creating filter CSignalMACD
   CSignalMACD *filter0=new CSignalMACD;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodFast(Signal_MACD_PeriodFast);
   filter0.PeriodSlow(Signal_MACD_PeriodSlow);
   filter0.PeriodSignal(Signal_MACD_PeriodSignal);
   filter0.Applied(Signal_MACD_Applied);
   filter0.Weight(Signal_MACD_Weight);

и добавьте одну строчку

filter0.PatternsUsage(16);

получится:

//--- Creating filter CSignalMACD
   CSignalMACD *filter0=new CSignalMACD;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PatternsUsage(16);
   filter0.PeriodFast(Signal_MACD_PeriodFast);
   filter0.PeriodSlow(Signal_MACD_PeriodSlow);
   filter0.PeriodSignal(Signal_MACD_PeriodSignal);
   filter0.Applied(Signal_MACD_Applied);
   filter0.Weight(Signal_MACD_Weight);

Пока это всё. Если будут вопросы, обращайтесь.

 
uncleVic:

Как все уже заметили, любой сигнал может обнаруживать несколько рыночных моделей. Для управления использованием моделей вызывайте метод PatternsUsage(int value), где value - битовая карта  использования моделей (номер бита и номер модели совпадают). Бит равен 1 - модель используется, бит равен 0 - модель не используется (по-умолчанию все биты равны 1). Нумерация моделей как и битов начинается с 0.

Таким образом, если Вы хотите использовать только дивергенцию нужно использовать PatternsUsage(16);. Почему 16? 16 в двоичном виде 10000b (то есть бит 4 равен 1, остальные биты равны 0). А как раз model 4 "divergence of the oscillator and price"

Единственное "но", это придётся сделать "ручками".

После завершения работы Мастера, в редакторе откроется исходник. Найдите в нёт примерно такое место:

и добавьте одну строчку

filter0.PatternsUsage(16);

получится:

Пока это всё. Если будут вопросы, обращайтесь.

Спасибо. Получилось. И сразу возникли еще вопросы. В этом варианте дивергенции какой интервал времени между соседними вершинами (впадинами) принимается в расчет?
 
strelec:
Спасибо. Получилось. И сразу возникли еще вопросы. В этом варианте дивергенции какой интервал времени между соседними вершинами (впадинами) принимается в расчет?
Интервал не анализируется.
 

Имеется эксперт с помощью которого пытаюсь разобраться с событиями.

string event[10]=
{
"CHARTEVENT_KEYDOWN - событие нажатия клавиатуры, когда окно графика находится в фокусе",
"CHARTEVENT_OBJECT_CREATE — событие создания графического объекта",
"CHARTEVENT_OBJECT_CHANGE — событие изменения свойств объекта через диалог свойств",
"CHARTEVENT_OBJECT_DELETE — событие удаления графического объекта",
"CHARTEVENT_CLICK — cобытие щелчка мыши графике",
"CHARTEVENT_OBJECT_CLICK — событие щелчка мыши на графическом объекте, принадлежащего графику",
"CHARTEVENT_OBJECT_DRAG — событие перемещения графического объекта при помощи мыши",
"CHARTEVENT_OBJECT_ENDEDIT — событие окончания редактирования текста в поле ввода графического объекта LabelEdit",
"CHARTEVENT_CHART_CHANGE  — событие изменения графика",
"CHARTEVENT_CUSTOM+n — идентификатор пользовательского события, где n находится в диапазоне от 0 до 65535"
};
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   Print("id=(",id,") -- ",event[id],"  lparam=",lparam,"   dparam=",dparam,"   sparam=", sparam);
  }
//+------------------------------------------------------------------+

Получаю не соответствующие действиям события.

Точно соответствует клик на графике и нажатие кнопки

Спорное событие id=9 (CHARTEVENT_CUSTOM) которое генерируется например при смещении графика причем потоком примерно 10 одинаковых событий.

Не проверил событие CHARTEVENT_OBJECT_ENDEDIT.

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

В общем прошу помощи. 

 
kPVT:

Имеется эксперт с помощью которого пытаюсь разобраться с событиями.

Получаю не соответствующие действиям события.

Точно соответствует клик на графике и нажатие кнопки

Спорное событие id=9 (CHARTEVENT_CUSTOM) которое генерируется например при смещении графика причем потоком примерно 10 одинаковых событий.

Не проверил событие CHARTEVENT_OBJECT_ENDEDIT.

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

В общем прошу помощи. 

Вы изначально присваиваете уже назначенным числовым константам CHARTEVENT_XXXXXXXX свои числовые соответствия...

проблема вот в этом:

event[id]

нужно:

//--- нажатие мышкой на графическом объекте
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'");
     }
//--- нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
 
kPVT:

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

К сожалению, Ваш вопрос непонятен. Что конкретно работает не так?