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