Ноя 25

Сайт, позволяющий бесплатно просматривать телеканалы в режиме онлайн. Функция аналог iMA. Передача массива в dll из программы на mq4 (MT4).

В сегодняшней заметке три блока. Понравился сайт, позволяющий бесплатное ТВ смотреть онлайн без регистрации. Для просмотра можно выбрать телеканалы по тематике (бизнес, новости, музыка, образование, детские передачи и пр.), стране (не только Россия, но и США, Англия, страны Балтии и др.). Естественно, можно выбирать каналы и по языку вещания (русский, английский, немецкий и другие). Весьма полезно, если хочешь посмотреть канал, который не доступен по кабельной сети или по спутниковому TV. Весьма полезно бывает посмотреть американские и английские каналы не только в плане изучения языка, но и для того, чтобы сравнить, как одни и те же события освещают у них и у нас в стране. В общем, весьма примечательный ресурс – рекомендую.

* * *

* * *
Вторая тема подборки. Понадобилось мне написать аналог индикатора iMA, то есть захотелось, чтобы программа сама рассчитывала то, что позволяет вычислить, например, срока кода buf2[i] = iMA(NULL, 0, WavePeriod, 0, MODE_EMA, PRICE_TYPICAL, i);. К сожалению, найти совершенно четкие формулы расчета iMA еще та проблема. С трудом нашел следующее. Полагаю, что тем, кто знает mq4 и кому нужно, для тех текст вполне очевиден, а кто не знает, тому и не надо…

// http://codebase.mql4.com/ru/163
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//—- indicator parameters
extern int MA_Period=10;
extern int MA_Shift=0;
//extern int MA_Method=0;
//—- indicator buffers
double ExtMapBuffer[];
//—-
int ExtCountedBars=0;
//+——————————————————————+
//| Custom indicator initialization function
//+——————————————————————+
int init()
{
int draw_begin;
string short_name;
//—- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexShift(0,MA_Shift);
// IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
if(MA_Period<2) MA_Period=10;
draw_begin=MA_Period-1;
//—- indicator short name
draw_begin=0;
IndicatorShortName(«EMA»);
SetIndexDrawBegin(0,draw_begin);
//—- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
//—- initialization done
return(0);
}
//+——————————————————————+
int start()
{
if(Bars<=MA_Period) return(0);
ExtCountedBars=IndicatorCounted();
//—- check for possible errors
if (ExtCountedBars<0) return(-1); //—- last counted bar will be recounted if (ExtCountedBars>0) ExtCountedBars–;
//—-
double pr=2.0/(MA_Period+1);
int pos=Bars-2;
if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//—- main calculation loop
while(pos>=0)
{
if(pos==Bars-2) ExtMapBuffer[pos+1]=(Close[pos+1]+Low[pos+1]+High[pos+1])/3.0;
// Close[pos+1];
// PRICE_TYPICAL 5 Типичная цена, (high+low+close)/3
//(Close[pos+1]+Low[pos+1]+High[pos+1])

ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
pos–;
}
//—- done
return(0);
}

Третья часть. Формулу искал не просто так, а чтобы написать программу, которая будет выполнять расчеты на другом языке программирования. МТ4 и МТ5 используются только для того, чтобы получать котировки и выставлять ордера по сигналу, а сигнал формируется в независимой программе (разрабатываю на Delphi).

Пример программы, формирующей DLL библиотеку massiv с функцией massiv1.

library massiv;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library’s USES clause AND your project’s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL–even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
SysUtils,
Classes;
{$R *.res}
type
m = array [0..200] of real;
function massiv1(a:m):integer; stdcall;
var
F: TextFile;
i: Integer;
begin
AssignFile(F, ‘c:\massiv\xyz.txt’);
if FileExists(‘c:\massiv\xyz.txt’) then begin Append(F);
WriteLn(F,’ Append ———-’);end
else
begin
Rewrite(F);
WriteLn(F,’ New file ———-’);
end;
for i:=0 to 200 do
WriteLn(F,’i=’,i,’ ‘, a[i]:10:5);
CloseFile(F);
massiv1:=0;
end;
exports massiv1;
begin
end.

И пример обращения к этой библиотеке – вызов функции из программы на MQL (mq4, MT4):

#import «massiv.dll»
int massiv1(double a[]);
#import
double a[201];
double f=0;
int i,j;
int flag=0;
int rez=1;
int init()
{
for(i=0;i<200;i++)
a[i]=Close[i];
rez=massiv1(a);
Comment(«OK rez=»,rez,» Bars=»,Bars);
return(0);
}
int deinit() { return(0); }
int start() { return(0); }

В функцию передается массив, состоящий из 200 элементов. Последние 200 баров – цена закрытия. Впрочем, это очевидно из кода, как и сам код тоже…

Поделитесь статьей со своими друзьями
Общайтесь со мной:
comments: Closed

Comments are closed.