Ответить
01.03.2015, 13:37
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,950 раз(а) / Репутация: 2027
а если вместо [0] будет [1]...[2]...[3]... и т.д.

это уже последующие бары, верно?
Да, но в данном примере не имеет значения.
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
Получается что время открытия бара сравнивается с прошлым запомненным значением. Если время открытия бара изменилось, значит появился новый бар.
Кстати, чтобы этот блок работал, переменная prevtime не должна обнуляться по тикам. Для этого она должна быть статической или объявлена на глобальном уровне.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
01.03.2015, 15:45
Аватар для vladradon
vladradon vladradon вне форума Активный участник
Регистрация: 12.02.2015 / Сообщений: 168
Поблагодарили 65 раз(а) / Репутация: 64
а если вместо [0] будет [1]...[2]...[3]... и т.д.

это уже последующие бары, верно?
Это предыдущие времена будут открытия баров - отсчет идет в обратном направлении: 0 - текущий, 1 - предыдущий и т.д.
01.03.2015, 16:21
Аватар для vladradon
vladradon vladradon вне форума Активный участник
Регистрация: 12.02.2015 / Сообщений: 168
Поблагодарили 65 раз(а) / Репутация: 64
Да, но в данном примере не имеет значения.
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
Получается что время открытия бара сравнивается с прошлым запомненным значением. Если время открытия бара изменилось, значит появился новый бар.
Кстати, чтобы этот блок работал, переменная prevtime не должна обнуляться по тикам. Для этого она должна быть статической или объявлена на глобальном уровне.
Не уверен, что статическая в этом случае будет правильно работать, но прописать переменную в глобалках сова - однозначно нужно. Здесть можно эту функцию сделать не отрубающей, а вызываемой:

if(orders_modifi && Orders_modifi()) {... - дальнейшее выполнение всего, что в кривых скобках при включенной функции определения открытия нового бара -...}

А сама функция вне функции Старт:

bool Orders_modifi()
{
if (prevtime<=0) {prevtime==Time[0]; return(false);}
if (Time[0] == prevtime) return(false);
else
{prevtime = Time[0]; return (true);}
}

Последний раз редактировалось vladradon; 01.03.2015 в 16:27.
01.03.2015, 16:41
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,950 раз(а) / Репутация: 2027
Не уверен, что статическая в этом случае будет правильно работать
А я уверен.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
02.03.2015, 07:26
Аватар для Игoрь
Игoрь Игoрь на форуме Новичок форума
Регистрация: 05.08.2012 / Сообщений: 46
Поблагодарили 6 раз(а) / Репутация: 7
подскажите, как описывается условие если цена изменилась на n пунктов за t секунд
02.03.2015, 07:38
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Как-то так

Скрытый текст

Код:
datetime time_ctrl, time_current;
ushort   price_ctrl, price_current;

if(time_current > time_ctrl + t)
   if(MathAbs(price_current - price_ctrl) / _Point > n)
[свернуть]

Последний раз редактировалось matro3; 02.03.2015 в 07:41.
02.03.2015, 08:14
Аватар для sstyle
sstyle sstyle вне форума Активный участник
Регистрация: 06.01.2015 / Сообщений: 59
Поблагодарили 35 раз(а) / Репутация: 36
Подскажите пожалуйста, можно ли как-то сову заставить выводить на график цены индюк который подключен через iCustom? Ну как пример канал ТМА. получаю его значения через iCustom, но еще хочу чтобы сова его показывала. (кинуть отдельно индюк на график не подходит)
02.03.2015, 08:27
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
ChartIndicatorAdd - только в MQL5
02.03.2015, 12:25
Аватар для 1_Pilot
1_Pilot 1_Pilot вне форума Новичок форума
Регистрация: 22.09.2013 / Сообщений: 13
Поблагодарили 5 раз(а) / Репутация: 6
Доброго здравия!
Нажмите на изображение для увеличения
Название: 111.png
Просмотров: 6
Размер:	6.6 Кб
ID:	197929
можно ли программно использовать данное значение объема лота?
Если можно то как?
02.03.2015, 12:27
Аватар для Игoрь
Игoрь Игoрь на форуме Новичок форума
Регистрация: 05.08.2012 / Сообщений: 46
Поблагодарили 6 раз(а) / Репутация: 7
Как-то так

