Получить 100$ на счет бесплатно!!

Получить депозит форекс за общение на форуме Бездепозитный бонус 100$

Полезные функции от artamir

Сборник процедур/функций, чтоб не изобретать велосипед.
  
МедальКубок
Сообщений: 536
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанные с их использованием. Каждую функцию буду публиковать двумя постами. В первом посте код функции, во втором примеры использования и небольшие пояснения.

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

Оглавление.


f() canWeTrade


f() CWT


f() addInfo


f() iif

Включено в состав библиотеки sysOther.mqh

f() BP


f() StringToArrayString


void SelectedSymbols


sysOther.mqh

v0.0.0.7 от 2013.08.06

sysStructure.mqh

v0.0.0.5 от 2013.08.06

sysNormalize.mqh


sysTrades.mqh

v0.0.0.25 от 2013.09.29

iFractal.mqh


iMA.mqh


iStoh.mqh

Редактировалось: 23 раз (Последний: 1 октября 2013 в 16:19)
МедальКубок
Сообщений: 536
Начнем с определения разрешенного времени.

canWeTrade



Проверяет, если текущее время входит в заданный диапазон.

Возвращает true если текущее время входит в заданный диапазон

[code=php]
extern bool CWT_needStopOnTime = false;
extern string CWT_startTradeTime = "03:00"; //Время начала работы советника
extern string CWT_endTradeTime = "18:00"; //Время окончания работы советника

bool canWeTrade(){
if(!CWT_needStopOnTime)
return(true);

string sthisStartTime = StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",CWT_startTradeTime);
string sthisEndTime = StringConcatenate(TimeToStr(TimeCurrent(),TIME_DATE)," ",CWT_endTradeTime);
datetime thisStartTime = StrToTime(sthisStartTime);
datetime thisEndTime = StrToTime(sthisEndTime);

bool res = false;


if(TimeCurrent() > thisStartTime && TimeCurrent() < thisEndTime){

return(true);
}

addInfo(StringConcatenate("STOP AUTOOPEN !!!!",""));
return(res);
}
[/code]
Редактировалось: 1 раз (Последний: 8 июля 2013 в 17:20)
МедальКубок
Сообщений: 536
Немного описания.
Строки 2-4 это внешние переменные, которые редактируются пользователем.

Пример использования:
[code=php]
int start(){
if(!canWeTrade()) return(0); //Прекращается дальнейшая работа советника.


}
[/code]

Дополнение:
Строку 23 можно закомментировать.
МедальКубок
Сообщений: 536

addInfo



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

[code=php]
/**
\version 0.0.0.3
\date 2013.07.08
\author Morochin Artiom
\details Вывод сообщений пользователю в нижний угол окна инструмента, на котором запущен советник.
Сообщения выводятся с помощью графических объектов.
\internal
>Hist:
@0.0.0.3@2013.07.08@artamir [] addInfo
@0.0.0.2@2013.07.08@artamir [] ShowInfo
*/



//--- деинициализация инфо-сообщений
void deinitInfo(){
/**
\version 0.0.0.1
\date 2013.07.08
\author Morochin Artiom
\details Удаление объектов, созданных ShowInfo().
*/

string oName = StringConcatenate(EXP_NAME,"_info");

int obj_tot = ObjectsTotal();
for(int i = 0; i < obj_tot; i++){
if(StringFind(ObjectName(i), oName) > -1){
ObjectDelete(ObjectName(i));
}
}
}
//---
void upInfo(){
/**
\version 0.0.0.1
\date 2013.07.08
\author Morochin Artiom
\details Удаляет из массива самое старое сообщение, а для всех остальных сообщений изменяет индексы.
\internal
>Hist:
@0.0.0.1@2013.07.08@artamir [] upInfo
*/

int ks = ArraySize(info);
for(int i = 1; i < ks; i++){
info[i-1] = info;
}
}

void ShowInfo(){
/**
\version 0.0.0.1
\date 2013.07.08
\author Morochin Artiom
\details Выводит массив сообщений в окно инструмента, где запущен советник.
Если не созданы графические объекты, то создает их.
\internal
>Hist:
@0.0.0.1@2013.07.08@artamir [] ShowInfo
>Rev:0
*/

int y_startdistance = 50;

int ks = ArraySize(info);
string infoName = "info";
for(int i = 0; i < ks ; i++){
string oName = StringConcatenate(EXP_NAME,"_",infoName,i);
if(ObjectFind(oName) == -1){
ObjectCreate(oName,OBJ_LABEL,0,0,0);
}

ObjectSet(oName,OBJPROP_XDISTANCE,30);
ObjectSet(oName,OBJPROP_YDISTANCE,y_startdistance-i*20);
ObjectSet(oName,OBJPROP_CORNER,2);
//--- color
if(i == 0){
color clr = Red;
}

if(i == 1){
clr = Coral;
}

if(i == 2){
clr = Silver;
}

ObjectSetText(oName, info[ks-1-i], 10, "Arial", clr);
}
}

void addInfo(string mess){
/**
\version 0.0.0.1
\date 2013.07.08
\author Morochin Artiom
\details Добавляет к массиву сообщений новое сообщение.
\internal
>Hist:
@0.0.0.1@2013.07.08@artamir [] addInfo
>Rev:0
*/

upInfo();

string sTime = TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES);
mess = StringConcatenate(mess," | ",sTime);
info[2] = mess;
ShowInfo();
}

[/code]
МедальКубок
Сообщений: 536
Пример использования.

[code=php]
int start()
{
//----
addInfo(StringConcatenate("AccountName = ", AccountName()));
Sleep(60000);// для того, чтоб показать изменение времени поступления сообщения
addInfo(StringConcatenate("AccountCompany = ", AccountCompany()));
Sleep(60000);// для того, чтоб показать изменение времени поступления сообщения
addInfo(StringConcatenate("AccountNumber = ",AccountNumber()));
Sleep(60000);
//----
return(0);
}
[/code]
МедальКубок
Сообщений: 536
Еще одна реализация на тему разрешения торговли.
Но в данном случае время задается целочисленными параметрами.

CWT



[code=php]
//{ CAN WE TRADE
bool CWT( int d = -1 /** day of week*/
, int hs = 0 /** hour start*/
, int ms = 0 /** min. start*/
, int he = 0 /** hour end*/
, int me = 0 /** min. end*/){
/**
\version 0.0.2
\date 2013.04.25
\author Morochin Artiom
\details checking if we can trade
\internal
>Hist:
@0.0.2@2013.04.25@artamir [] getTimeByShift
@0.0.1@2013.04.25@artamir [] CWT
*/

bool res = true;
datetime dtS, dtE;
string sy = Symbol();

//------------------------------------------------------
res = iif(d<=-1,
true, /*можем работать в любой день*/
iif(DayOfWeek() != d,
false, /*день не равен заданному*/
true));

//------------------------------------------------------
if(res){ //если прошли проверку на день

dtS = getTimeByShift(0, hs, ms);
dtE = getTimeByShift(0, he, me);

if(Debug && BP_CWT){
BP( "CWT"
, "dtS = ", TimeToStr(dtS, TIME_DATE|TIME_MINUTES)
, "dtE = ", TimeToStr(dtE, TIME_DATE|TIME_MINUTES)
, "tc = ", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES)
, "ds = ", getTimeByShift(0, 0, 0));
}

if(dtS < dtE){
if(TimeCurrent() >= dtS && TimeCurrent() <= dtE){
return(true);
}else{
return(false);
}
}

if(dtS > dtE){
if(TimeCurrent() <= dtS || TimeCurrent() >= dtE){
return(true);
}else{
return(false);
}
}
}

//------------------------------------------------------
return(res);
}

datetime getTimeByShift(int shift, int h, int m, string symb = ""){
string sy = symb;

if(symb == ""){
sy = Symbol();
}

//------------------------------------------------------
return(DT_DayStartByShift(shift) /*Начало дня*/
+ HoursToSeconds(h) /* добавили часы*/
+ MinutesToSeconds(m) /* добавили минуты*/);
}

datetime DT_DayStartByShift(int shift = 0){
/**
\version 0.0.1
\date 2013.04.25
\author Morochin Artiom
\details Возвращает datetime начала дня по заданному индексу бара
\internal
>Hist:
@0.0.1@2013.04.25@artamir [] DT_DayStartByShift
*/
string sy = Symbol(); //текущий символ
int tf = 0; //текущий тф.
datetime dtTimeShift = 0; //датавремя открытия бара по индексу.

//------------------------------------------------------
string sDateShift = "";
datetime dtDayStart = 0;

dtTimeShift = iTime(sy, tf, shift);
sDateShift = TimeToStr(dtTimeShift, TIME_DATE);

dtDayStart = StrToTime(sDateShift);

//------------------------------------------------------
return(dtDayStart);
}

int HoursToSeconds(int h){
return(h*60*60);
}

int MinutesToSeconds(int m){
return(m*60);
}
//}
[/code]
МедальКубок
Сообщений: 536
Для правильной работы предыдущих функций необходима функция

iif


Если первый параметр == true, то возвращается второй параметр,
иначе возвращается третий параметр.

[code=php]
double iif( bool condition, double ifTrue, double ifFalse ){
/*
>Ver : 0.0.1
>Date : 2012.04.04
>History:
*/
if( condition ) return( ifTrue );
//---
return( ifFalse );
}
[/code]
МедальКубок
Сообщений: 536
Примеры использования:

[code=php]bool bCWT = CWT(-1, 8, 30, 24, 0); [/code]
Для любого дня недели вернет true если серверное время последней известной котировки находится в пределах 8:30 - 24:00

Если советник должен работать с 21:15 вечера до 6:45 утра
[code=php]bool bCWT = CWT(-1, 21, 15, 6, 45); [/code]

Если советник должен работать только в пятницу с 20:54 по 20:59
[code=php]bool bCWT = CWT(5, 20, 54, 20, 59);[/code]

Ограничение.
Этот блок функций будет правильно работать, если эксперт запущен на таймфрейме <= D1
МедальКубок
Сообщений: 536
Отладка

BP



BreakPoint точка останова.

Функция помогает при отладке кода.

Результатом работы функции является модальное окно прерывающее дальнейшее выполнение кода до нажатия кнопки "ОК" или "Отмена"

Для использования функции нужно подключить WinUser32.mqh, который идет в поставке с Metatrader4.

Удобно использовать в тестере стратегий с включенной визуализацией.

[code=php]
void BP(string txt = "",
string p11 = "", string p12 = "",
string p21 = "", string p22 = "",
string p31 = "", string p32 = "",
string p41 = "", string p42 = "",
string p51 = "", string p52 = "",
bool useDebug = true ){

/*
>Ver : 0.0.2
>Date : 2012.06.25
>History:
@0.0.2@2012.06.25@artamir [+] useDebug = проверка на разрешение вызова модальной формы
@0.0.1@2012.06.25@artamir []
>Description:
Break point. Use with vizualization.
*/

if(!useDebug) return;
//-------------------
string strOutput = StringConcatenate( p11,p12,"\n",
p21,p22,"\n",
p31,p32,"\n",
p41,p42,"\n",
p51,p52,"\n");

static int flOK = 1;
if(flOK == 1){
flOK = MessageBoxA(WindowHandle(Symbol(),0), strOutput, txt, MB_OKCANCEL);
return;
}else{
return;
}
}
[/code]
МедальКубок
Сообщений: 536
Пример использования:

[code=php]
BP("Текст заголовка окна :)"
,"dtS = ", TimeToStr(dtS, TIME_DATE|TIME_MINUTES)
,"dtE = ", TimeToStr(dtE, TIME_DATE|TIME_MINUTES)
,"tc = ", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));
[/code]
Медаль
Сообщений: 815
Скажите, artamir, а на заказ Вы пишите советники, или это просто советы программиста?
МедальКубок
Сообщений: 536
san
Скажите, artamir, а на заказ Вы пишите советники, или это просто советы программиста?

Пишу и на заказ. а данную ветку задумывал как помощь программистам, чтоб не изобретали велосипед :)
Если есть вопросы непосредственно касающиеся опубликованных процедур/функций, то задавайте, с радостью на них отвечу.
Медаль
Сообщений: 815
artamir, для начала меня интересуют расценки на написание советника и индикаторов.
МедальКубок
Сообщений: 536
san

artamir, для начала меня интересуют расценки на написание советника и индикаторов.


На счет расценок ответил в личку.

А если есть какие-то тех. задания, то продолжим в теме Бесплатное написание советников и индикаторов
Возможно, ваше задание окажется тем самым, которое будет реализовано.
Редактировалось: 1 раз (Последний: 9 июля 2013 в 19:04)
МедальКубок
Сообщений: 536
Немного отвлеклись от темы.

Оглавление


iFractal.mqh



Это заголовочный файл и должен находиться в папке include

Процедуры и функции определенные в файле:

Глобальные переменные и определения


[code=php]#define iFR.MODE_STD 1 //Фрактал в классическом понимании. Наивысший максимум или наинизший минимум среди заданного количества баров
#define iFR.MODE_HL 2 //Наивысший максимум среди последовательно поднимающихся а затем последовательно опускающихся максимумов.
#define iFR.PR_HL 1 //По типу цены: хай, лоу
#define iFR.PR_C 2 //По закрытию

int iFR.NL = 1; //Количество ближайших баров слева
int iFR.NR = 1; //Количество ближайших баров справа
int iFR.Mode = 2; //Метод поиска фрактала
int iFR.Pr = 1; //Цена поиска фрактала
[/code]

Процедуры и функции


void iFR.Set


Установка глобальных переменных, для расчетов фракталов

bool iFR.IsUpMode1


Определение верхнего фрактала в классическом описании

bool iFR.IsDwMode1


Определение нижнего фрактала в классическом описании

bool iFR.IsUpMode2


Проверяет, если бар с индексом fb является верхним фракталом
Бар считается верхним фракталом, максимум бара является самым высоким максимумом слева и справа на заданное кол. баров. А так же если слева максимумы баров последовательно возрастают, а справа - убывают.

bool iFR.IsDwMode2


Проверяет, если бар с индексом fb является нижним фракталом
Бар считается нижним фракталом, минимум бара является самым низким минимумом слева и справа на заданное кол. баров. А так же если слева минимумы баров последовательно понижаются, а справа - возрастают.

bool iFR.IsUp


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

bool iFR.IsDw


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

int iFR.getNearstUp


Возвращает номер бара ближайшего верхнего фрактала. Отсчет ведется от бара с индексом startBar

int iFR.getNearstDw


Возвращает номер бара ближайшего нижнего фрактала.

double iFR.getNearestUpPrice


Возвращает цену хая ближайшего верхнего фрактала

double iFR.getNearestDwPrice


Возвращает цену лоу ближайшего нижнего фрактала
Прикрепленные файлы:
iFractal_v6uat.mqh | 10.74 Кб | Скачали: 515
Редактировалось: 14 раз (Последний: 22 августа 2013 в 13:00)
МедальКубок
Сообщений: 536

Инструкция по установке/использованию.


Скачать файл в папку текрминала/experts/include
Переименовать файл в "iFractal.mqh"
В коде советника, скрипта или индикатора подключается следующим образом

[code=php]
#include
[/code]

После этого можно пользоваться процедурами и функциями из этого файла
Редактировалось: 4 раз (Последний: 10 июля 2013 в 13:06)
МедальКубок
Сообщений: 536

iFR.Set


Установка глобальных переменных, для расчетов фракталов

[code=php]
void iFR.Set(int nl=1, int nr=1, int mode = 1, int price = 1){
/*
>Ver : 0.0.3
>Date : 2013.01.18
>Author : Morochin Artiom
>Desc : set fractal bars.
*/
iFR.NL = nl;
iFR.NR = nr;
iFR.Mode = mode;
iFR.Pr = price;
}
[/code]
Редактировалось: 1 раз (Последний: 10 июля 2013 в 12:00)
МедальКубок
Сообщений: 536

iFR.IsUpMode1


Определение верхнего фрактала в классическом описании

int fb - индекс бара для которого определяется, является ли этот бар верхним фракталом.

[code=php]
bool iFR.IsUpMode1(int fb = 1){
/*
>Ver : 0.0.3
>Date : 2013.01.18
>Hist :
@0.0.3@2013.01.18@artamir [+] Добавлен тип цены: закрытие
@0.0.2@2013.01.11@artamir []
@0.0.1@2013.01.10@artamir []
>Author : Morochin Artiom
>Desc : Определение верхнего фрактала в классическом описании.
*/
//--------------------------------------------------
bool f = true;
double h = 0;
double fbH = 0;

//--------------------------------------------------
int idx = 0;

//--------------------------------------------------
if(fb < iFR.NR){
return(false); //нехватает количества баров справа для определения фрактала.
}

//--------------------------------------------------
if(iFR.Pr == iFR.PR_HL){
fbH = iHigh(NULL, 0, fb); //Хай заданного бара.
}
if(iFR.Pr == iFR.PR_C){
fbH = iClose(NULL, 0, fb); //Закрытие заданного бара.
}


//--------------------------------------------------
for(idx = fb-1; idx >= (fb-iFR.NR); idx--){

//----------------------------------------------
if(iFR.Pr == iFR.PR_HL){
h = iHigh(NULL, 0, idx);
}

if(iFR.Pr == iFR.PR_C){
h = MathMax(iClose(NULL, 0, idx),iOpen(NULL, 0, idx));
}
//----------------------------------------------
if(h >= fbH){
f = false; // Не прошли условие, что заданный бар самый высокий слева на право
}
}

//----------------------------------------------
if(!f){
return(false);
}

//----------------------------------------------
for(idx = fb+1; idx <= (fb+iFR.NL); idx++){

//----------------------------------------------
if(iFR.Pr == iFR.PR_HL){
h = iHigh(NULL, 0, idx);
}
if(iFR.Pr == iFR.PR_C){
h = MathMax(iClose(NULL, 0, idx),iOpen(NULL, 0, idx));
}

//----------------------------------------------
if(h >= fbH){
f = false;
}
}

//--------------------------------------------------
return(f);

}
[/code]
Редактировалось: 2 раз (Последний: 10 июля 2013 в 13:07)
МедальКубок
Сообщений: 536

iFR.IsDwMode1


Определение нижнего фрактала в классическом описании

int fb - индекс бара для которого определяется фрактал.

[code=php]
bool iFR.IsDwMode1(int fb = 1){
/*
>Ver : 0.0.3
>Date : 2013.01.18
>Hist :
@0.0.3@2013.01.18@artamir [+] Добавлен тип цены: Закрытие
@0.0.2@2013.01.11@artamir []
@0.0.1@2013.01.10@artamir []
>Author : Morochin Artiom
>Desc : Определение нижнего фрактала в классическом описании.
*/
//--------------------------------------------------
bool f = true;
double l = 0;
double fbL = 0;

//--------------------------------------------------
int idx = 0;

//--------------------------------------------------
if(fb <= iFR.NR){
return(false); //нехватает количества баров справа для определения фрактала.
}

//--------------------------------------------------
if(iFR.Pr == iFR.PR_HL){
fbL = iLow(NULL, 0, fb); //Лоу заданного бара.
}
if(iFR.Pr == iFR.PR_C){
fbL = iClose(NULL, 0, fb); //Закрытие заданного бара.
}

//--------------------------------------------------
for(idx = fb-1; idx >= (fb-iFR.NR); idx--){

//----------------------------------------------
if(iFR.Pr == iFR.PR_HL){
l = iLow(NULL, 0, idx);
}
if(iFR.Pr == iFR.PR_C){
l = MathMin(iClose(NULL, 0, idx),iOpen(NULL, 0, idx));
}


//----------------------------------------------
if(l < fbL){
f = false; // Не прошли условие, что заданный бар самый высокий слева на право
}
}

//----------------------------------------------
if(!f){
return(false);
}

//----------------------------------------------
for(idx = fb+1; idx <= (fb+iFR.NL); idx++){

//----------------------------------------------
if(iFR.Pr == iFR.PR_HL){
l = iLow(NULL, 0, idx);
}
if(iFR.Pr == iFR.PR_C){
l = MathMin(iClose(NULL, 0, idx),iOpen(NULL, 0, idx));
}

//----------------------------------------------
if(l <= fbL){
f = false;
}
}

//--------------------------------------------------
return(f);

}
[/code]
МедальКубок
Сообщений: 536

iFR.IsUpMode2


Проверяет, если бар с индексом fb является верхним фракталом
Бар считается верхним фракталом, максимум бара является самым высоким максимумом слева и справа на заданное кол. баров. А так же если слева максимумы баров последовательно возрастают, а справа - убывают

[code=php]
bool iFR.IsUpMode2(int fb = 1){
/*
>Ver : 0.0.3
>Date : 2013.01.18
>Hist :
@0.0.3@2013.01.18@artamir [+] Добавлен тип цены: Закрытие
@0.0.2@2013.01.11@artamir []
@0.0.1@2012.11.13@artamir []
>Author : Morochin Artiom
>Desc : Проверяет, если бар с индексом fb является верхним фракталом
Бар считается верхним фракталом, максимум бара является самым высоким максимумом
слева и справа на заданное кол. баров. А так же если слева максимумы баров последовательно возрастают, а справа - убывают
*/

bool f = true;

int i = -1;

//-------------------------------------------------
if(fb < iFR.NR){
return(false);
}

//--------------------------------------------------
for(i = fb; i > fb - iFR.NR; i--){

//----------------------------------------------
if(iFR.Pr == iFR.PR_HL){
if(iHigh(NULL, 0, i) < iHigh(NULL, 0, i-1)){
f = false;
}
}
if(iFR.Pr == iFR.PR_C){
if(iClose(NULL, 0, i) < MathMax(iClose(NULL, 0, i-1),iOpen(NULL, 0, i-1))){
f = false;
}
}
}

if(!f){
return(false);
}

//--------------------------------------------------
if(f){
for(i = fb; i < fb + iFR.NL; i++){
if(iFR.Pr == iFR.PR_HL){
if(iHigh(NULL, 0, i) < iHigh(NULL, 0, i+1)){
f = false;
}
}
if(iFR.Pr == iFR.PR_C){
if(iClose(NULL, 0, i) < MathMax(iClose(NULL, 0, i+1),iOpen(NULL, 0, i+1))){
f = false;
}
}
}
}

return(f);
}
[/code]
В начало страницы 
|
Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.

← Назад