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

 
Можно ли использовать модули торговых сигналов отдельно от советников создаваемых визардом? Для тестирования написал


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

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


2011.11.29 15:36:27    1234 (EURUSD,M1)    CExpertBase::Period: changing of timeframe is forbidden
2011.11.29 15:36:27    1234 (EURUSD,M1)    CExpertBase::Symbol: changing of symbol is forbidden

Как изменить символ и таймфрейм для стандартных торговых сигналов?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
Можно ли использовать модули торговых сигналов отдельно от советников создаваемых визардом? Для тестирования написал


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

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


2011.11.29 15:36:27    1234 (EURUSD,M1)    CExpertBase::Period: changing of timeframe is forbidden
2011.11.29 15:36:27    1234 (EURUSD,M1)    CExpertBase::Symbol: changing of symbol is forbidden

Как изменить символ и таймфрейм для стандартных торговых сигналов?
В принципе, можно. Но инициализация модуля торговых сигналов это целый "ритуал". Я боюсь, что не смогу "на пальцах" объяснить весь порядок инициализации.
 

Следующий код:

RectLabel* GetLabel()
{
   static bool initialized = false;
   static RectLabel label("rectlabel sample", 0, 0);
   
   if (!initialized)
   {
      Pos leftTop = {100, 100};
      Rect rect(leftTop, 100, 50);
      
      label.Move(rect);
      label.SetBGColor(clrYellowGreen);
      label.SetTooltip(" -- Yuuuu! -- ");
      
      initialized = true;
   }

   return GetPointer(label);
}

вызывает конструктор для label при каждом вызове функции.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

По следующему коду : в первом случае индикатор ставится,по второму нет (переключаю слешами).Ошибок не выдает.

#include <Charts\Chart.mqh>
CChart cc;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   int f_h=iFractals(_Symbol,_Period);
   
   if (f_h==INVALID_HANDLE) {Print("Ошибка создания индикатора.");return(-1);}
   
   ChartIndicatorAdd(0,0,f_h);   // устанавливает индикатор
   
   //cc.IndicatorAdd(0,f_h);     // НЕ устанавливает индикатор
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { }
 

По этой библиотеке по второму варианту выводит 0.Все остальные функции вроде работают.

#include <Trade\SymbolInfo.mqh>
CSymbolInfo si;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print (SymbolInfoDouble("EURUSD",SYMBOL_BID)); // все правильно
   
   si.Name("EURUSD");
   Print (si.Bid());            // выводит 0
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { 
 }
 
Karlson:

По следующему коду : в первом случае индикатор ставится,по второму нет (переключаю слешами).Ошибок не выдает.

Насколько я понял, на данный момент все три параметра являются обязательными.

Поэтому номер окна в котором индикатор будет выводиться нужно указывать (варианты:0 - главное окно, ChartIndicatorsTotal() - новое окно, от 0 до ChartIndicatorsTotal()-1 - конкретное существующее окно).

Вот то что не выдает ошибок не есть хорошо.

Karlson:

По этой библиотеке по второму варианту выводит 0.Все остальные функции вроде работают.

Скорей всего перед получением цены следует использовоть рефреши (как минимум RefreshRates).

Правильный вариант должен выглядеть примерно так

  si.Name("EURUSD");
  si.Refresh();
  si.RefreshRates();
  Print(si.Bid());
 

Спасибо.С Бидом действительно заработало,после указания рефреша.

Но вот с выводом индикатора,с использованием библиотеки требует 2 параметра.Подокно и хендл.Иначе ругается ,на неверное чиcло параметров.Тут я не могу разобраться,потому как в самой библиотеке используется тот же ChartIndicatorAdd.Получается что напрямую работает,а вызов через библиотеку нет.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 
Karlson:

Спасибо.С Бидом действительно заработало,после указания рефреша.

Но вот с выводом индикатора,с использованием библиотеки требует 2 параметра.Подокно и хендл.Иначе ругается ,на неверное чиcло параметров.Тут я не могу разобраться,потому как в самой библиотеке используется тот же ChartIndicatorAdd.Получается что напрямую работает,а вызов через библиотеку нет.

С использованием библиотеки требует 2 параметра. Чарт и подокно.
 
uncleVic:
С использованием библиотеки требует 2 параметра. Чарт и подокно.

Без хендла? И как же система узнает какой ставить индюк? ..Пока доверял тому что написано :) Подокно и хендл.

 

 
Karlson:

Без хендла? И как же система узнает какой ставить индюк? ..Пока доверял тому что написано :) Подокно и хендл.

По поводу библиотеки (из справки по классу)

IndicatorAdd

Добавляет на указанное окно графика индикатор с указанным хэндлом.

bool  IndicatorAdd(
   int   sub_win         // номер подокна
   int   handle          // хэндл индикатора
   );

По поводу непосредственной работы ChartIndicatorAdd.

ChartIndicatorAdd

Добавляет на указанное окно графика индикатор с указанным хэндлом.

bool  ChartIndicatorAdd(
   long  chart_id,                 // идентификатор графика
   int   sub_window                // номер подокна
   int   indicator_handle          // хэндл индикатора
   );

Что касается класса CChart.

Чтобы не было лишних вопросов стараемся предерживаться трех основных правил:

1. Смотрим в исходники, если что-то не понятно смотрим в документацию (помним что исходники всегда скажут "правду", а документация может и соврать);

2. Если для нас важна реализация ООП, начинаем с описания конкретного класса и доходим до "непосредственных исполнителей". Если важна "реальная работа", ООП нужно изучать в последнюю очередь (нисходящее/восходящее изучение кода);

3. Если после ознакомления с документацией и исходниками что-то не понятно, идем на форум.

Непосредственно по реализации метода IndicatorAdd в классе

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

class CChart : public CObject
  {
protected:
   long  m_chart_id; // chart identifier
public:
   //methods for working with indicators
   bool  IndicatorAdd(int subwin,int handle);
  }

bool CChart::IndicatorAdd(int subwin,int handle)
  {
//checking (проверка корректности идентификатора графика)
   if(m_chart_id<=0) return(false);
//Непосредственно в обработку выдаются три параметра
   return(ChartIndicatorAdd(m_chart_id,subwin,handle));
  }
Причина обращения: