dermitay Опубликовано 19 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 января, 2016 mops0000, незачем выкладывать такие полотна кода, прячьте их хотя бы под спойлер, уважайте глаза читателей)) да и банально, как бы это грубо ни звучало, но разбирать ВЕСЬ код тут вряд ли кто-то будет.а ответ на ваш вопрос прост - перед открытием нового ордера делайте проверку на существование УЖЕ открытого ордера.только не спрашивайте как - это легко гуглится и по-любому в этой теме поднималось и не раз. Спойлер форекзампл булевая функция, в нее передаётся символ и тип проверяемой стороны ордера(бай/селл, и я в последнее время мультивалютный мазохист, поэтому за сложность понимания кода - не обессудьте)Возврат функции - открыт такой ордер уже или нет:bool IsNoOpenOrdBySide(string sym, int side){for(int i = OrdersTotal()-1; i>=0; i--){if (!OrderSelect(i,SELECT_BY_POS)) continue;if (OrderMagicNumber()!= Magic) continue;if (OrderSymbol() != sym) continue;if (OrderType()!= side) continue;return false;}return true;}можно пойти еще проще в вашем случае, перед открытие ордера просто проверять OrdersTotal(). и если оно больше нуля - ордер не открываем. Изменено 19 января, 2016 пользователем dermitay Ссылка на сообщение Поделиться на другие сайты More sharing options...
Гость fx2015 Опубликовано 19 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 января, 2016 Спасибо. Разобрался. Все заработало как надо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Stanislava Опубликовано 19 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 января, 2016 Подскажите, если запрограммировано брать цены баров с графика, то выставленный индикатор Heiken Ashi будет влиять или цены будут вычисляться не зависимо от изображения?И как будут работать советники - индикаторы, когда терминал выдает "Нет цены", т.е. когда в ручную не выставить ордера. Изменено 19 января, 2016 пользователем Stanislava Ссылка на сообщение Поделиться на другие сайты More sharing options...
Старик Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Stanislava, есть основания не верить на 100%, что где-то запрограммировано брать ЦЕНЫ БАРОВ (опен, клоуз, хай, лоу?) именно с графика...Теоретически это возможно, но такое программируется нечасто.Скорее всего, у вас неточная или неполная информация - или вы путаете.Рекомендую перепроверить, еще лучше показать код, чтобы можно было понять о чём вы.Второй вопрос некорректен: ситуация "нет цены" сама по себе, относится к неудачной попытке выставить конкретный ордер - и ничего не говорит о том, что в рынке и как будут работать неведомые советники и неведомые индикаторы. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Stanislava Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Старик, да у меня неточный вопрос и последующие точными быть не смогут, настолько много не знаю, что точного вопроса не сформулировать.Интересует сам принцип работы МТ (терминала) и всевозможных утилит. Где и как они берут цены, на основе которых строятся графики и производятся вычисления для дальнейшей визуализации и торговли?Меня с понедельника на демо-счете достают вылетающие таблички - "Нет цены" при попытке выставить ордер руками. Стало интересно, как такая ситуация влияет на работу утилит. И еще, вчера не стала дописывать, но припомнила, что читала в отзывах об аннулировании сделок по причине "не рыночной котировки". Правильно ли я понимаю, что такая коллизия может возникнуть при использовании отдельных советников? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Старик Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Вопросы надо задавать в соответствующих вопросам топиках.Вообще вам сначала надо почитать побольше - за вас читать не будут и пересказывать вам учебники тоже некому.Это топик обучения программированию, а вы пока терминал не изучили как следует.Это сейчас еще явно не ваш топик.И сырые вопросы не в тех топиках официально называется флудом и просто удаляются.Так что рекомендую пока сконцентрироваться на чтении учебных материалов - появятся другие вопросы, но вы будете задавать их правильнее и там где надо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Stanislava принцип такой: в терминал (МТ) приходит котировка по паре. Сначала её получают МТ, потом индюки поставленные вручную (индюк получает не все котировки - ранее было замечено), почти сразу (параллельно с МТ) получают совы, а потом индюки вызываемые в совах. При выставлении ордера хоть совой, хоть руками, корректность сначала проверяется МТ, в МТ есть таймаут валидности котировки - если "очень старая", по мнению МТ, то он пишет нет цены. и надо ждать следующего тика. на евродолларе тики идут чаще, поэтому "нет цены" реже, а на какой-нибудь экзотике - наоборот... 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Stanislava Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Спойлер Вопросы надо задавать в соответствующих вопросам топиках.Вообще вам сначала надо почитать побольше - за вас читать не будут и пересказывать вам учебники тоже некому.Это топик обучения программированию, а вы пока терминал не изучили как следует.Это сейчас еще явно не ваш топик.И сырые вопросы не в тех топиках официально называется флудом и просто удаляются.Так что рекомендую пока сконцентрироваться на чтении учебных материалов - появятся другие вопросы, но вы будете задавать их правильнее и там где надо. Не нашла ни учебника, ни соответствующего раздела на форуме. Но с моей т.з. вопросы по теме. В учебнике по МТ по определению не будет главы посвященной умышленному обходу сигналов поставщика котировок или еще какой-то умности, что бы в дальнейшем глядя на код в конкретных строках сразу понимать, что использовать вредно. И не хотелось бы тратить уйму времени на изучение - тесты тучи не эффективного ПО (советники - индикаторы и т.д.)Фактически, я спросила о самих принципах функционирования специализированных программ, как об их взаимодействии именно с точки зрения программирования, как откуда берут котировки в программах, когда действия выполняются корректно с т.з. поставщика котировок.Добавлено: 20-01-2016 13:55:48 Спойлер Stanislava принцип такой: в терминал (МТ) приходит котировка по паре. Сначала её получают МТ, потом индюки поставленные вручную (индюк получает не все котировки - ранее было замечено), почти сразу (параллельно с МТ) получают совы, а потом индюки вызываемые в совах. При выставлении ордера хоть совой, хоть руками, корректность сначала проверяется МТ, в МТ есть таймаут валидности котировки - если "очень старая", по мнению МТ, то он пишет нет цены. и надо ждать следующего тика. на евродолларе тики идут чаще, поэтому "нет цены" реже, а на какой-нибудь экзотике - наоборот... Спасибо! Может быть за одно подскажите, в терминале возможно выставить Московское время или он хронически будет отставать на час и время придется подгонять в самих утилитах, если они к нему привязаны (новости). Изменено 20 января, 2016 пользователем Stanislava Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Терминал показывает время котирования, которое передаётся брокером вместе с котировкой - его поменять нельзя.легче переехать в часовой пояс к своему брокеру :d - некоторые так и делают... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Никак не могу найти толковый сайт, где бы было ясно изложено, как работать с кнопками, то бишь BUTTON. как обрабатывать нажатие на неё. Если кто видел такое - киньте ссылку, плиз! Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Никак не могу найти толковый сайт, где бы было ясно изложено, как работать с кнопками, то бишь BUTTON. как обрабатывать нажатие на неё. Если кто видел такое - киньте ссылку, плиз! расскажите, а как вы искали? мне просто интересно, даже самая первая ссылка в гугле на официальную документацию даёт вобще ВСЁ о кнопке и готовый код-кирпич со всеми хотелками и пожеланиями.http://docs.mql4.com/ru/constants/objectconstants/enum_object/obj_button 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 20 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 января, 2016 Терминал показывает время котирования, которое передаётся брокером вместе с котировкой - его поменять нельзя.легче переехать в часовой пояс к своему брокеру :d - некоторые так и делают... Не поставить вам + второй раз, не сказать спасибо, я вас просто запомню. ))) ЗЫ Старик, я помню, что сообщения, типа, "все классно" считаются флудом, со всеми вытекающими, но писать в личку благодарности с моей т.з. = набиваться, так-что трите, если так положено. Все классно.))) а вы в курсе что ордера на бай выставляются по цене Ask, а на селл по цене Bid? и что в терминале рисуются именно цены бид и то что рисуется в терминале и то что дает брокер - это вобще две разные вещи и цифры, которые вы видите не 100% одинаковые? и что цены Ask на истории вы не узнаете никогда? и что сам принцип работы индикаторов и сов различны как небо и земля? вы в курсе что прогон кода советника зачастую идет только по тику от брокера(смотря как написан код), а не постоянно как вы думаете? а вы в курсе что это правило не распространяется на индикаторы и скрипты?вопросы реально не по разделу, вам бы в топик для новичков.меня уже не удивляет лень человеческая. это такая всемирная эпидемия, лень пару ссылок нажать и почитать азы. :))ну а про время.mql4 позволяет "тащить" любое время(типа datetime из которого опять же легко вытащить всё что нужно уже другими функциями):время брокера - TimeCurrent()время GMT(зависит от корректности настройки часового пояса локального ПК) - TimeGMT()локальное время ПК - TimeLocal()это стандартные функции, используемые в коде, но вы, как я понимаю, не за этим же пришли?)) Изменено 20 января, 2016 пользователем dermitay 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 21 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 января, 2016 Этот сайт я нашёл в первую очередь - где там обработка нажатия на кнопку? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 21 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 января, 2016 Этот сайт я нашёл в первую очередь - где там обработка нажатия на кнопку? а, да... ну почитай вот это.http://docs.mql4.com/ru/basis/function/events#oncharteventинформации по первой и второй ссылке достаточно чтобы обрабатывать события нажатия кнопки.по сути - тебе надо понять смысл OnChatEvent(...) и в ней вызывать функции.я не особо силен в кнопках/событиях, но потенциал у них огромный.например, то что я реализовал в своём коде, по нажатию кнопки открывается окно с алертами(юзерам удобно, ведь моя сова любые манипуляции может алертить, и чтобы не лезть в логи, можно просто посмотреть алерты). Ну а дальше ждем 100мс и переводим кнопку в состояние "отжата". Спойлер void OnChartEvent(const int id, // Event identifier const long& lparam, // Event parameter of long type const double& dparam, // Event parameter of double type const string& sparam) // Event parameter of string type {//--- the left mouse button has been pressed on the chart//--- the mouse has been clicked on the graphic object if(id==CHARTEVENT_OBJECT_CLICK) { if(sparam==ButtonOne) Alert("Let's See Alerts >>>>>>"); Sleep(100); ObjectSetInteger(0,ButtonOne,OBJPROP_STATE,false); } } ты можешь посмотреть как реализована работа с кнопками в других совах с открытым кодом, для меня это был например ARTM Изменено 21 января, 2016 пользователем dermitay 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
35aleks Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 может кто подсказать как сделать ?есть код который определяет уровниur=0; if(((Close[1]=ur_h1-urpr*Point)) ||((Low[1]=ur_h1-urpr*Point))) ur=3; if(((Close[1]=ur_h4-urpr*Point)) ||((Low[1]=ur_h4-urpr*Point))) ur=4; if(((Close[1]=ur_d1-urpr*Point)) ||((Low[1]=ur_d1-urpr*Point))) ur=5;все работает прекрасно, но он видит только текущий уровень как сделать что бы видел 10 прошлых уровней я думал через массив 2-мерныйurarr[10][4];10 - это ID4 - это 4 параметра уровняпонимаю как должно быть но не пойму как написать Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Зачем Вам 2-мерный массив? имхо хватит 1-мерного - Вы же всегда на 1 свече определяете уровень, он может иметь номер (3,4,5) или может остаться = 0 - вот этот номер и пишите в ячейку массива. Только с массивами осторожнее - там надо-бы его объявить как тайм-серию, хотя настаивать не буду - Вам виднее.Или Вы только значения больше 0 будете туда писать? - тогда нужен 2-мерный массив, чтоб записывать время бара и номер уровня, или 2 1-мерных - чтоб не путаться. №бара писать не советую - они меняются. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viper Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: manaosma1.pngOsMA_MA.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viper Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Спойлер Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике. То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять? SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду? Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Спойлер Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике. То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять? SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду? Можно и так сделать. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viper Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Спойлер Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике. То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять? SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду? Можно и так сделать. уже пробовала: вообще линии тогда нет. Получается, что у меня в самом расчёте этой функции наложенной МА ошибка и она не отрисовывается, а когда я буферы "путаю" эта вторая линия что-то другое рисует? Спойлер #property copyright "2005-2014, MetaQuotes Software Corp."#property link "http://www.mql4.com"#property description "Moving Averages of Oscillator"#property strict#include //--- indicator settings#property indicator_separate_window // индюк в подвале#property indicator_buffers 2 // буфер на выходе один #property indicator_color1 Silver // цвет первой линии серебро#property indicator_width1 2 // толщина первой линии 2#property indicator_color2 Red // цвет первой линии #property indicator_width2 2 // толщина первой линии 2//--- indicator parametersinput int InpFastEMA=12; // Fast EMA Periodinput int InpSlowEMA=26; // Slow EMA Periodinput int InpSignalSMA=9; // Signal SMA Periodinput int MAPeriod=5;input int MAMethod=1;input int MAShift =0;//--- indicator buffersdouble ExtOsmaBuffer[]; // задаём буфер double ExtMacdBuffer[];double ExtSignalBuffer[];double MA[];//--- right input parameters flagbool ExtParameters=false;//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit(void) {//--- 2 additional buffers are used for counting. IndicatorBuffers(4); // задаётся 3 буфера уже в коде//--- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии) SetIndexDrawBegin(0,InpSignalSMA); // устанавиливает порядковый номер бара от начала данных, с которого длжна отрисовываться указанная линия (номер лини, с периода сигнал. SMA) SetIndexStyle(1,DRAW_LINE); // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии) SetIndexDrawBegin(1,0); IndicatorDigits(Digits+2);//--- 3 indicator buffers mapping SetIndexBuffer(0,ExtOsmaBuffer); // связывает индикаторный буфер с массивом ( номер инди буфера, массив который прикрепляется) SetIndexBuffer(2,ExtMacdBuffer); SetIndexBuffer(3,ExtSignalBuffer); SetIndexBuffer(1,MA);//--- name for DataWindow and indicator subwindow label IndicatorShortName("OsMA("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+") MA("+IntegerToString(MAPeriod)+","+IntegerToString(MAMethod)+","+IntegerToString(MAShift)+")");//--- check for input parameters if(InpFastEMA=InpSlowEMA) { Print("Wrong input parameters"); ExtParameters=false; return(INIT_FAILED); } else ExtParameters=true;//--- initialization done return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Moving Average of Oscillator |//+------------------------------------------------------------------+int OnCalculate (const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { int i,limit;//--- if(rates_total return(0); // тогда возврат 0//--- last counted bar will be recounted limit=rates_total-prev_calculated; // "количество баров, доступных индикатору для расчета" минус "значение, которое вернула функция OnCalculate() на предыдущем вызове" if(prev_calculated>0) limit++;//--- macd counted in the 1-st buffer for(i=0; i ExtMacdBuffer=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);//--- signal line counted in the 2-nd buffer SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);//--- main loop for(i=0; i ExtOsmaBuffer=ExtMacdBuffer-ExtSignalBuffer;//--- donefor (i = limit; i >= 0; i--) // Проходим по графику слева направо MA = iMAOnArray(ExtOsmaBuffer, 0, MAPeriod, MAShift, MAMethod, i);// Рассчитываем среднее return(0); }//+------------------------------------------------------------------+ Изменено 23 января, 2016 пользователем Viper Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Спойлер Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике. То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять? SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду? Можно и так сделать. уже пробовала: вообще линии тогда нет. Получается, что у меня в самом расчёте этой функции наложенной МА ошибка и она не отрисовывается, а когда я буферы "путаю" эта вторая линия что-то другое рисует? Спойлер #property copyright "2005-2014, MetaQuotes Software Corp."#property link "http://www.mql4.com"#property description "Moving Averages of Oscillator"#property strict#include //--- indicator settings#property indicator_separate_window // индюк в подвале#property indicator_buffers 2 // буфер на выходе один #property indicator_color1 Silver // цвет первой линии серебро#property indicator_width1 2 // толщина первой линии 2#property indicator_color2 Red // цвет первой линии #property indicator_width2 2 // толщина первой линии 2//--- indicator parametersinput int InpFastEMA=12; // Fast EMA Periodinput int InpSlowEMA=26; // Slow EMA Periodinput int InpSignalSMA=9; // Signal SMA Periodinput int MAPeriod=5;input int MAMethod=1;input int MAShift =0;//--- indicator buffersdouble ExtOsmaBuffer[]; // задаём буфер double ExtMacdBuffer[];double ExtSignalBuffer[];double MA[];//--- right input parameters flagbool ExtParameters=false;//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit(void) {//--- 2 additional buffers are used for counting. IndicatorBuffers(4); // задаётся 3 буфера уже в коде//--- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии) SetIndexDrawBegin(0,InpSignalSMA); // устанавиливает порядковый номер бара от начала данных, с которого длжна отрисовываться указанная линия (номер лини, с периода сигнал. SMA) SetIndexStyle(1,DRAW_LINE); // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии) SetIndexDrawBegin(1,0); IndicatorDigits(Digits+2);//--- 3 indicator buffers mapping SetIndexBuffer(0,ExtOsmaBuffer); // связывает индикаторный буфер с массивом ( номер инди буфера, массив который прикрепляется) SetIndexBuffer(2,ExtMacdBuffer); SetIndexBuffer(3,ExtSignalBuffer); SetIndexBuffer(1,MA);//--- name for DataWindow and indicator subwindow label IndicatorShortName("OsMA("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+") MA("+IntegerToString(MAPeriod)+","+IntegerToString(MAMethod)+","+IntegerToString(MAShift)+")");//--- check for input parameters if(InpFastEMA=InpSlowEMA) { Print("Wrong input parameters"); ExtParameters=false; return(INIT_FAILED); } else ExtParameters=true;//--- initialization done return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Moving Average of Oscillator |//+------------------------------------------------------------------+int OnCalculate (const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { int i,limit;//--- if(rates_total return(0); // тогда возврат 0//--- last counted bar will be recounted limit=rates_total-prev_calculated; // "количество баров, доступных индикатору для расчета" минус "значение, которое вернула функция OnCalculate() на предыдущем вызове" if(prev_calculated>0) limit++;//--- macd counted in the 1-st buffer for(i=0; i ExtMacdBuffer=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);//--- signal line counted in the 2-nd buffer SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);//--- main loop for(i=0; i ExtOsmaBuffer=ExtMacdBuffer-ExtSignalBuffer;//--- donefor (i = limit; i >= 0; i--) // Проходим по графику слева направо MA = iMAOnArray(ExtOsmaBuffer, 0, MAPeriod, MAShift, MAMethod, i);// Рассчитываем среднее return(0); }//+------------------------------------------------------------------+ Замените цикл:for (i = limit; i >= 0; i--) // Проходим по графику слева направонаfor(i=0; i 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viper Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Спойлер Спойлер Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;) Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...Вверху наложенная, внизу встроенная в код: Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике. То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять? SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду? Можно и так сделать. уже пробовала: вообще линии тогда нет. Получается, что у меня в самом расчёте этой функции наложенной МА ошибка и она не отрисовывается, а когда я буферы "путаю" эта вторая линия что-то другое рисует? Спойлер #property copyright "2005-2014, MetaQuotes Software Corp."#property link "http://www.mql4.com"#property description "Moving Averages of Oscillator"#property strict#include //--- indicator settings#property indicator_separate_window // индюк в подвале#property indicator_buffers 2 // буфер на выходе один #property indicator_color1 Silver // цвет первой линии серебро#property indicator_width1 2 // толщина первой линии 2#property indicator_color2 Red // цвет первой линии #property indicator_width2 2 // толщина первой линии 2//--- indicator parametersinput int InpFastEMA=12; // Fast EMA Periodinput int InpSlowEMA=26; // Slow EMA Periodinput int InpSignalSMA=9; // Signal SMA Periodinput int MAPeriod=5;input int MAMethod=1;input int MAShift =0;//--- indicator buffersdouble ExtOsmaBuffer[]; // задаём буфер double ExtMacdBuffer[];double ExtSignalBuffer[];double MA[];//--- right input parameters flagbool ExtParameters=false;//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit(void) {//--- 2 additional buffers are used for counting. IndicatorBuffers(4); // задаётся 3 буфера уже в коде//--- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии) SetIndexDrawBegin(0,InpSignalSMA); // устанавиливает порядковый номер бара от начала данных, с которого длжна отрисовываться указанная линия (номер лини, с периода сигнал. SMA) SetIndexStyle(1,DRAW_LINE); // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии) SetIndexDrawBegin(1,0); IndicatorDigits(Digits+2);//--- 3 indicator buffers mapping SetIndexBuffer(0,ExtOsmaBuffer); // связывает индикаторный буфер с массивом ( номер инди буфера, массив который прикрепляется) SetIndexBuffer(2,ExtMacdBuffer); SetIndexBuffer(3,ExtSignalBuffer); SetIndexBuffer(1,MA);//--- name for DataWindow and indicator subwindow label IndicatorShortName("OsMA("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+") MA("+IntegerToString(MAPeriod)+","+IntegerToString(MAMethod)+","+IntegerToString(MAShift)+")");//--- check for input parameters if(InpFastEMA=InpSlowEMA) { Print("Wrong input parameters"); ExtParameters=false; return(INIT_FAILED); } else ExtParameters=true;//--- initialization done return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Moving Average of Oscillator |//+------------------------------------------------------------------+int OnCalculate (const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { int i,limit;//--- if(rates_total return(0); // тогда возврат 0//--- last counted bar will be recounted limit=rates_total-prev_calculated; // "количество баров, доступных индикатору для расчета" минус "значение, которое вернула функция OnCalculate() на предыдущем вызове" if(prev_calculated>0) limit++;//--- macd counted in the 1-st buffer for(i=0; i ExtMacdBuffer=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);//--- signal line counted in the 2-nd buffer SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);//--- main loop for(i=0; i ExtOsmaBuffer=ExtMacdBuffer-ExtSignalBuffer;//--- donefor (i = limit; i >= 0; i--) // Проходим по графику слева направо MA = iMAOnArray(ExtOsmaBuffer, 0, MAPeriod, MAShift, MAMethod, i);// Рассчитываем среднее return(0); }//+------------------------------------------------------------------+ Замените цикл:for (i = limit; i >= 0; i--) // Проходим по графику слева направонаfor(i=0; i Ураа! >:d Спойлер этож надо так тупить! :d manaosma2.png 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
35aleks Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Зачем Вам 2-мерный массив? имхо хватит 1-мерного - Вы же всегда на 1 свече определяете уровень, он может иметь номер (3,4,5) или может остаться = 0 - вот этот номер и пишите в ячейку массива. Только с массивами осторожнее - там надо-бы его объявить как тайм-серию, хотя настаивать не буду - Вам виднее.Или Вы только значения больше 0 будете туда писать? - тогда нужен 2-мерный массив, чтоб записывать время бара и номер уровня, или 2 1-мерных - чтоб не путаться. №бара писать не советую - они меняются. У меня в массиве должно быть как минимум 2 цены хай и Лоу относящиеся к одному уровню а их минимум 10 уровнейэто получиться с простым массивом Ссылка на сообщение Поделиться на другие сайты More sharing options...
MadBob Опубликовано 23 января, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 января, 2016 Если еще планируется выпуск новых уроков, было бы очень интересно узнать как написать, советник, который будет входить в положительный замок, например, после того как первый ордер достиг определенного уровня прибыли. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти