Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#2826


Господа помогите...
Просмотрел первые три урока Сергея. Здорово!
Пытаюсь воспроизвести сову по третьему уроку.... по ТМА.
Засада на ровном месте.
Вопрос - почему высвечиваются ошибки и symbol не подсвечивается в цвет?
http://joxi.ru/eAOlzELIJOnBro (для увеличения кликните мышкой на картинку)


С большой буквы нужно Symbol() код регистрозависимый.
#2827

Во!!! Ёжики печоные!!!
x_x
СПАСИБО!
Всех благ!

#2828

Уважаемые программисты не подскажите почему получается так что если выписать все прибыльные сделки по определённому шагу цены от точки до точки в столбец друг за другом игнорируя убыточные то выходит согласованность между ними по входам и выходам более 90% это на кроссах, а на слабо волатильных валютах меньше? Просто у меня сложилось такое впечатление что Рынок закономерен или я не прав?

#2829


Уважаемые программисты не подскажите почему получается так что если выписать все прибыльные сделки по определённому шагу цены от точки до точки в столбец друг за другом игнорируя убыточные то выходит согласованность между ними по входам и выходам более 90% это на кроссах, а на слабо волатильных валютах меньше? Просто у меня сложилось такое впечатление что Рынок закономерен или я не прав?

Подробнее с примерами, а то понять трудно. Некоторые закономерности в рынке есть. нужно внимательно их изучать.
#2830



Уважаемые программисты не подскажите почему получается так что если выписать все прибыльные сделки по определённому шагу цены от точки до точки в столбец друг за другом игнорируя убыточные то выходит согласованность между ними по входам и выходам более 90% это на кроссах, а на слабо волатильных валютах меньше? Просто у меня сложилось такое впечатление что Рынок закономерен или я не прав?

Подробнее с примерами, а то понять трудно. Некоторые закономерности в рынке есть. нужно внимательно их изучать.

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

EURJPYM1.png

#2831

Добрый день!
Есть ли в видеоуроках информация о удалении несработанного отложенного ордера, если например сработал тейк проф, спасибо. :-b

#2832
garanyan1985, боюсь, что те, кто в этом топике в основном отвечают, интересующих вас видео уроков как раз и не смотрели. :( :)
#2833

Здравствуйте, пишу бота на цикле.
1) открывается сделка (все равно в какую сторону) к примеру BUY 0,02 лота с фиксом прибыли в 1$
далее если сделка закрывается в + , сразу открывается такая же
2) если пара идет в другую сторону , через 4 пункта (старые) открывается сделка объемом в 3 раза больше 0,06 Sell , и ждем закрытия сделок с общим профитом в 1$
3) и так далее но не более 5 сделок , если 5-ая опять идет не туда , закрывается убыток но не более 10% от депозита

Не открывает третью противоположную сделку, и не закрывает все ордера когда AccountProfit() = 1 $


Добавлено: 24-11-2015 21:44:49


Добрый день!
Есть ли в видеоуроках информация о удалении несработанного отложенного ордера, если например сработал тейк проф, спасибо. :-b



_https://www.mql5.com/ru/articles/1413 здесь второй бот
так же можешь через OrderDelete() написать:
if(OrderProfit() == TakeProfit)
{
OrderSelect(...);
{
OrderDelete(...);
}
} // ну или OrderProfit() можешь чем то другим заменить.

14.mq49 скач.

Изменено 25 ноября, 2015 пользователем Alex Fato

#2834

:-/ Как корректно переводить пипсы в цену и обратно? Может, кто кинет ссылку, где это толково объясняется? Вообще, есть какие-то служебные функции типа NormalizeDouble -для чего они, и как ими пользоваться? Может, где то это понятно описано?

#2835


:-/ Как корректно переводить пипсы в цену и обратно? Может, кто кинет ссылку, где это толково объясняется? Вообще, есть какие-то служебные функции типа NormalizeDouble -для чего они, и как ими пользоваться? Может, где то это понятно описано?


Пипс * Point - Цена, Цена / Point - Пипс.
NormalizeDouble - округляет число.

Изменено 25 ноября, 2015 пользователем Qj

#2836

Подскажите пожалуйста!
Урок № 2 обновленный.
При компилировании выдает ошибку ""BuyLimitCount" - функция не определена"- function not defined и для 'BuyCount'
'SellLimitCount' тоже, а для 'SellCount' - нет. Что делать?
Еще засунул в бот со второго урока старого, функцию "DeleteOrders()" убирать не сработавшие ордера. - Выдает предупреждение -Возвращаемое значение '' OrderDelete должны быть проверены - return value of 'OrderDelete' should be checked.

Заранее спасибо.