Скрытый текст

Код:
datetime time_ctrl, time_current;
ushort   price_ctrl, price_current;

if(time_current > time_ctrl + t)
   if(MathAbs(price_current - price_ctrl) / _Point > n)
[свернуть]
спасибо за ответ! а какая функция возвращает цену n секунд назад
02.03.2015, 12:37
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
спасибо за ответ! а какая функция возвращает цену n секунд назад
_http://docs.mql4.com/ru/dateandtime/timeseconds
02.03.2015, 16:40
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
_http://docs.mql4.com/ru/dateandtime/timeseconds
Ты что-то не так понял в вопросе.
Правильный ответ - никакая.
02.03.2015, 17:19
Аватар для Игoрь
Игoрь Игoрь на форуме Новичок форума
Регистрация: 05.08.2012 / Сообщений: 46
Поблагодарили 6 раз(а) / Репутация: 7
Ты что-то не так понял в вопросе.
Правильный ответ - никакая.
тогда другой вопрос. Как реализовать в коде условие если цена за 10с выросла на 50п
02.03.2015, 18:20
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
тогда другой вопрос. Как реализовать в коде условие если цена за 10с выросла на 50п
Да вариантов-то несколько. Зависит как ты хочешь считать 10 секунд.
Допустим 00 сек. минуты сравнивать с 10 сек. минуты, затем сравнивать 10 сек с 20 сек и т.д.
Или 00 с 10, потом 01 с 11, 02 с 12 и т.д.
Первый вариант можно обойтись переменной глобального уровня и если не выполнено условие значение этой переменной переписывается и сравнивается через следующие 10 сек.
Во втором варианте наверное лучше через массив. Сравнивая значение в массиве [0] и [9] и копировать массив со сдвигом значений и записывая в последний индекс новое значение. И так каждую секунду.

А в общем-то если я правильно угадал, то эта затея не стоит внимания. Я это писал, с первым вариантом, ещё лет пять назад. прибыль есть, но не та о какой можно мечтать. Да и убытки есть не малые. Скачок есть, ордер открыли и откат...

Последний раз редактировалось AlexeyVik; 02.03.2015 в 18:23.
02.03.2015, 20:26
Аватар для Игoрь
Игoрь Игoрь на форуме Новичок форума
Регистрация: 05.08.2012 / Сообщений: 46
Поблагодарили 6 раз(а) / Репутация: 7
второй вариант по-интересней. скачок есть - поставили сеть...
03.03.2015, 10:37
Аватар для vladradon
vladradon vladradon вне форума Активный участник
Регистрация: 12.02.2015 / Сообщений: 168
Поблагодарили 65 раз(а) / Репутация: 64
Да вариантов-то несколько. Зависит как ты хочешь считать 10 секунд.
Допустим 00 сек. минуты сравнивать с 10 сек. минуты, затем сравнивать 10 сек с 20 сек и т.д.
Или 00 с 10, потом 01 с 11, 02 с 12 и т.д.
Первый вариант можно обойтись переменной глобального уровня и если не выполнено условие значение этой переменной переписывается и сравнивается через следующие 10 сек.
Во втором варианте наверное лучше через массив. Сравнивая значение в массиве [0] и [9] и копировать массив со сдвигом значений и записывая в последний индекс новое значение. И так каждую секунду.

