Перейти к содержанию

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


Рекомендуемые сообщения

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

В цикле перебора для подсчёта профита, тоже есть ошибка:

if (OrderType() == OP_BUY && OrderType() == OP_SELL)

а должно быть:

if (OrderType() == OP_BUY || OrderType() == OP_SELL) .

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано


Ошибка здесь:
return(count);
avg = NormalizeDouble(avg / count, 2);
нужно:
return(NormalizeDouble(avg / count, 2));

и странности в функции закрытия ордеров:
- где Вы берете тикет (ticketbuystop)?
- где Вы выбираете ордер, чтобы использовать OrderLots()?
- OrderClosePrice() использовать нельзя - там пусто! ордер ещё не закрыт. Справку читаете?

Вы мой пост выше читали?


Да, я прочитал, только я читаю мозгом дилетанта, а вы профессионала. Тикет у меня берется с отложенных ордеров, которые после открытия мне и нужно считать. Ордер я не выбираю, не знаю как. В справке OrderClosePrice, написано что это цена закрытия, но не написано,что после закрытия.
Если не сложно, подскажите, как правильно выбрать ордера и закрыть их, если они разнонаправленные с разными лотами и прежде были стоп-отложками.

Добавлено: 15-10-2014 17:45:38


В цикле перебора для подсчёта профита, тоже есть ошибка:

if (OrderType() == OP_BUY && OrderType() == OP_SELL)

а должно быть:

if (OrderType() == OP_BUY || OrderType() == OP_SELL) .



Мне нужно чтобы считались OP_BUY и OP_SELL, а не тот или другой. Но если при том, что надо подсчитывать ордера обоих направлений, надо писать ИЛИ,то я непременно исправлю, Спасибо! Изменено пользователем Шурик
Ссылка на сообщение
Поделиться на другие сайты

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

Прошу Гуру в MQL прокомментировать варианты использования ф-ции iCustom.

Практически всегда встречается в кодах такой вариант записи вызова стороннего индикатора:

//+------------------------------------------------------------------+
Buf_0_bar_0 = iCustom(NULL,0,"Индюк",параметры индюка,0,0);
Buf_0_bar_1 = iCustom(NULL,0,"Индюк",параметры индюка,0,1);
..........................................................
Buf_n_bar_n = iCustom(NULL,0,"Индюк",параметры индюка,n,n);
//+------------------------------------------------------------------+

Но вот недавно встретил иную запись, через вызов как отдельной функции:

//+------------------------------------------------------------------+
double Индюк(int buf, int shift)
{
return(iCustom(NULL,0,"Индюк",параметры индюка,buf,shift));
}
//+------------------------------------------------------------------+
Buf_0_bar_0 = Индюк(0,0);
Buf_0_bar_1 = Индюк(0,1);
..........................................................
Buf_n_bar_n = Индюк(n,n);
//+------------------------------------------------------------------+

Вопрос: есть ли существенная разница в этих подходах к вызову стороннего индюка в плане на качество работы и каковы преимущества/недостатки между этими вариантами, есть ли нюансы, какой вариант предпочтителен?
И еще интересует: в ф-ции Индюк(int buf, int shift) разве не должны формальные параметры передаваться по ссылке?




Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Шурик держи, простой вариант в качестве примера, для понимания принципа, закрывает абсолютно всё что есть, нужно только условие для запуска:

  void CloseAllOrders()   // закрытие всех ордеров
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if (OrderType() == OP_BUY) PriceClose = Bid;
if (OrderType() == OP_SELL) PriceClose = Ask;
{
if (OrderClose(OrderTicket(),OrderLots(),PriceClose,Slippage,CLR_NONE) == true)
{
Print ("Функция OrderClose успешно выполнена");
}
else
Print ("OrderClose завершилась с ошибкой #", GetLastError());
}
}
}
}
}
for(int ii = OrdersTotal()-1; ii>=0; ii--)
{
if (OrderSelect(ii, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP || OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP)
{
if (OrderDelete(OrderTicket()) == true)
{
Print ("Функция OrderDelet успешно выполнена");
}
else
Print ("OrderDelet завершилась с ошибкой #", GetLastError());
}
}
}
}
}