Изменено 26 ноября, 2015 пользователем Kroft

#2837


Подскажите пожалуйста!
Урок № 2 обновленный.
При компилировании выдает ошибку ""BuyLimitCount" - функция не определена"- function not defined и для 'BuyCount'
'SellLimitCount' тоже, а для 'SellCount' - нет. Что делать?
Еще засунул в бот со второго урока старого, функцию "DeleteOrders()" убирать не сработавшие ордера. - Выдает предупреждение -Возвращаемое значение '' OrderDelete должны быть проверены - return value of 'OrderDelete' should be checked.

Заранее спасибо.



ну потомучто ты используешь нестандартные функции, не описанные за пределами рабочего исполняемого кода, поэтому это логично что он ругается. откуда ты вобще взял эти функции?

второй вопрос - да, они желательно должны быть проверяемыми.

лучше делать так:
if (OrderDelete(параметры функции))
{
можно вывести какое либо ссобщение. или вобще ничего тут не делать
}

тоже самое касается OrderSelect, OrderModify и тому подобных.
#2838

откуда ты вообще взял эти функции?
Со второго урока - все в точь исполнил, убрал - перестал ругаться.
Второй вопрос:
лучше делать так:
if (OrderDelete(параметры функции))
{
можно вывести какое либо сообщение. или вообще ничего тут не делать - Убрал параметр.
}

убрал параметр - получил:

Ноль ошибок и ноль замечаний.

Спасибо, это мой первый советник - кривой, но все же.
Будем работать.


Добавлено: 26-11-2015 18:27:08

Вот такая вот петрушка, мой бот берет только общую максимальную цену, а максимальную дня не пересчитывает, вроде все по уроку второму сделал. может кто разъяснит ситуацию по второму уроку - обновленному.
Настройки
extern int BarCount = 10;
extern int HourStart = 10;
extern int HourEnd = 23;

void GetMinPrice()
{
for (int i = 0; i
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp minprice = mp;
}
return;
}
//+------------------------------------------------------------------+

void GetMaxPrice()
{
for (int i = 0; i
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}


Спасибо.

501888090.jpg

Изменено 27 ноября, 2015 пользователем Kroft

#2839


Подскажите пожалуйста!
Урок № 2 обновленный.
При компилировании выдает ошибку ""BuyLimitCount" - функция не определена"- function not defined и для 'BuyCount'
'SellLimitCount' тоже, а для 'SellCount' - нет. Что делать?
Заранее спасибо.



Сделал все по уроку №2. При компиляции ошибок не было.
Файл прилагаю.

Огромное спасибо xbms !

test2.mq419 скач.

#2840

Можно как-нибудь(например, массивом строк) получить список ВСЕХ валютных пар, которые поддерживает брокер?

#2841


Можно как-нибудь(например, массивом строк) получить список ВСЕХ валютных пар, которые поддерживает брокер?




Почитайте здесь
В цикле читаете символы (SymbolName) и пишете в массив.

Изменено 20 августа, 2017 пользователем Pavel888

#2842

Выполнил домашнее задание к обновленному второму уроку.
От себя добавил:
[list type=decimal]

  • время открытия ордеров не только в часах, но и в минутах,

  • возможность отключать/включать установку лимитных ордеров

  • возможность отключать/включать установку стоп ордеров

  • проверку на количество знаков у брокера (из старых уроков) (все параметры в советнике задаем в старых пунктах)


  • Прошу уважаемого xbms проверить и указать на ошибки, если таковые будут ( а куда они денутся :) )

    test2_dom_zadanie.mq416 скач.

    #2843



    void GetMinPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp minprice = mp;
    }
    return;
    }
    //+------------------------------------------------------------------+

    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }


    Спасибо.



    у тебя в обеих функциях(а они по идее должны быть процедурами с возвращающим double), возвращает всегда null в независимости от расчётов? так и должно быть?
    #2844
    Спойлер




    void GetMinPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp minprice = mp;
    }
    return;
    }
    //+------------------------------------------------------------------+

    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }


    Спасибо.



    у тебя в обеих функциях(а они по идее должны быть процедурами с возвращающим double), возвращает всегда null в независимости от расчётов? так и должно быть?


    Так и должно быть. Мы находим mp в цикле и сравниваем его с заданным minpice. И, если mp Как-бы возвращать функция ничего и не должна. Поэтому для выхода из нее используем команду return.

    Тут специально используется тип void
    Цитата

    Синтаксически тип void является фундаментальным типом наравне с типами char, uchar, bool, short, ushort, int, uint, color, long, ulong, datetime, float, double и string. Этот тип используется либо для указания того, что функция не возвращает значения, либо в качестве параметра функции обозначает отсутствие параметров.

    #2845

    ок, понял, типичная ошибка новичка при поиске минимального значения)))

    чему равен записываемый минимум ДО сравнения? который minprice? нулю? null??? none??? то все логично, ЛЮБОЙ другой минимум будет больше этого значения - и перезаписи не будет.

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

    Изменено 30 ноября, 2015 пользователем dermitay

    #2846
    dermitay, спасибо за ваши советы, я только начал обучение, и любая информация полезна.

    Цитата

    чему равен записываемый минимум ДО сравнения? который minprice? нулю? null??? none??? то все логично, ЛЮБОЙ другой минимум будет больше этого значения - и перезаписи не будет.



    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }

    #2847


    dermitay, спасибо за ваши советы, я только начал обучение, и любая информация полезна.

    Цитата

    чему равен записываемый минимум ДО сравнения? который minprice? нулю? null??? none??? то все логично, ЛЮБОЙ другой минимум будет больше этого значения - и перезаписи не будет.



    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }




    смотри. допустим цена сейчас равна 1.0570 (евробакс сейчас), пусть это будет и минимум(iLow) и максимум(iHigh).
    это меньше 99999? да, перезаписываем минимум.
    это больше 99999? нет, не перезаписываем максимум.

    следующая итерация. цена поменялась бар назад на 1.0560.
    это меньше 1,0570? да, перезаписываем минимум.
    это больше 99999? нет, не перезаписываем максимум.

    следующая итерация. цена поменялась бар назад на 1.0580.
    это меньше 1,0560? нет, не перезаписываем минимум.
    это больше 99999? нет, не перезаписываем максимум.

    и так далее.

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

    minprice = MarketInfo(Symbol(), MODE_BID);
    maxprice = MarketInfo(Symbol(), MODE_BID);

    ну или просто

    minprice = Bid;
    maxprice = Bid;

    и дальше у тебя уже неважно какая пара будет анализироваться - ты будешь знать что в операциях сравнения всё будет ок.

    Изменено 30 ноября, 2015 пользователем dermitay

    #2848

    Здравствуйте. Вот я тут что-то сделал , но не получилось, посмотрите пожалуйста и подскажите как надо.

    Идея ТС.
    Торговля на пробое.
    Открытие позиций:
    Линия S1 взята от внешнего индикатора. Буферы в индикаторе выключены.
    При пересечении линии S1 ценой вверх советник открывает ордер на покупку.
    При пересечении той же линии S1 ценой вниз советник открывает ордер на продажу.
    Одновременно может быть открыта только одна сделка.
    Закрытие позиций:
    Cоветник закрывает позиции автоматически при достижении уровня стоп-лосс или тейк профит.

    Test-1.ex4 в тесте ордера не открывает.
    Если я меняю условие на
    if( Bid if(Ask>LastAsk)
    - ордера открываются, но они никак не связаны с индикатором (в приложение- скрин).
    Что надо добавить, чтобы ордера открывались только при пробое линии.

    Test_-1.mq46 скач.
    Screen.png
    ok.mq47 скач.

    #2849


    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }



    имхо, начальное значение maxprice=-99999 корректно.
    Хотя вариант dermitay тоже рабочий.

    Ошибка, как мне кажется, в другом.


    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }



    Почему mp = iLow? Хай дня по лоям свечей не узнаешь... Вроде должен быть mp = iHigh... :)

    Изменено 30 ноября, 2015 пользователем Старик

    #2850
    Спойлер



    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }



    имхо, начальное значение maxprice=-99999 корректно.
    Хотя вариант dermitay тоже рабочий.

    Ошибка, как мне кажется, в другом.


    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }



    Почему mp = iLow? Вроде должен быть iHigh. :)


    Старик, и тот и тот вариант работают одинаково, я специально проверил. А на счет того, что mp = iLow? Вроде должен быть iHigh. :), так это просто кусок кода без контекста. На самом деле mp присваивается либо minprice из iLow, либо maxprice из iHigh.

    Цитата

    //+------------------------------------------------------------------+
    //Находим минимальную цену за n баров |
    //+------------------------------------------------------------------+
    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }

    //+------------------------------------------------------------------+
    //Находим максимальную цену за n баров |
    //+------------------------------------------------------------------+
    void GetMaxPrice()
    {
    for (int i=0; i {
    mp = iHigh(Symbol(), PERIOD_CURRENT, i);
    if(mp>maxprice)
    maxprice = mp;
    }
    return;
    }



    Тут я виноват, что вырвал кусок без объяснения.

    Для публикации сообщений создайте учётную запись или авторизуйтесь

    Перейти к списку тем
    Форум · 2.0.20260627.0025