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

ansol

Местный знаток
Ну когда нужно идти, можно и костыли поюзать :laugh: еще скажи что 5хх билды лучше

Не лучше, хотя :facepalm:
Костыль работает так: ставим сову на любой другой график, а вместо Period() или _Period указываем период ренко-графика, тогда все индюки и уровни берутся по этому графику и все работает.
Но раньше работало прямо на этом графике, вот и интересно мне, в чем заключается "эмуляция онлайн графика".
Вот этот кусок, видимо влияет:
PHP:
void UpdateChartWindow() {
    static int hwnd = 0;

     if(hwnd == 0) {
        hwnd = WindowHandle(SymbName, RenkoTimeFrame);
        if(hwnd != 0) Print("Chart window detected");
    }
 
    if(EmulateOnLineChart && MT4InternalMsg == 0) 
        MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
 
    if(hwnd != 0) if(PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) == 0) hwnd = 0;
    if(hwnd != 0 && MT4InternalMsg != 0) PostMessageA(hwnd, MT4InternalMsg, 2, 1);
 
    return;
}
 

Bob5

Новичок форума
Немнного переделал условие:
условие проверяется каждые раз в 7 минут (фрейм м15), с открытием первого начального бара (Старт),
и идет дальше, не смотря на следующие бары. Вот так - 00. 07. 14. 21. 28. 35. дальше ошибка - 43.
И так ошибка через каждые 6-7проверок. В чем может быть ошибка ?

Условие обрабатывается в Start().
Может неправильно определил открытие нового бара ?

extern int T_m= 7; // ЧЕРЕЗ СКОЛЬКО МИНУТ ПРОВЕРКА


static datetime b ;

if (TimeCurrent()== Time[0] ) b++;
if ( TimeCurrent()>= b+T_m*60 )
{
b=TimeCurrent();
Open_BUY(); // ДЛЯ ПРОВЕРКИ В ТЕСТЕРЕ, ПО ВРЕМЕНИ ОТКРЫТИЯ
}
 

Ugar

Гуру форума
Немнного переделал условие:
условие проверяется каждые раз в 7 минут (фрейм м15), с открытием первого начального бара (Старт),
и идет дальше, не смотря на следующие бары. Вот так - 00. 07. 14. 21. 28. 35. дальше ошибка - 43.
И так ошибка через каждые 6-7проверок. В чем может быть ошибка ?

Условие обрабатывается в Start().
Может неправильно определил открытие нового бара ?

extern int T_m= 7; // ЧЕРЕЗ СКОЛЬКО МИНУТ ПРОВЕРКА


static datetime b ;

if (TimeCurrent()== Time[0] ) b++;
if ( TimeCurrent()>= b+T_m*60 )
{
b=TimeCurrent();
Open_BUY(); // ДЛЯ ПРОВЕРКИ В ТЕСТЕРЕ, ПО ВРЕМЕНИ ОТКРЫТИЯ
}
Я так и не понял зачем это:
if (TimeCurrent()== Time[0] ) b++;

Попробуй так:
static datetime b, LastTime ;
//Новый бар
if(LastTime==0)LastTime= Time[0];
if (LastTime!= Time[0] ) b=Time[0];
LastTime= Time[0];
//Прошло время от открытия бара или прошлого события
if ( TimeCurrent()>= b+T_m*60 )
{
b=TimeCurrent();
Open_BUY(); // ДЛЯ ПРОВЕРКИ В ТЕСТЕРЕ, ПО ВРЕМЕНИ ОТКРЫТИЯ
}[/QUOTE]
Я так и не понял зачем это:
if (TimeCurrent()== Time[0] ) b++;
 
  • Like
Реакции: Bob5

matro3

Почетный гражданин
Толкните в нужном направлении:
нужно посчитать профит сетки ордеров (в одну сторону) в пунктах (все это сделано) с учетом лота (вот тут затуп у меня)
 

matro3

Почетный гражданин
Похоже глупость сморозил.
Решил что тралить сетку буду после профита всех ордеров в валюте.
Как привести к единым пунктам все ордера не придумал.
 

Bob5

Новичок форума
Не могу добиться точного отсчета от конкретного события.
По условию - если текущее время - поймало время
открытие первого бара (фрейм 15м)- обозначим это Стартом.
От старта начинаем каждые 7 минут проверять условие (открываю Buy).
15 сделок идет точно, открытие каждые 7минут от Старта.
Потом ошибка +2 минуты к 7. И так постоянно.
Пока немогу придумать лучше этого, но и здесь недочеты. Если можно, подскажите -
как правильно написать код !!!

static datetime b ;
bool sobitie=false;
if (TimeCurrent()== Time[0] ) sobitie=true; // ЗАФИКСИРОВАЛИ СОБЫТИЕ, ОТ НЕГО НАЧИНАЕМ ОТСЧЕТ
if ( TimeCurrent()>= b+T_m*60 )
{
b=TimeCurrent();
Open_BUY(); // ДЛЯ ПРОВЕРКИ В ТЕСТЕРЕ ПО ВРЕМЕНИ ОТКРЫТИЯ
}
if (Number_of_Orders_Buy()==0) sobitie = false; // ЕСЛИ НЕТ СДЕЛОК - СОБЫТИЕ СБРАСЫВАЕТСЯ
 

matro3

Почетный гражданин
PHP:
static datetime b;

b = TimeCurrent();

if ( TimeCurrent()>= b+7*60 )
{
b=TimeCurrent(); 
Alert(b); // ДЛЯ ПРОВЕРКИ В ТЕСТЕРЕ ПО ВРЕМЕНИ ОТКРЫТИЯ
}
Этот код работает исправно.
Видимо где-то меняете T_m
 

Ugar

Гуру форума
Не могу добиться точного отсчета от конкретного события.
По условию - если текущее время - поймало время
открытие первого бара (фрейм 15м)- обозначим это Стартом.
От старта начинаем каждые 7 минут проверять условие (открываю Buy).
15 сделок идет точно, открытие каждые 7минут от Старта.
Потом ошибка +2 минуты к 7. И так постоянно.
Пока немогу придумать лучше этого, но и здесь недочеты. Если можно, подскажите -
как правильно написать код !!!

static datetime b ;
bool sobitie=false;
if (TimeCurrent()== Time[0] ) sobitie=true; // ЗАФИКСИРОВАЛИ СОБЫТИЕ, ОТ НЕГО НАЧИНАЕМ ОТСЧЕТ
if ( TimeCurrent()>= b+T_m*60 )
{
b=TimeCurrent();
Open_BUY(); // ДЛЯ ПРОВЕРКИ В ТЕСТЕРЕ ПО ВРЕМЕНИ ОТКРЫТИЯ
}
if (Number_of_Orders_Buy()==0) sobitie = false; // ЕСЛИ НЕТ СДЕЛОК - СОБЫТИЕ СБРАСЫВАЕТСЯ
Это наипростейший вариант решения задачи. Есть у него и недостатки.
Главный, это постепенное отставание. Оно происходит из за того что тики могут идти не каждую секунду. На 4 значных котировках они могут быть совсем редкими, что приведёт к большему отставанию.
Например, ровно через 7 минут не было тика, а пришёл через 7 минут 10 секунд. Вот опоздание на 10 секунд. Дальше время отсчитывается от этого опоздавшего события, и то же может быть с опозданием...
 

ansol

Местный знаток
Это наипростейший вариант решения задачи. Есть у него и недостатки.
Главный, это постепенное отставание. Оно происходит из за того что тики могут идти не каждую секунду. На 4 значных котировках они могут быть совсем редкими, что приведёт к большему отставанию.
Например, ровно через 7 минут не было тика, а пришёл через 7 минут 10 секунд. Вот опоздание на 10 секунд. Дальше время отсчитывается от этого опоздавшего события, и то же может быть с опозданием...

Мне вообще непонятно как на "if (TimeCurrent()== Time[0] )" можно рассчитывать? Даже если тик придет на второй секунде, это условие не выполнится вообще до следующей свечи.
 
  • Like
Реакции: Ugar

Ugar

Гуру форума
Мне вообще непонятно как на "if (TimeCurrent()== Time[0] )" можно рассчитывать? Даже если тик придет на второй секунде, это условие не выполнится вообще до следующей свечи.
Здесь это я проглядел. Когда первый раз он это написал я поправил, а он опять за своё...
 

AlexeyVik

Программист mql4 mql5
Это наипростейший вариант решения задачи. Есть у него и недостатки.
Главный, это постепенное отставание. Оно происходит из за того что тики могут идти не каждую секунду. На 4 значных котировках они могут быть совсем редкими, что приведёт к большему отставанию.
Например, ровно через 7 минут не было тика, а пришёл через 7 минут 10 секунд. Вот опоздание на 10 секунд. Дальше время отсчитывается от этого опоздавшего события, и то же может быть с опозданием...
Ты не прав, Андрей. Достаточно преобразовать в строку с точностью до минут и обратно в datetime.
Код:
StringToTime(TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES))
и от этого времени считать.
 

Ugar

Гуру форума
Ты не прав, Андрей. Достаточно преобразовать в строку с точностью до минут и обратно в datetime.
Код:
StringToTime(TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES))
и от этого времени считать.
Нет, это ты не прав. Я писал о конкретно том варианте, без преобразований.
А если уж считать по минутам, то и преобразовывать не надо. Есть же Minute(), тогда вообще в datetime лезть не стоит.
А вообще, почти любую задачу можно решить несколькими способами. Вопрос встаёт о оптимальности и целесообразности какого то конкретного варианта исполнения.
 

AlexeyVik

Программист mql4 mql5
Нет, это ты не прав. Я писал о конкретно том варианте, без преобразований.
А если уж считать по минутам, то и преобразовывать не надо. Есть же Minute(), тогда вообще в datetime лезть не стоит.
А вообще, почти любую задачу можно решить несколькими способами. Вопрос встаёт о оптимальности и целесообразности какого то конкретного варианта исполнения.
Minute() есть, да возвращает количество минут без часа и остального.
Ладно, не пыхти. Я знаю что ты смог-бы сделать при необходимости. А по чужому коду "на коленке" давать советы... и сам частенько советую с ошибками.
 
  • Like
Реакции: Ugar

Bob5

Новичок форума
Я понимаю что для Вас, вариантов много - дайте хоть один пример, ибо для меня это пока трудновато
 

AlexeyVik

Программист mql4 mql5
Я понимаю что для Вас, вариантов много - дайте хоть один пример, ибо для меня это пока трудновато
А ты сделай выводы из наших пререканий и всё узнаешь.
Например, моё замечание Андрею, перевести из секунд в минуты... вариант...
Ответ Андрея... тоже вариант при условии что это может быть только в текущем часе.
Ну а в остальном... Программист не тот кто умеет складывать программу из чужих блоков как домик из кубиков, а тот кто может что-то понять как работает.
А в общем, я как всегда вечером пьян и внятно объяснить что либо не могу. звиняйте...
 

Bob5

Новичок форума
Вот что получилось, в тестере идет без ошибок.
Если что не так - просьба подправить !!!


static datetime b, LastTime ;

if(LastTime==0)LastTime= Time[0];
if (LastTime!= Time[0] ) LastTime= Time[0];
if (TimeCurrent()>= b+T_m*60 )
{
b=StringToTime(TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Open_BUY();
}
 

AlexeyVik

Программист mql4 mql5
Вот что получилось, в тестере идет без ошибок.
Если что не так - просьба подправить !!!


static datetime b, LastTime ;

if(LastTime==0)LastTime= Time[0];
if (LastTime!= Time[0] ) LastTime= Time[0];

if (TimeCurrent()>= b+T_m*60 )
{
b=StringToTime(TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Open_BUY();
}
А какая роль у тех двух строк которые я выделил?
 

Ugar

Гуру форума
А какая роль у тех двух строк которые я выделил?
Ему надо было всегда отмерять время от открытия бара.
Я привёл пример, но Bob5 его изменил, как всегда не разобрав что и зачем в нём.
А в таком виде этот кусок не имеет никакого отношения к остальному, по сути бесполезные операции.
 

AlexeyVik

Программист mql4 mql5
Ему надо было всегда отмерять время от открытия бара.
Я привёл пример, но Bob5 его изменил, как всегда не разобрав что и зачем в нём.
А в таком виде этот кусок не имеет никакого отношения к остальному, по сути бесполезные операции.
Да я не сомневался никогда в твоей компетентности.
Потому и спросил, что бесполезные операции. И говорил о том кого можно считать программистом хотя-бы начинающим.
Но если надо открываться через 7 минут от открытия бара, то надо вместо TimeCurrent() ставить LastTime (это "тонкий" намёк для Bob5)
 
  • Like
Реакции: Bob5
Верх