На счёт (&&) и (||), достаточно просто это проговорить, чтобы понять что получается абсурд. В первом варианте получается, исполнение проходит дальше, если ордер является покупкой и продажей, но очевидно же, такого не может быть. Во втором варианте, проходит если выбранный ордер является покупкой или продажей, что в свою очередь вполне логично.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
mobidik Вызовы равнозначны
Второй вариант для экономии строк в исходнике, но вызов функции в откомпилированном коде будет дольше (незначительно).
Что касается передачи по ссылке - зачем? внутри функции передаваемые значения не меняются, да и вызов её скорее всего с константами (как Вы и написали Индюк(0,0);).
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


mobidik Вызовы равнозначны
Второй вариант для экономии строк в исходнике, но вызов функции в откомпилированном коде будет дольше (незначительно).
Что касается передачи по ссылке - зачем? внутри функции передаваемые значения не меняются, да и вызов её скорее всего с константами (как Вы и написали Индюк(0,0);).



Благодарю, Oll.
Раз "вызов функции в откомпилированном коде будет дольше" - значит отпадает для советников, по причине большего времени оптимизации.
Ссылка на сообщение
Поделиться на другие сайты

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

chistaia-rodina, Спасибо, большое! И подсказали и объяснили!


Добавлено: 16-10-2014 05:39:48

У меня последний вопрос, господа профессионалы. Достаточно ли сравнить функцию поиска суммарного профита и внешнюю переменную, в которой указывается количество единиц валюты или внешнюю переменную нужна нормализовывать и т.п.??? Изменено пользователем Шурик
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Шурик в нормализации нуждаются только значения, передаваемые в торговые функции - во избежании ошибок. Остальное нормализовывать не нужно!
Ссылка на сообщение
Поделиться на другие сайты

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

Ну так как заставить это работать:
Функцию вычисления суммарного профита, описанную выше, я поправил (и переименовал);
Функцией закрытия ордеров любезно поделился г-н chistaia-rodina, спасибо ему;
В теле совы пишу:
if (TotalProfit() >= Profit)
{
CloseAllOrders();
}

А в ответ - тишина!

Ссылка на сообщение
Поделиться на другие сайты

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

Выкладывайте Ваш TotalProfit(). или сами пишите Print(TotalProfit()); и смотрите, что функция возвращает.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Шурик, на счёт моей функции, надеюсь Вы не забыли объявить переменную PriceClose, просто у меня она стоит во входных параметрах, а индивидуального объявления в теле функции нет, если что, то добавьте в начале:

double PriceClose = 0;
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, коллеги. С MQL я не дружу, сам дельфин. Помогите немножко пожалуйста.

Хочу узнать максимальное значение ATR за период.


int start()
{
int i;
double MaxValue=0;
double Value;

for(i=0;i {
Value = iCustom(Symbol(),Period(),"ATR",ATR_Period,0,i);
if (Value>MaxValue)
MaxValue=Value;
}

CreateLabel (IndName+"_Value",MaxValue, 0,0,10,10,"",20,LabelColor);
return(0);
}


Возвращает одно и то же значение при любом MaxBars и оно неправильное. Хочу узнать за период в 400 свечей (MaxBars=400) на D1.
Ссылка на сообщение
Поделиться на другие сайты

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

Совершенно неизвестно что за кастомный индюк у тебя по имени ATR (он вообще есть?)
iATR (NULL, 0, ATR_Period, i) должен тебя спасти.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
int i;
double MaxValue=0;
double Value;

for(i=0;i {
Value = iCustom(Symbol(),Period(),"ATR",14,0,i);
if (Value>MaxValue)
MaxValue=Value;
}

Comment("MaxValue = "+MaxValue);

}
//+------------------------------------------------------------------+


http://gyazo.com/3be8070ef69224992d60f014495425d4
Ссылка на сообщение
Поделиться на другие сайты

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

А подскажите пожалуйста, какой объект нужен, чтобы, скажем, отметить все бары на истории, которые меньше 30 пунктов, стрелочками?

Ссылка на сообщение
Поделиться на другие сайты

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

Сделал наскоро скрипт, но уже ответили выше - надо брать через встроенную функцию iATR()

MaxATR.mq4

Ссылка на сообщение
Поделиться на другие сайты

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


А подскажите пожалуйста, какой объект нужен, чтобы, скажем, отметить все бары на истории, которые меньше 30 пунктов, стрелочками?

Лучше через индюк в основном окне, буфер которого содержит координату (цену) стрелочки (ARROW), например:
SetIndexBuffer(0,ExtMapBuffer);
SetIndexStyle(0,DRAW_ARROW,1,5);
SetIndexArrow(0,233);
Ссылка на сообщение
Поделиться на другие сайты

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

Большое спасибо, сам протупил. Помогите еще протупить чуть-чуть!

Надо нарисовать Arrow в том месте Subwindow=1, где получили значение MaxValue. Номер свечи знаем, значение по высоте знаем. Нарисовать не умеем :-&

Ссылка на сообщение
Поделиться на другие сайты

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


Надо нарисовать Arrow в том месте Subwindow=1, где получили значение MaxValue. Номер свечи знаем, значение по высоте знаем. Нарисовать не умеем :-&

Я не большой спец в оформительстве... Я сделал-бы проще: в коде ориг. АТР добавил буфер-гистограмму и в нужный бар буфера писал значение мах. АТР. Выглядело-бы это в виде: кривая АТР и в нужном месте вертикальный бар гистограммы.
Другое дело: обновление максимума. Вот нашли вы мах на 60 баре, а через 10 бар АТР выдал новый мах. - что делать? - старый затирать, новый рисовать? или пусть остаётся?, а если махимумы обновляются на каждом новом баре?
Ссылка на сообщение
Поделиться на другие сайты

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


Другое дело: обновление максимума. Вот нашли вы мах на 60 баре, а через 10 бар АТР выдал новый мах. - что делать? - старый затирать, новый рисовать? или пусть остаётся?, а если махимумы обновляются на каждом новом баре?



Старый затирать. Индюк исключительно информационный. Предназначен для корректировки лота с зависимости от Max(ATR).

Примерно так:
if (BarChanged)
{
CalculateMaxValue;
ObjectDelete("MaxArrow");
ObjectCreate("MaxArrow", OBJ_ARROW, ?????????)
}


Просто я не умею стрелку нарисовать в нужном месте. Где-то видел давно, забыл как :-&.

Стрелка нужна, чтобы видеть, нет ли рядом экстремума, который не вошел в расчет потому, что пожадничал с MaxBars. Изменено пользователем st2050
Ссылка на сообщение
Поделиться на другие сайты

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

Набросал такой цикл, не знаю, правильно ли
Только вот куда его?

for (int i = 1; i {
double ExtMapBuffer[ ];
double a = NormalizeDouble((Open[ i ]-Close[ i ]),Digits);

if (MathAbs(a) {
SetIndexBuffer(0,ExtMapBuffer);
SetIndexStyle(0,DRAW_ARROW,1,5);
SetIndexArrow(0,233);
}
}

Ссылка на сообщение
Поделиться на другие сайты

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

oleguitar, на мой взгляд использовать константы "200" в вашем случае - немного недальновидно.
Такие вещи лучше сразу делать через определение констант в заголовке советника и использовать уже символьные имена.
Например,
#define OURMAGIC 137433
И спустя какое-то время не придется судорожно вспоминать что же это такое 137433 или иное другое число.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar не то..., совсем...
Скачайте любой стрелочный индикатор (можно отсюда), логику замените на свою.
Просто с нуля объяснять принципы написания индюков - очень долго.
Ссылка на сообщение
Поделиться на другие сайты

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

Господа асы, помогите решить проблему с совой. не работает функция закрытия ордеров с суммарным профитом, значение профит задается во внешнем параметре Profit. Сова прилагается. Придумывал и писал сам, по видео урокам, так что сильно не пинайте. В общем, там все работает, кроме закрытия с профитом. Подскажите что исправить, ну или исправьте, если не сложно.

SyperMartin.mq4

Изменено пользователем Шурик
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...