А в общем-то если я правильно угадал, то эта затея не стоит внимания. Я это писал, с первым вариантом, ещё лет пять назад. прибыль есть, но не та о какой можно мечтать. Да и убытки есть не малые. Скачок есть, ордер открыли и откат...
Полностью согласен и помимо ежесекундного считывания и перезаписи данных в массиве, нужно еще учитывать текущий плавающий спред, который может полностью свести на нет вход по такой стратегии, учитывая такой малый (в несколько секунд) шаг для анализа разницы цен. Это уже скальперный режим, для которого нужно еще кучу высокоскоростных проверок делать. А для торговли с учетом ТФ графика и каких-то доп инкикаторов - бесперспективняк.))
Я уж не говорю о том, что массивы для аварийного перезапуска сова, нужно хранить либо в файле, либо в глобалках терминала - это тоже приличная нагрузка на терминал и объем кода для скальпера.
Можно просто воткнуть функцию считывания текущего значения времени, зафиксировать ее в переменной, и сравнивать ее периодически по каждому тику с текущим значением графика. И если цена в нужном направлении выскочила за заданное количество пунктов, то уже давать команды на открытие, а если превышено время шага для определения новой цены отсчета и перезапуска таймера, то перезаписываем новое значение таймера (текущего времени) и цены графика на этот момент (тоже отдельная переменная). Т.е. фактически укладываемся в несколько строк кода без всяких наворотов. Этот вариант довольно простой, но будет зависеть от тиков графика и это особо не проблема. Я просто уже писал, что работа по таймеру сова на 5-ке у меня все равно зависит от тиков, а на 4-ке я пока не пробовал - не было необходимости.

Последний раз редактировалось vladradon; 03.03.2015 в 10:55.
03.03.2015, 11:02
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Полностью согласен и помимо ежесекундного считывания и перезаписи данных в массиве, нужно еще учитывать текущий плавающий спред, который может полностью свести на нет вход по такой стратегии, учитывая такой малый (в несколько секунд) шаг для анализа разницы цен. Это уже скальперный режим, для которого нужно еще кучу высокоскоростных проверок делать. А для торговли с учетом ТФ графика и каких-то доп инкикаторов - бесперспективняк.))
Я уж не говорю о том, что массивы для аварийного перезапуска сова, нужно хранить либо в файле, либо в глобалках терминала - это тоже приличная нагрузка на терминал и объем кода для скальпера.
Можно просто воткнуть функцию считывания текущего значения времени, зафиксировать ее в переменной, и сравнивать ее периодически по каждому тику с текущим значением графика. И если цена в нужном направлении выскочила за заданное количество пунктов, то уже давать команды на открытие, а если превышено время шага для определения новой цены отсчета и перезапуска таймера, то перезаписываем новое значение таймера (текущего времени) и цены графика на этот момент (тоже отдельная переменная). Т.е. фактически укладываемся в несколько строк кода без всяких наворотов. Этот вариант довольно простой, но будет зависеть от тиков графика и это особо не проблема. Я просто уже писал, что работа по таймеру сова на 5-ке у меня все равно зависит от тиков, а на 4-ке я пока не пробовал - не было необходимости.
Да брось. Зачем хранить эти данные на случай перезапуска? Ведь они будут уже устаревшими и только испортят всё. Ведь ничего не мешает при запуске сделать задержку на заданное количество секунд для заполнения массива, чтобы уже можно было анализировать.
03.03.2015, 11:13
Аватар для vladradon
vladradon vladradon вне форума Активный участник
Регистрация: 12.02.2015 / Сообщений: 168
Поблагодарили 65 раз(а) / Репутация: 64
Да брось. Зачем хранить эти данные на случай перезапуска? Ведь они будут уже устаревшими и только испортят всё. Ведь ничего не мешает при запуске сделать задержку на заданное количество секунд для заполнения массива, чтобы уже можно было анализировать.
Я сейчас чиркану функцию без хранения, но с заданным шагом обновления, как описал - проверишь и скажешь что не так.))
03.03.2015, 16:33
Аватар для vladradon
vladradon vladradon вне форума Активный участник
Регистрация: 12.02.2015 / Сообщений: 168
Поблагодарили 65 раз(а) / Репутация: 64
подскажите, как описывается условие если цена изменилась на n пунктов за t секунд
Прописываем переменные в глобальных сова:

exturn double Volume; //Уровень скачка цены в любом направлении в пунктах
exturn int StepTime; //Шаг в секундах, в течении которого будет производится отскок от последнего уровня цены

datetime Time0=0, Time1=0; // Промежуточные переменные для функции
double StartLevel;

int TimeSpread() //Начало функции
{
if (Time0==0) {Time0=TimeCurrent(); return (0);}
if (Time0==TimeCurrent()) {StartLevel= Bid; Time1==TimeCurrent(); return (0);}
if (TimeCurrent()>Time0+StepTime) {Time0=TimeCurrent(); StartLevel= Bid; return (0);}
if (Time0!=0 && Time1!=0 && Time1-Time0<StepTime && Bid>StartLevel+Volume) return (1); //Возвращает 1, если за указанный StepTime цена выросла на Volume
if (Time0!=0 && Time1!=0 && Time1-Time0<StepTime && Bid<StartLevel
-Volume) return (2); //Возвращает 2, если за указанный StepTime цена упала на Volume
return(0);
}
Заранее извиняюсь, если где-то опечатался - в терминале не проверял и весь код печатал сразу в ответе здесь на форуме.
Ну и соответственно: если запрос на функцию возвращает 1, то это типа сигнал на бай, 2 - на селл:
if (TimeSpread()==1)... -команды на на бай или разрешение открытия на бай - короче по стратегии дальше, а
if (TimeSpread()==2)... -соответственно противоположный сигнал.
Надеюсь, что поможет.)))

Последний раз редактировалось vladradon; 03.03.2015 в 16:45.
03.03.2015, 18:02
Аватар для vladradon
vladradon vladradon вне форума Активный участник
Регистрация: 12.02.2015 / Сообщений: 168
Поблагодарили 65 раз(а) / Репутация: 64
Прописываем переменные в глобальных сова:

exturn double Volume; //Уровень скачка цены в любом направлении в пунктах
exturn int StepTime; //Шаг в секундах, в течении которого будет производится отскок от последнего уровня цены

datetime Time0=0, Time1=0; // Промежуточные переменные для функции
double StartLevel;

int TimeSpread() //Начало функции
{
if (Time0==0) {Time0=TimeCurrent(); return (0);}
if (Time0==TimeCurrent()) {StartLevel= Bid; Time1==TimeCurrent(); return (0);}
if (TimeCurrent()>Time0+StepTime) {Time0=TimeCurrent(); StartLevel= Bid; return (0);}
if (Time0!=0 && Time1!=0 && Time1-Time0<StepTime && Bid>StartLevel+Volume) return (1); //Возвращает 1, если за указанный StepTime цена выросла на Volume
if (Time0!=0 && Time1!=0 && Time1-Time0<StepTime && Bid<StartLevel
-Volume) return (2); //Возвращает 2, если за указанный StepTime цена упала на Volume
return(0);
}
Заранее извиняюсь, если где-то опечатался - в терминале не проверял и весь код печатал сразу в ответе здесь на форуме.
Ну и соответственно: если запрос на функцию возвращает 1, то это типа сигнал на бай, 2 - на селл:
if (TimeSpread()==1)... -команды на на бай или разрешение открытия на бай - короче по стратегии дальше, а
if (TimeSpread()==2)... -соответственно противоположный сигнал.
Надеюсь, что поможет.)))
Нашел свою же ошибку:

exturn int Volume; //Уровень скачка цены в любом направлении в пунктах

int TimeSpread() //Начало функции
{
if (Time0==0) {Time0=TimeCurrent(); return (0);}
if (Time0==TimeCurrent()) {StartLevel= Bid; Time1==TimeCurrent(); return (0);}
if (TimeCurrent()>Time0+StepTime) {Time0=TimeCurrent(); StartLevel= Bid; return (0);}
if (Time0!=0 && Time1!=0 && Time1-Time0<StepTime && Bid>StartLevel+Volume*_Point) return (1); //Возвращает 1, если за указанный StepTime цена выросла на Volume
if (Time0!=0 && Time1!=0 && Time1-Time0<StepTime && Bid<StartLevel
-Volume*_Point) return (2); //Возвращает 2, если за указанный StepTime цена упала на Volume
return(0);
}
Только учет спреда я не вводил - его можно отдельно ввести, если таков счет, на котором торгуешь.

Последний раз редактировалось vladradon; 03.03.2015 в 18:13.
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 23:24. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO