Сигнал входа в MT4 на основе времени в MetaTrader4

Есть ли у кого-нибудь пример кода для генерации сигнала входа на основе времени суток в Metatrader 4? например в определенный час и минуту каждого дня


person acheo    schedule 22.01.2010    source источник
comment
Есть ли какая-то часть этого, которую вы ищете (например, логика, чтобы сказать, который час, логика, чтобы начать сделку и т. д.)? Или ты все это ищешь?   -  person malonso    schedule 30.01.2010
comment
Просто ищу методику. Я хочу использовать его для открытия сделок в определенное время, если он соответствует дополнительным критериям.   -  person acheo    schedule 30.01.2010


Ответы (2)


Я работал именно над такой функцией. Его нужно много настраивать — я работаю над созданием более общей версии, которая будет настолько большой и утомительной, что ей понадобится собственный include файл. Но это того стоит, чтобы иметь возможность наклеивать его на разные графики без изменения кода. По сути, это будет одно большое заявление о ситуации, которое я уже настроил здесь для каждого отдельного таймфрейма.

Над чем вы работали? Спасибо за интерес к тайм и форекс!

bool existordertime( datetime time, int otype = -37 ) {
    // +---------------------------------------------------------------+
    // | this function is intended for use inside of if() and other conditionals
    // | usually called with TimeCurrent() example:
    // | 
    // | if ( !existordertime( TimeCurrent() ) )
    // | 
    // | it accepts a datetime. A datetime is:
    // | a number of seconds elapsed from 00:00 January 1, 1970
    // | they can be treated as integers as such or accessed with other functions
    // | so that if statements can be commented in and out easily based on what 
    // | timeframe we plan on looking at.
    // | there is an optional parameter for an order type if you need it.
    // | 
    // | KEEP IN MIND if you want to use this to trade something like a 5min 15min
    // | or 4hr your gonna need a lot of if statements like:
    // | 
    // | if (  MathMod( Minute() + 5, 5 ) == 0 )
    // | 
    // +------------------------------------------------------------------+
    for (int cnt = 0; cnt < OrdersTotal(); cnt++) {

        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

        if (OrderType() == otype || -37 == otype)

        // COMMENT OUT THE if()S YOU DON'T NEED HERE: 
        //                       also add new lines as needed
        // if (  MathMod( TimeMinute( time ) +  5,  5 ) == 0 )   //  5min chart
        // if (  MathMod( TimeMinute( time ) + 15, 15 ) == 0 )   // 15min chart
        // if (  MathMod( TimeMinute( time ) + 30, 30 ) == 0 )   // 30min chart
        // if (  MathMod( TimeHour(   time ) +  4,  4 ) == 0 )   // 4hour chart

        int dbOrderOpenTime = OrderOpenTime();                   // re-use SAVEs dbPOOL-access time ...

        if (                      TimeSeconds( time ) == TimeSeconds( dbOrderOpenTime ) )
            if (                  TimeMinute(  time ) == TimeMinute(  dbOrderOpenTime ) )
                if (              TimeHour(    time ) == TimeHour(    dbOrderOpenTime ) )
                    if (          TimeDay(     time ) == TimeDay(     dbOrderOpenTime ) )
                        if (      TimeMonth(   time ) == TimeMonth(   dbOrderOpenTime ) )
                            if (  TimeYear(    time ) == TimeYear(    dbOrderOpenTime ) )
                                return (TRUE);
    }

    for (cnt = 0; cnt < OrdersHistoryTotal(); cnt++) {

        OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);

        if (OrderType() == otype || -37 == otype)
        // COMMENT OUT THE if()S YOU DON'T NEED HERE: 
        //                       also add new lines as needed
        // if (  MathMod( TimeMinute( time ) +  5,  5 ) == 0 )   //  5min chart
        // if (  MathMod( TimeMinute( time ) + 15, 15 ) == 0 )   // 15min chart
        // if (  MathMod( TimeMinute( time ) + 30, 30 ) == 0 )   // 30min chart
        // if (  MathMod( TimeHour(   time ) +  4,  4 ) == 0 )   // 4hour chart

        int dbOrderOpenTime = OrderOpenTime();                   // re-use SAVEs dbPOOL-access time ...

        if (                      TimeSeconds( time ) == TimeSeconds( dbOrderOpenTime ) )
            if (                  TimeMinute(  time ) == TimeMinute(  dbOrderOpenTime ) )
                if (              TimeHour(    time ) == TimeHour(    dbOrderOpenTime ) )
                    if (          TimeDay(     time ) == TimeDay(     dbOrderOpenTime ) )
                        if (      TimeMonth(   time ) == TimeMonth(   dbOrderOpenTime ) )
                            if (  TimeYear(    time ) == TimeYear(    dbOrderOpenTime ) )
                                return (TRUE);
    }

    return (FALSE);
}
person user1088973    schedule 09.12.2011
comment
Ваш код не похож на код. Более того, он не редактируется людьми. Не могли бы вы помочь, сделав отступ на четыре пробела? Это повысит читабельность - person eeerahul; 09.12.2011
comment
@eeerahul да, верно. Сообщество MQL4 имеет очень странную привычку создавать MQL-код ( C-синтаксис ), как если бы им приходилось платить доллар за каждый символ в нем ... Эта привычка IMO неисправима. Последний раз видел что-то подобное это было в эпоху дискет по 360 КБ, когда большие программные модули на основе LISP были буквально урезаны, чтобы оставить только синтаксически необходимые символы, а код тогда выглядел довольно похожим на хэш-код из-за необходимости вписываться в ограниченный емкость носителя FDD. (Дети вряд ли поверят, что некоторые ПК не имеют жестких дисков и загружаются + работают с FDD... ну...) - person user3666197; 14.06.2014
comment
@nbrooks после нескольких ваших правок блока кода, пожалуйста, примите во внимание, что изначально было намерение оставить подход авторов к алгоритмизации нетронутым. Поскольку вы изменяете как форматирование, так и логику, вы можете быть проинформированы о том, что существуют гораздо лучшие алгоритмы для операций на разных таймфреймах с помощью Time[iShift(...)] и других основных элементов, которые выходят за рамки не столь четкого определения вопроса, на который нужно ответить. Кодовый блок ничего не делает в направлении исходного вопроса, а довольно интенсивно перечитывает dbPOOL (не заботясь о результате .Select()) - person user3666197; 14.06.2014
comment
@user3666197 user3666197 Я не понимаю, что вы говорите. Единственное, что я изменил, это форматирование и грамматика, которые после вашего первоначального редактирования все еще оставались нечитаемыми. Я не внес никаких изменений в операции или порядок вызова. Кроме того, этот странный интервал, который вы добавили внутри операторов if, не является стандартным ни в одном руководстве по стилю или IDE, которые я когда-либо видел, — он также заставляет боковую прокрутку увидеть весь код. Во всяком случае, это просто интервал и не влияет на выполнение, поэтому я не уверен, к чему вы клоните. - person nbrooks; 14.06.2014
comment
@nbrooks Не волнуйтесь, меня шокировало то, что как только вы сохранили (отформатировали) правки, вы удалили / повредили эти усилия. Тут особо ничего нового не придумаешь. Сообщество Metatrader4/MQL4 по подавляющему большинству установленной базы не является профессиональной элитной группой C#/C++, поэтому ясность концепции имеет большее значение, чем инстинкты C-ветеранов. Поскольку вы возражаете против IDE/style-guide, само собой разумеется, что даже профессиональные круги не разделяют мнения по этому поводу — просто возьмите требования MISRA-C для автомобильной промышленности, а не противоположные приоритеты из жесткой отраслевой практики ядра/ОС реального времени. . Простота правил чтения MQL4-guy - person user3666197; 15.06.2014
comment
@nbrooks ... и, наконец, возражение ... заставляет боковую прокрутку увидеть весь код. должен ли ИМО быть адресован StackOverflow владелец портала, потому что блокировка ценного контента до МЕНЬШЕ ОДНОЙ ТРЕТИ ресурса макета экрана (с нежелательным побочным эффектом прокрутки за границей макета) в эпоху пост-FullHD-разрешения не имеет ничего общего с кодом как таковой, но с уровнем представления этого сайта. UX имеет значение, не так ли? - person user3666197; 15.06.2014

TimeLocal() дает вам количество секунд, прошедших с полуночи 1 января 1970 года на вашем локальном компьютере (терминальный клиент).

TimeCurrent() показывает количество секунд, прошедших с полуночи 1 января 1970 года на компьютере вашего брокера (сервере).

Вы можете преобразовать любой из них в строку следующим образом:

string ct = TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS);
Print("Client Time: ", ct);

string st = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
Print("Server Time: ", st);

Вы также можете получить отдельные элементы номера даты следующим образом:

Print("Year:",TimeYear(TimeCurrent())," Month:",TimeMonth(TimeCurrent()));

Онлайн-руководство для программистов на MQL4 можно найти здесь.

Надеюсь это поможет.

Ваше здоровье,

Отметка

person Mark    schedule 24.02.2011