Здравствуйте, Уважаемій Игорь! В моей системе используются пресечения трендовых. И в ней имеет значение и время и цена пересечения. Последовательность баров не всегда имеет "непрерывное" время. Выходные, дыры и т.д. Использование в 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 каждого дня, либо что было каждый день в указаный период С и ДО часов:минут:секунд
Впрочем диапазон дней тоже можно забить в рамки с и по...
Возвращает дату первого дня со временем 00:00:00 текущего месяца.
Понадобилась для отфильтровки событий с НАЧАЛА месяца, либо ДО его начала...
// выборка закрытых ордеров с начала месяца:if( DateFirstDayMonday()<OrderCloseTime()){Действия;}// выборка ДО начала месяца (с начала истории счёта):if( DateFirstDayMonday()-1>OrderCloseTime()){Действия;}
DateFirstDayMonday()-1 во втором примере выводит время "последний день предыдущего месяца со временем 23:59:59"
Чайнег не чайнег, но уж взялся за гуж, так доведи до конца. Так и просится вынести разрешенное время работы, время закрытия в отдельные булевские функции типа:
bool TradeTime(Время начала торговли, Время окончания торговли)
Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!
Чайнег не чайнег, но уж взялся за гуж, так доведи до конца. Так и просится вынести разрешенное время работы, время закрытия в отдельные булевские функции типа:
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);}
Здравствуйте, Уважаемій Игорь! В моей системе используются пресечения трендовых. И в ней имеет значение и время и цена пересечения.
Последовательность баров не всегда имеет "непрерывное" время. Выходные, дыры и т.д.
Использование в 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.
Обратите внимание что "срок действия" в этих вариантах распространяется до конца часа и 59 секунд числа минут.
т.е. указаное время окончания события 23:59 на самом деле имеет время 23:59:59
А до конца часа потому что в минутах используется оператор сравнения ">=", что впрочем не проблема и можно указать "==",
однако протирание времени до 59 секунд сохранится в любом случае...
Вариант №2.
Более точный с точки зрения выставления условий...
Время задаётся путём указания в передаваемых параметров в функцию, например 21:15:23 как (21,15,23).
Понятно что некузяво, но вполне рабочий код...
ЗЫ: закоментареная проверка на валидность вводимых параметров неслучайна.
Ибо если ввести неверное, то сносит крышу. Других способов пока не нашел и закоментил.
Поэтому буду весьма признателен способу как решить эту проблему...
Вариант №3.
Как оказалось самый простой и точный...
Вся фишка простоты видимо состоит в особенности преобразования функцией StrToTime() переданых ей параметров.
Например если ввести только время "ЧЧ:ММ:СС" то на выходе будет время каждого текущего дня...
Кстати...
Комбинируя выборку по часам с днями можно делать фильтрацию по типу:
- что было в 18:00 каждого дня, либо что было каждый день в указаный период С и ДО часов:минут:секунд
Впрочем диапазон дней тоже можно забить в рамки с и по...
2. Функция DateFirstDayMonday()
(по потивам DateOfMonday() )
Возвращает дату первого дня со временем 00:00:00 текущего месяца.
Понадобилась для отфильтровки событий с НАЧАЛА месяца, либо ДО его начала...
DateFirstDayMonday()-1 во втором примере выводит время "последний день предыдущего месяца со временем 23:59:59"
...
Заранее прошу не пинать, ибо чайнеГ.
:)))
Заранее прошу не пинать, ибо чайнеГ. :)))
Чайнег не чайнег, но уж взялся за гуж, так доведи до конца. Так и просится вынести разрешенное время работы, время закрытия в отдельные булевские функции типа:
bool TradeTime(Время начала торговли, Время окончания торговли)
Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!
Чайнег не чайнег, но уж взялся за гуж, так доведи до конца. Так и просится вынести разрешенное время работы, время закрытия в отдельные булевские функции типа:
bool TradeTime(Время начала торговли, Время окончания торговли)
Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!
Ну дык уже... ;)
Для одного банка делаю вариант с двумя сразу таймингами:
- закрытие всех ордеров и позиций перед ролловером в 22:00
- торговая пауза с начала ролловера в 22:00 до конца дня 23:59
(сырая версия без дополнительных проверок)
..(сырая версия без дополнительных проверок)
У Vinin'а были отдельные функции для работы по времени, очень детальные и отработанные. Посмотри в советниках на его сайте или стукнись к нему.
У Vinin'а были отдельные функции для работы по времени, очень детальные и отработанные. Посмотри в советниках на его сайте или стукнись к нему.
Спасибо, но нет в этом пока необходимости...
Просто времени сейчас немного уделяю для этого советника,
а так что там писать впринципе есть и понятно как писать тоже...
*
Дабы не захламлять эту тему, основной текст выложу на форуме банка.
В своё время ессно... ;)
bool TradeTime(Время начала торговли, Время окончания торговли)
Потом очень удобно будет пользоваться, if (TradeTime(..,..)) и работаем!
Надо Игорю Киму заказать такую функцию.
Надо Игорю Киму заказать такую функцию.
Присоединяюсь к просьбе! Оч. полезная и востребованная будет функция. В свете текущих торговых реалий....
Даже можно там два ВРЕМЕННЫХ интервала предусмотреть.