Бета-тестирование MetaTrader 5 началось! - страница 108

 
stringo >>:
Наипоследняя версия MACD Sample. version 5.05. Инклюдные файлы помечены Revision 2009.11.10

Спасибо...

 
Interesting >>:

А можно встроенными средствами узнать/изменить цвет фона графика? В MQL4 цвет узнавал через WinAPI...


PS

Хотелось бы еще иметь программный способ смены ТФ у графика.

Сверкаем... ;)))

Осталось доработать алгоритм:

- запоминаем исходный цвет

- моргаеи цветами

- возвращаем исходный цвет

int tick = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  ChartRedraw();
  EventSetTimer(seconds);return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit()
  {
   EventKillTimer();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   tick ++;
//--- 
   if(tick == 2)          ChartSetInteger(0,CHART_COLOR_BACKGROUND,Red); 
   if(tick == 1)          ChartSetInteger(0,CHART_COLOR_BACKGROUND,Green); 
   if(tick == 3)          ChartSetInteger(0,CHART_COLOR_BACKGROUND,Blue); 
   if(tick == 4)          ChartSetInteger(0,CHART_COLOR_BACKGROUND,White); 
   if(tick == 5){tick = 0;ChartSetInteger(0,CHART_COLOR_BACKGROUND,Yellow); } 
   
   ChartRedraw();
  }
 
Вопрос разработчикам - Существует ли ограничение на количество параметров в эксперте?
 
MetaDriver >>:

1. Индикаторы работают в интерфейсном потоке. Чтоб его не прегружать и не тормозить интерфейс.

В МТ5 расчет индикаторов происходит не в интерфейсном потоке, а в потоке обработки истории. Но тормозить и перегружать этот поток также не желательно, т.к. в нем происходит и обработка тиков и расчет всех прочих индикаторов по данному символу. Выполнение в общем потоке, а не в отделенном, это основное отличие кастомного индикатора от эксперта или скрипта.


2. Штатного похоже не предусмотрено. Я сделал через файл. Расчитанный в эксперте массив передаётся в индикатор.

Но если МТ не в сети или тиков просто долго нету, приходится переинициализировать весь чарт, чтоб OnCalculate() отработал.

Разработчикам: Механизма передачи инфы между индикаторами и экспертами(скриптами) действительно остро не хватает.

Хорошо бы иметь возможность через хендл индикатора запрашивать не только копии буферов, но и другую инфу, а в идеале

ещё и передавать им что-то или ходя бы как минимум инициировать насильственный перерасчёт. Я понимаю, что "концепция жмёт",

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

По поводу концепции. Концептуально расчетная часть индикатора лишь код заполнения массивов исходящих данных на основе массивов входящих данных и тут не многое "пролазит".

 
Interesting >>:

PS

Хотелось бы еще иметь программный способ смены ТФ у графика.

ChartSetSymbolPeriod()

 

Временно решил проблему с библиотеками создав каталог "MQL5\Include\Libraries" и переложив туда все библиотеки.

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

 

Почему функция ChartPeriod(); показывает таймфрейм правильно только до Н1?  На Н1 показывает уже число 16385 а не 60, на Н4 16388 а не  240. Или я неправильно это понимаю?

 int Perriod=ChartPeriod(0);
  Print(Perriod);

 
arbuz >>:

Почему функция ChartPeriod(); показывает таймфрейм правильно только до Н1? На Н1 показывает уже число 16385 а не 60, на Н4 16388 а не 240. Или я неправильно это понимаю?

int Perriod=ChartPeriod(0);
Print(Perriod);

Если необходимо получить количество секунд в периоде следует использовать специальную функцию

int  PeriodSeconds(
   ENUM_TIMEFRAMES  period=PERIOD_CURRENT      // период графика
   ); 

А ChartPeriod() как я понял возвращает период графика по его хендлу.


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

ENUM_TIMEFRAMES varPeriod; //Период графика
int varSec;                //Количество секунд в периоде

varPeriod = ChartPeriod(указатель на график);//если для текущего графика то можно юзать Period() или _Period
varSec = PeriodSeconds(varPeriod);


PS

В общем же виде ChartPeriod() и Period() возвращают ENUM_TIMEFRAMES (специализированный тип), а как Int результат следует юзать только при передаче его "внешней программе" (например DLL).


