В цикле перебора для подсчёта профита, тоже есть ошибка:
if (OrderType() == OP_BUY && OrderType() == OP_SELL)
а должно быть:
if (OrderType() == OP_BUY || OrderType() == OP_SELL) .
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Ошибка здесь:
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, а не тот или другой. Но если при том, что надо подсчитывать ордера обоих направлений, надо писать ИЛИ,то я непременно исправлю, Спасибо!
Изменено 15 октября, 2014 пользователем Шурик
Прошу Гуру в 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) разве не должны формальные параметры передаваться по ссылке?
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());
}
}
}
}
}
На счёт (&&) и (||), достаточно просто это проговорить, чтобы понять что получается абсурд. В первом варианте получается, исполнение проходит дальше, если ордер является покупкой и продажей, но очевидно же, такого не может быть. Во втором варианте, проходит если выбранный ордер является покупкой или продажей, что в свою очередь вполне логично.
Второй вариант для экономии строк в исходнике, но вызов функции в откомпилированном коде будет дольше (незначительно).
Что касается передачи по ссылке - зачем? внутри функции передаваемые значения не меняются, да и вызов её скорее всего с константами (как Вы и написали Индюк(0,0);).
mobidik Вызовы равнозначны
Второй вариант для экономии строк в исходнике, но вызов функции в откомпилированном коде будет дольше (незначительно).
Что касается передачи по ссылке - зачем? внутри функции передаваемые значения не меняются, да и вызов её скорее всего с константами (как Вы и написали Индюк(0,0);).
Благодарю, Oll.
Раз "вызов функции в откомпилированном коде будет дольше" - значит отпадает для советников, по причине большего времени оптимизации.
chistaia-rodina, Спасибо, большое! И подсказали и объяснили!
Добавлено: 16-10-2014 05:39:48
У меня последний вопрос, господа профессионалы. Достаточно ли сравнить функцию поиска суммарного профита и внешнюю переменную, в которой указывается количество единиц валюты или внешнюю переменную нужна нормализовывать и т.п.???
Изменено 16 октября, 2014 пользователем Шурик
Ну так как заставить это работать:
Функцию вычисления суммарного профита, описанную выше, я поправил (и переименовал);
Функцией закрытия ордеров любезно поделился г-н chistaia-rodina, спасибо ему;
В теле совы пишу:
if (TotalProfit() >= Profit)
{
CloseAllOrders();
}
А в ответ - тишина!
Выкладывайте Ваш TotalProfit(). или сами пишите Print(TotalProfit()); и смотрите, что функция возвращает.
double PriceClose = 0;
Здравствуйте, коллеги. С 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.
Совершенно неизвестно что за кастомный индюк у тебя по имени ATR (он вообще есть?)
iATR (NULL, 0, ATR_Period, i) должен тебя спасти.
//+------------------------------------------------------------------+
//| 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
А подскажите пожалуйста, какой объект нужен, чтобы, скажем, отметить все бары на истории, которые меньше 30 пунктов, стрелочками?
Сделал наскоро скрипт, но уже ответили выше - надо брать через встроенную функцию iATR()
Лучше через индюк в основном окне, буфер которого содержит координату (цену) стрелочки (ARROW), например:
А подскажите пожалуйста, какой объект нужен, чтобы, скажем, отметить все бары на истории, которые меньше 30 пунктов, стрелочками?
SetIndexBuffer(0,ExtMapBuffer);
SetIndexStyle(0,DRAW_ARROW,1,5);
SetIndexArrow(0,233);
Большое спасибо, сам протупил. Помогите еще протупить чуть-чуть!
Надо нарисовать Arrow в том месте Subwindow=1, где получили значение MaxValue. Номер свечи знаем, значение по высоте знаем. Нарисовать не умеем :-&
Я не большой спец в оформительстве... Я сделал-бы проще: в коде ориг. АТР добавил буфер-гистограмму и в нужный бар буфера писал значение мах. АТР. Выглядело-бы это в виде: кривая АТР и в нужном месте вертикальный бар гистограммы.
Надо нарисовать Arrow в том месте Subwindow=1, где получили значение MaxValue. Номер свечи знаем, значение по высоте знаем. Нарисовать не умеем :-&
Другое дело: обновление максимума. Вот нашли вы мах на 60 баре, а через 10 бар АТР выдал новый мах. - что делать? - старый затирать, новый рисовать? или пусть остаётся?, а если махимумы обновляются на каждом новом баре?
Другое дело: обновление максимума. Вот нашли вы мах на 60 баре, а через 10 бар АТР выдал новый мах. - что делать? - старый затирать, новый рисовать? или пусть остаётся?, а если махимумы обновляются на каждом новом баре?
Старый затирать. Индюк исключительно информационный. Предназначен для корректировки лота с зависимости от Max(ATR).
Примерно так:
if (BarChanged)
{
CalculateMaxValue;
ObjectDelete("MaxArrow");
ObjectCreate("MaxArrow", OBJ_ARROW, ?????????)
}
Просто я не умею стрелку нарисовать в нужном месте. Где-то видел давно, забыл как :-&.
Стрелка нужна, чтобы видеть, нет ли рядом экстремума, который не вошел в расчет потому, что пожадничал с MaxBars.
Изменено 17 октября, 2014 пользователем st2050
Набросал такой цикл, не знаю, правильно ли
Только вот куда его?
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);
}
}
oleguitar, на мой взгляд использовать константы "200" в вашем случае - немного недальновидно.
Такие вещи лучше сразу делать через определение констант в заголовке советника и использовать уже символьные имена.
Например,
#define OURMAGIC 137433
И спустя какое-то время не придется судорожно вспоминать что же это такое 137433 или иное другое число.
Скачайте любой стрелочный индикатор (можно отсюда), логику замените на свою.
Просто с нуля объяснять принципы написания индюков - очень долго.
Господа асы, помогите решить проблему с совой. не работает функция закрытия ордеров с суммарным профитом, значение профит задается во внешнем параметре Profit. Сова прилагается. Придумывал и писал сам, по видео урокам, так что сильно не пинайте. В общем, там все работает, кроме закрытия с профитом. Подскажите что исправить, ну или исправьте, если не сложно.
Изменено 17 октября, 2014 пользователем Шурик
Я mql изучаю месяца два только, не судите строго)
индикаторы не умею писать конечно же
найти бы такой, где поменьше кода, чтобы разобраться что к чему
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем