Ваши вопросы по языку MQL4

Ugar

Гуру форума
а если вместо [0] будет [1]...[2]...[3]... и т.д.

это уже последующие бары, верно?
Да, но в данном примере не имеет значения.
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
Получается что время открытия бара сравнивается с прошлым запомненным значением. Если время открытия бара изменилось, значит появился новый бар.
Кстати, чтобы этот блок работал, переменная prevtime не должна обнуляться по тикам. Для этого она должна быть статической или объявлена на глобальном уровне.
 

vladradon

Программист
Да, но в данном примере не имеет значения.
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);}
}
 
Последнее редактирование:

Игoрь

Новичок форума
подскажите, как описывается условие если цена изменилась на n пунктов за t секунд
 

matro3

Почетный гражданин
Как-то так
Код:
datetime time_ctrl, time_current;
ushort   price_ctrl, price_current;

if(time_current > time_ctrl + t)
   if(MathAbs(price_current - price_ctrl) / _Point > n)
 
Последнее редактирование:

sstyle

Активный участник
Подскажите пожалуйста, можно ли как-то сову заставить выводить на график цены индюк который подключен через iCustom? Ну как пример канал ТМА. получаю его значения через iCustom, но еще хочу чтобы сова его показывала. (кинуть отдельно индюк на график не подходит)
 

1_Pilot

Новичок форума
Доброго здравия!
111.png
можно ли программно использовать данное значение объема лота?
Если можно то как?
 

AlexeyVik

Программист mql4 mql5
тогда другой вопрос. Как реализовать в коде условие если цена за 10с выросла на 50п
Да вариантов-то несколько. Зависит как ты хочешь считать 10 секунд.
Допустим 00 сек. минуты сравнивать с 10 сек. минуты, затем сравнивать 10 сек с 20 сек и т.д.
Или 00 с 10, потом 01 с 11, 02 с 12 и т.д.
Первый вариант можно обойтись переменной глобального уровня и если не выполнено условие значение этой переменной переписывается и сравнивается через следующие 10 сек.
Во втором варианте наверное лучше через массив. Сравнивая значение в массиве [0] и [9] и копировать массив со сдвигом значений и записывая в последний индекс новое значение. И так каждую секунду.

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

Игoрь

Новичок форума
второй вариант по-интересней. скачок есть - поставили сеть...
 

vladradon

Программист
Да вариантов-то несколько. Зависит как ты хочешь считать 10 секунд.
Допустим 00 сек. минуты сравнивать с 10 сек. минуты, затем сравнивать 10 сек с 20 сек и т.д.
Или 00 с 10, потом 01 с 11, 02 с 12 и т.д.
Первый вариант можно обойтись переменной глобального уровня и если не выполнено условие значение этой переменной переписывается и сравнивается через следующие 10 сек.
Во втором варианте наверное лучше через массив. Сравнивая значение в массиве [0] и [9] и копировать массив со сдвигом значений и записывая в последний индекс новое значение. И так каждую секунду.

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

AlexeyVik

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

vladradon

Программист
Да брось. Зачем хранить эти данные на случай перезапуска? Ведь они будут уже устаревшими и только испортят всё. Ведь ничего не мешает при запуске сделать задержку на заданное количество секунд для заполнения массива, чтобы уже можно было анализировать.

Я сейчас чиркану функцию без хранения, но с заданным шагом обновления, как описал - проверишь и скажешь что не так.))
 

vladradon

Программист
подскажите, как описывается условие если цена изменилась на 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

Программист
Прописываем переменные в глобальных сова:

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);
}
Только учет спреда я не вводил - его можно отдельно ввести, если таков счет, на котором торгуешь.
 
Последнее редактирование:
Верх