Полезные функции от KimIV - страница 75

 

Здравствуйте, Уважаемій Игорь! В моей системе используются пресечения трендовых. И в ней имеет значение и время и цена пересечения.
Последовательность баров  не всегда имеет "непрерывное" время. Выходные, дыры и т.д.
Использование в CrossPointOfLines  ( в test_CrossPointOfLines.mq4) для рассчета времени в естественном его виде приводит к таким вот результатам:

слева от нулевого бара

(положение трендовых на графиках к системе  не имеет никакого отношения - случайный выбор. Опорные точки трендовой могут

находиться одновременно одна слева нулевого бара, вторая - справа.)


и справа

Расчеты надо вести не в часах, а по ситуации: и в барах и в часах . Единица времени слева - бар.  А для правого края, после нулевого бара, уже приводить к часоврму измерению.

Поиск готовых решений пока ничего не дал. Функция CrossPointOfLines - одна пока на сайте. Для нее необходима идеальная история :(

 

Игорь доброе время суток!

Помогите пожалуйста советом или решением. Пытаюсь чтоб советник при "поглощении" предыдущим баром ПРЕДпредыдущий выдавал сигнал.

1 - если поглощение произошло вверх
2 - если поглощение произошло вниз.

Вроде все до нельзя элементарно, сравниваем цены открытия и закрытия и вуаля...так НЕТ ЖЕ. Сигналы выдает как попало.Хотя при наведении мыши на предыдущие 2 бара явно видно что последний поглощает предпоследний.

Ковырять тему сил нету, да вроде и вариантов то немного но тем не менее не работает никак и все.Очень надеюсь на помощь, да и заранее благодарен


Вот текст:

int start()
{
//----
if (SShort()==1)
Alert("1");
}
if (SLong()==1)
Alert("2");
}
//----
return(0);
}
//+------------------------------------------------------------------+
int SShort()
{int MS=0;
if (Open[1]>Close[2] && Close[1]<Open[2] && Open[1]>Close[1] && Open[2]<Close[2])
MS=1;
return(MS);
}
//+------------------------------------------------------------------+
int SLong()
{
int ML=0;
if(Open[1]<Close[2] && Close[1]>Open[2] && Open[1]<Close[1] && Open[2]>Close[2])
ML=1;
return(ML);
}
//+------------------------------------------------------------------+
 

Набор фильтров по времени: С и ПО

(и не только...)

Однажды спрашивал, что да как, вот результат к чему пришел сам.


1. Запрет либо разрешение выполнения ежедневных действий.


Вариант №1.

// Закрыть все позиции в конце дня в указанное время
if (Hour()==23 && Minute()>=45) 
{ЗакрытьДень();}


// Запретить эксперту торговать С и ПО
if ( (Hour()==22 && Minute()>=00) && (Hour()==23 && Minute()>=59) ) return;

Обратите внимание что "срок действия" в этих вариантах распространяется до конца часа и 59 секунд числа минут.

т.е. указаное время окончания события 23:59 на самом деле имеет время 23:59:59

А до конца часа потому что в минутах используется оператор сравнения ">=", что впрочем не проблема и можно указать "==",

однако протирание времени до 59 секунд сохранится в любом случае...


Вариант №2.

Более точный с точки зрения выставления условий...

// Выборка ОТ и ДО
if(OtTime(2,15,21) < OrderCloseTime() && OrderCloseTime() < DoTime(4,58,33) )
{Действия;}

// Функции преобразования 
datetime OtTime(int h=0, int m=0, int s=0) {datetime ot;
ot=(h*3600)+(m*60)+s+StrToTime(TimeToStr(TimeCurrent(),TIME_DATE));
return (ot);}
//--------------
datetime DoTime(int h=0, int m=0, int s=0) { datetime dt;
//if(h>23||h<0) Alert("Должно быть от 0 до 23"); h=0; 
//if(m>59||m<0) Alert("Должно быть от 0 до 59"); m=0;
dt=(h*3600)+(m*60)+s+StrToTime(TimeToStr(TimeCurrent(),TIME_DATE));
return (dt);}

Время задаётся путём указания в передаваемых параметров в функцию, например 21:15:23 как (21,15,23).

Понятно что некузяво, но вполне рабочий код...

ЗЫ: закоментареная проверка на валидность вводимых параметров неслучайна.

Ибо если ввести неверное, то сносит крышу. Других способов пока не нашел и закоментил.

Поэтому буду весьма признателен способу как решить эту проблему...


Вариант №3.

Как оказалось самый простой и точный...

// Внешние параметры, могут быть экстернами
string ВН="02:15"; // начало события
string ВК="04:58"; // конец события

int start()
{
int m;
datetime vn=StrToTime(ВН);
datetime vk=StrToTime(ВК);
// либо напрямую указывать время по типу:
//  datetime vn=StrToTime("02:15");
//  datetime vk=StrToTime("04:58");

for (int m=0; m < OrdersHistoryTotal() ; m++) 
{
OrderSelect(m, SELECT_BY_POS, MODE_HISTORY);
if( (OrderCloseTime()>vn) && (OrderCloseTime()<vk) )
{Действия;}
}

return()
}

Вся фишка простоты видимо состоит в особенности преобразования функцией StrToTime() переданых ей параметров.

Например если ввести только время "ЧЧ:ММ:СС" то на выходе будет время каждого текущего дня...


Кстати...

// можно написать и так:
if( (OrderCloseTime()>StrToTime(ВН)) && (OrderCloseTime()<StrToTime(ВК)) )
// или даже так:
if( (OrderCloseTime()>StrToTime("02:15")) && (OrderCloseTime()<StrToTime("04:58")) )

Комбинируя выборку по часам с днями можно делать фильтрацию по типу:

- что было в 18:00 каждого дня, либо что было каждый день в указаный период С и ДО часов:минут:секунд

Впрочем диапазон дней тоже можно забить в рамки с и по...


2. Функция DateFirstDayMonday()

(по потивам DateOfMonday() )

datetime DateFirstDayMonday() 
{ 
datetime dfdm;
dfdm=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE))-((Day()-1)*86400);
return (dfdm);
}

Возвращает дату первого дня со временем 00:00:00 текущего месяца.

Понадобилась для отфильтровки событий с НАЧАЛА месяца, либо ДО его начала...

// выборка закрытых ордеров с начала месяца:
if( DateFirstDayMonday() < OrderCloseTime() )
{Действия;}

// выборка ДО начала месяца (с начала истории счёта):
if( DateFirstDayMonday()-1 > OrderCloseTime() )
{Действия;}

DateFirstDayMonday()-1 во втором примере выводит время "последний день предыдущего месяца со временем 23:59:59"


...

Заранее прошу не пинать, ибо чайнеГ.

:)))

 
Игорь помогите пожалуйста присобачить alert к этому индикатору
Файлы:
 
kombat >>:

Заранее прошу не пинать, ибо чайнеГ. :)))

Чайнег не чайнег, но уж взялся за гуж, так доведи до конца. Так и просится вынести разрешенное время работы, время закрытия в отдельные булевские функции типа:

bool TradeTime(Время начала торговли, Время окончания торговли)

Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!

 
granit77 >>:

Чайнег не чайнег, но уж взялся за гуж, так доведи до конца. Так и просится вынести разрешенное время работы, время закрытия в отдельные булевские функции типа:

bool TradeTime(Время начала торговли, Время окончания торговли)

Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!



Ну дык уже... ;)

Для одного банка делаю вариант с двумя сразу таймингами:

- закрытие всех ордеров и позиций перед ролловером в 22:00

- торговая пауза с начала ролловера в 22:00 до конца дня 23:59

(сырая версия без дополнительных проверок)

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
//HHHHH Стартуем... HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
int start() {
//--- Общая проверка --------------------------------------------------------+
if(!IsCondition()) {Print("Низззяяя..."); return;}
//--- Задание неторгового времени (паузы) -----------------------------------+
ObjectDelete("НЕТОРГВРЕМЯ");
if((TimeCurrent()>StrToTime("22:00"))&&(TimeCurrent()<StrToTime("23:59:59"))) 
{NoTradeTime(); return;}
//--- Принудительное закрытие всех ордеров и позиций в конце дня ------------+
if(Hour()==21 && Minute()>=45) { ЗакрытьДень(); return;}
//*метод имеет недостаток: он будет закрывать до конца указаного часа...
//*например время 21:45, закрывать будет до 21:59:59 а с 22:00 прекратит.
//*впринципе это нам не повредит...
//--- Конец условий ---------------------------------------------------------+
// бла-бла-бла...
return(0);
}
 
kombat >>:

..(сырая версия без дополнительных проверок)

У Vinin'а были отдельные функции для работы по времени, очень детальные и отработанные. Посмотри в советниках на его сайте или стукнись к нему.

 
granit77 >>:

У Vinin'а были отдельные функции для работы по времени, очень детальные и отработанные. Посмотри в советниках на его сайте или стукнись к нему.

Спасибо, но нет в этом пока необходимости...

Просто времени сейчас немного уделяю для этого советника,

а так что там писать впринципе есть и понятно как писать тоже...

*

Дабы не захламлять эту тему, основной текст выложу на форуме банка.

В своё время ессно... ;)

 
granit77 >>:

bool TradeTime(Время начала торговли, Время окончания торговли)

Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!

Надо Игорю Киму заказать такую функцию.

 
goldtrader писал(а) >>

Надо Игорю Киму заказать такую функцию.

Присоединяюсь к просьбе! Оч. полезная и востребованная будет функция. В свете текущих торговых реалий....

Даже можно там два ВРЕМЕННЫХ интервала предусмотреть.

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