Кстати (разработчикам) - А почему перестали помещать в справке вместе с описанием возможных значений таких специализированных типов и их числовые коды (возможно вопросов будет меньше, да и при работе с API это сильно упростит жизнь народу)?

 

Разбирался с поставляемыми классами.

bool C_R003::Processing()
{
//--- refresh rates
if(!m_symbol.RefreshRates()) return(false);
//--- refresh indicators
m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
Ao1_H =m_AO.Main(1); Print("Ao1_H = ", Ao1_H);
Ao2_H =m_AO.Main(2); Print("Ao2_H = ", Ao2_H);

В таком виде индикатор будет не как таймсерия, но если выполнить в фале indikator.mqh команду

//+------------------------------------------------------------------+
//| Constructor CIndicatorBuffer. |
//| INPUT: no. |
//| OUTPUT: no. |
//| REMARK: no. |
//+------------------------------------------------------------------+
CIndicatorBuffer::CIndicatorBuffer()
{
//--- initialize protected data
m_size =0;
m_offset=0; ArraySetAsSeries(m_data, true);
}

Тоже и со свежей МАСД

CIndicatorBuffer::CIndicatorBuffer()
{
//--- initialize protected data
m_size =0;
m_offset=0; ArraySetAsSeries(m_data, true);
}

m_macd_current =m_MACD.Main(0); Print("m_macd_current = ", m_macd_current);
m_macd_previous =m_MACD.Main(1); Print("m_macd_previous = ", m_macd_previous);
m_macd_2 =m_MACD.Main(2); Print("m_macd_2 = ", m_macd_2);

Вот так МАСД в программе и индикатор будут совпадать.

то всё будет правильно

 
stringo >>:

А может, это наш косяк? Вы не могли бы прислать Вашего эксперта на stringo AT metaquotes DOT ru для исследования ситуации?

PS. трай-кэтча точно не будет.

Нашел ошибку, и как и думал это именно "косяк" терминала (Где Вы только такую травку берете)...


Вылез сразу после того как к советнику были подключены библиотеки при помощи заголовочника.

А ведь по всем правилам должно работать, в MQL4 и работало.


Ход работы таков:

1. Создаем библиотечный файл и сохраняем его под любым именем, к примеру MyLibFunction.mq5 (Автоматически он сохраняется в MQL5\Libraries и по идеи это правильно).

2. Помещаем туда любую функцию, в моем случае это вот такой код (не спрашивайте почему именно такой)...


//Function IsTesting
bool IsTesting()
{
//----------------------------------------------------------------------------//
//Служебные переменные
bool Reset;
//----------------------------------------------------------------------------//
//Проверяем ведется работа в режиме тестирования или нет
Reset = MQL5InfoInteger(MQL5_TESTING);
//----------------------------------------------------------------------------//
return(Reset);
//----------------------------------------------------------------------------//
}


3. Создаем заголовочный файл с любым названием, в моем случае это это "Migration.mqh". Сохраняем его в каталоге MQL5\Include.

В нутри этого файла делаем вызов нашей функции вот при помощи такого блока


#import "MyLibFunction.ex5" //Можно как MyLibFunction.mq5
//----------------------------------------------------------------------------//
bool IsTesting();
//----------------------------------------------------------------------------//
#import

4. Компилируем все. При этом вылезает куча предупреждений, но компилятор пропускает код.

5. Подключаем к эксперту заголовоник простым вызовом.


И Что получаем в итоге:

Вариант 1 - терминал пишет что не может открыть MyLibFunction. вот это пишет в логе - Cannot open MyLibFunction.ex5 (причем такой результат будет и если положить файл в MQL5\Include).

Вариант 2 - файл находится в MQL5\Include и подключается как MyLibFunction.mq5. Вот что пишет в длге - DLL loading is not allowed.

Нужно дабаить, что при варианте с MyLibFunction.ex5 не отображается даже диалог с параметрами советника!!! :(

Если поместить функцию внутрь заголовочника все работает как часы....


PS

Я так полагаю что эта ошибка в сочетании с 219 релизом и заставляет терминал вылетать по "Crash details":

Time : 2009.11.10 13:50
Program : Client Terminal
Version : 500.219 (09 Nov 2009)
Revision : 14555
OS : Windows XP Professional Service Pack 3, v.3311 (Build 2600)
Processors : 1 x X86 (level 15)
Memory : 1833456/1025868 kb
Virtual : 2097024/1990616 kb


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

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