Скачать MetaTrader 5

Перенос расчета индикаторов в dll

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Антон
35
Антон  

Здравствуйте!

Написал индикатор на mql4, при этом часть расчетов (статистических) происходит в DLL написанной на C++. Сейчас считаю необходимым, перенос расчета основной логики индикатора в DLL (для повышения скорости и возможности использования на других платформах). Цену и объем понял как переносить. Теперь нужно в DLL расчитать значения основных индикаторов. Вижу два выхода, либо самому писать функции индикаторов, либо использовать готовые библиотеки. Так как велосипед изобретать не хочется, если кто знает где их взять (библиотеки индикоторов) скиньте ссылку пожалуйста!

Vladyslav Goshkov
2142
Vladyslav Goshkov  
palat:

Здравствуйте!

Написал индикатор на mql4, при этом часть расчетов (статистических) происходит в DLL написанной на C++. Сейчас считаю необходимым, перенос расчета основной логики индикатора в DLL (для повышения скорости и возможности использования на других платформах). Цену и объем понял как переносить. Теперь нужно в DLL расчитать значения основных индикаторов. Вижу два выхода, либо самому писать функции индикаторов, либо использовать готовые библиотеки. Так как велосипед изобретать не хочется, если кто знает где их взять (библиотеки индикоторов) скиньте ссылку пожалуйста!

http://ta-lib.org/
Антон
35
Антон  
VladislavVG:
http://ta-lib.org/

Спасибо большое!!
Sceptic Philozoff
Модератор
17841
Sceptic Philozoff  
Дублирующая тема удалена.
Антон
35
Антон  

Возник вопрос при использовании библиотек TA-lib. MA, BBANDS считает верно, а остальное нет. Например R% считает верно(как в МТ4), если написать:

TA_WILLR(0,rates_total,&high[0],&low[0],&close[-6],7,&outBeg,&outNbElement,&out[0]);

Формула расчета индикатора Williams’ Percent Range схожа с формулой для Stochastic Oscillator:

%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100 


Где:
CLOSE (i) — сегодняшняя цена закрытия;
MAX (HIGH (i - n)) — наибольший максимум за n предыдущих периодов;
MIN (LOW (i - n)) — наименьший минимум за n предыдущих периодов.

а если написать:

TA_WILLR(0,rates_total,&high[0],&low[0],&close[0],7,&outBeg,&outNbElement,&out[0]);

То в массиве close[] в качестве сегоднящней цены он выберет не сlose[0], а close[6]. Поэтому в верхней(верной) строчке стоит close[-6], и тогда подсчет идет верно.

Этот факт я установил метод тыка. Для остальных индикатор этого сделать не получилось.

Возможно у кого нибудь есть шаблоны как вводить туда (в функции ta-lib) значения, чтобы считал верно и выбирал нужные значения из массивов. Скиньте пожалуйста

Андрей
1890
Андрей  
Средствами C++ можно сделать такое окружение, что в него будет можно
просто копировать mql-код в программу (создать Close[], Low[] и т.д.)
Антон
35
Антон  
jartmailru:
Средствами C++ можно сделать такое окружение, что в него будет можно
просто копировать mql-код в программу (создать Close[], Low[] и т.д.)


Спасибо за ответ!

Но мне нужно, если я правильно Вас понял, немного другое. Я переношу логику расчета индикатора, с целью использования на других платформах. Поэтому библиотеки TA-lib мне подходят. Однако есть сложности которые я описал выше!

Андрей
1890
Андрей  
Так а язык С++ переносится на другие платформы...
Речь о другом- переносить mql в С++ - просто!
И что самое главное- при правильном переносе-
можно уже не тратить много времени на проверку...
Антон
35
Антон  
jartmailru:
Так а язык С++ переносится на другие платформы...
Речь о другом- переносить mql в С++ - просто!
И что самое главное- при правильном переносе-
можно уже не тратить много времени на проверку...

Если честно, я с этим не сталкивался! Можете по подробнее этот процесс описать или пример, статью, ссылку и т.д. пожалуйста выложить. Буду благодарен!
Андрей
1890
Андрей  
Это-- если надо, чтобы в программе были Close[], Open[] и т.д.

class TimeSerie {
public:
double operator [] (int index) { ... }
}
Начинка роли не играет-- на ваш выбор.
Например так:

TimeSerie Close(данныеСоСвечками, типClose);

double operator [] (int index) {
Свеча свеча = данныеСоСвечками ( данныеСоСвечками.размер - индекс );
if(мойТип == типClose ) return свеча->close;
}

можно прямо в mql заменить эти вызовы на функции close(), open() и т.д.
И написать в базовом классе определения этих методов.

Дальше код индикатора вставляется в любого наследника- и voilà...
Антон
35
Антон  
Ответ:

Вот так я передаю таимсерии в C++

MQl:

#import "Candle_Indicator.dll"
double CandleIndicator(double arr[,6],int,int,int);
...
double Rates[,6];
int rates_total=ArrayCopyRates(Rates);
CandleIndicator(Rates,rates_total,0,1);

С++ *.h

#pragma pack(push, 1)
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)

double __stdcall CandleIndicator(RateInfo* rates,int rates_total,int shift,int nrate);

С++ *.cpp

double __stdcall CandleIndicator(RateInfo* rates,int rates_total,int shift,int nrate)
{

  if(rates==NULL)
   return 0.0;
   if(rates_total<0)
    return 0.0;
 if(shift<0 || shift>=rates_total)
     return 0.0;
   if(nrate<0 || nrate>5)
     return 0.0;

// Создаю новые массивы чтобы скопировать в них массивы передаваемые по ссылке
int* ctm = new int[rates_total];
double* open = new double[rates_total];
double* low = new double[rates_total];
double* high = new double[rates_total];
double* close = new double[rates_total];
double* vol = new double[rates_total];
double* out = new double[rates_total];

// "Переворачиваю" массивы
for (int c=0;c<rates_total-1;c++)
{
ctm[c]=rates[rates_total-1-c].ctm;
open[c]=rates[rates_total-1-c].open;
low[c]=rates[rates_total-1-c].low;
high[c]=rates[rates_total-1-c].high;
close[c]=rates[rates_total-1-c].close;
vol[c]=rates[rates_total-1-c].vol;
}

}

Далее я хотел эти массивы использовать для подсчета индикатора, мне посоветовали воспользоваться готовой библиотекой TA-lib, куда подаешь эти массивы и получаеш массив(out[]) со значениями индикатора. Вы предлогаете в проект на C++ скопировать mql-код индикатора, предварительно его изменив, а затем вызывать как функцию. Я правильно Вас понял? Если нет, то можете на примере MA описать. Спасибо!

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий