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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
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(). и если оно больше нуля - ордер не открываем.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Подскажите, если запрограммировано брать цены баров с графика, то выставленный индикатор Heiken Ashi будет влиять или цены будут вычисляться не зависимо от изображения?
И как будут работать советники - индикаторы, когда терминал выдает "Нет цены", т.е. когда в ручную не выставить ордера.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Stanislava, есть основания не верить на 100%, что где-то запрограммировано брать ЦЕНЫ БАРОВ (опен, клоуз, хай, лоу?) именно с графика...
Теоретически это возможно, но такое программируется нечасто.
Скорее всего, у вас неточная или неполная информация - или вы путаете.
Рекомендую перепроверить, еще лучше показать код, чтобы можно было понять о чём вы.

Второй вопрос некорректен: ситуация "нет цены" сама по себе, относится к неудачной попытке выставить конкретный ордер - и ничего не говорит о том, что в рынке и как будут работать неведомые советники и неведомые индикаторы.
Ссылка на сообщение
Поделиться на другие сайты

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

Старик, да у меня неточный вопрос и последующие точными быть не смогут, настолько много не знаю, что точного вопроса не сформулировать.
Интересует сам принцип работы МТ (терминала) и всевозможных утилит. Где и как они берут цены, на основе которых строятся графики и производятся вычисления для дальнейшей визуализации и торговли?
Меня с понедельника на демо-счете достают вылетающие таблички - "Нет цены" при попытке выставить ордер руками. Стало интересно, как такая ситуация влияет на работу утилит. И еще, вчера не стала дописывать, но припомнила, что читала в отзывах об аннулировании сделок по причине "не рыночной котировки". Правильно ли я понимаю, что такая коллизия может возникнуть при использовании отдельных советников?

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

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

Вопросы надо задавать в соответствующих вопросам топиках.
Вообще вам сначала надо почитать побольше - за вас читать не будут и пересказывать вам учебники тоже некому.

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

Так что рекомендую пока сконцентрироваться на чтении учебных материалов - появятся другие вопросы, но вы будете задавать их правильнее и там где надо.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Stanislava принцип такой: в терминал (МТ) приходит котировка по паре. Сначала её получают МТ, потом индюки поставленные вручную (индюк получает не все котировки - ранее было замечено), почти сразу (параллельно с МТ) получают совы, а потом индюки вызываемые в совах. При выставлении ордера хоть совой, хоть руками, корректность сначала проверяется МТ, в МТ есть таймаут валидности котировки - если "очень старая", по мнению МТ, то он пишет нет цены. и надо ждать следующего тика. на евродолларе тики идут чаще, поэтому "нет цены" реже, а на какой-нибудь экзотике - наоборот...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Вопросы надо задавать в соответствующих вопросам топиках.
Вообще вам сначала надо почитать побольше - за вас читать не будут и пересказывать вам учебники тоже некому.

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

Так что рекомендую пока сконцентрироваться на чтении учебных материалов - появятся другие вопросы, но вы будете задавать их правильнее и там где надо.


Не нашла ни учебника, ни соответствующего раздела на форуме. Но с моей т.з. вопросы по теме. В учебнике по МТ по определению не будет главы посвященной умышленному обходу сигналов поставщика котировок или еще какой-то умности, что бы в дальнейшем глядя на код в конкретных строках сразу понимать, что использовать вредно. И не хотелось бы тратить уйму времени на изучение - тесты тучи не эффективного ПО (советники - индикаторы и т.д.)
Фактически, я спросила о самих принципах функционирования специализированных программ, как об их взаимодействии именно с точки зрения программирования, как откуда берут котировки в программах, когда действия выполняются корректно с т.з. поставщика котировок.

Добавлено: 20-01-2016 13:55:48

Спойлер


Stanislava принцип такой: в терминал (МТ) приходит котировка по паре. Сначала её получают МТ, потом индюки поставленные вручную (индюк получает не все котировки - ранее было замечено), почти сразу (параллельно с МТ) получают совы, а потом индюки вызываемые в совах. При выставлении ордера хоть совой, хоть руками, корректность сначала проверяется МТ, в МТ есть таймаут валидности котировки - если "очень старая", по мнению МТ, то он пишет нет цены. и надо ждать следующего тика. на евродолларе тики идут чаще, поэтому "нет цены" реже, а на какой-нибудь экзотике - наоборот...


Спасибо! Может быть за одно подскажите, в терминале возможно выставить Московское время или он хронически будет отставать на час и время придется подгонять в самих утилитах, если они к нему привязаны (новости). Изменено пользователем Stanislava
Ссылка на сообщение
Поделиться на другие сайты

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

Терминал показывает время котирования, которое передаётся брокером вместе с котировкой - его поменять нельзя.
легче переехать в часовой пояс к своему брокеру :d - некоторые так и делают...

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

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

Никак не могу найти толковый сайт, где бы было ясно изложено, как работать с кнопками, то бишь BUTTON. как обрабатывать нажатие на неё. Если кто видел такое - киньте ссылку, плиз!

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

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


Никак не могу найти толковый сайт, где бы было ясно изложено, как работать с кнопками, то бишь BUTTON. как обрабатывать нажатие на неё. Если кто видел такое - киньте ссылку, плиз!



расскажите, а как вы искали? мне просто интересно, даже самая первая ссылка в гугле на официальную документацию даёт вобще ВСЁ о кнопке и готовый код-кирпич со всеми хотелками и пожеланиями.

http://docs.mql4.com/ru/constants/objectconstants/enum_object/obj_button
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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



Терминал показывает время котирования, которое передаётся брокером вместе с котировкой - его поменять нельзя.
легче переехать в часовой пояс к своему брокеру :d - некоторые так и делают...


Не поставить вам + второй раз, не сказать спасибо, я вас просто запомню. )))

ЗЫ Старик, я помню, что сообщения, типа, "все классно" считаются флудом, со всеми вытекающими, но писать в личку благодарности с моей т.з. = набиваться, так-что трите, если так положено. Все классно.)))


а вы в курсе что ордера на бай выставляются по цене Ask, а на селл по цене Bid? и что в терминале рисуются именно цены бид и то что рисуется в терминале и то что дает брокер - это вобще две разные вещи и цифры, которые вы видите не 100% одинаковые? и что цены Ask на истории вы не узнаете никогда? и что сам принцип работы индикаторов и сов различны как небо и земля? вы в курсе что прогон кода советника зачастую идет только по тику от брокера(смотря как написан код), а не постоянно как вы думаете? а вы в курсе что это правило не распространяется на индикаторы и скрипты?

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

ну а про время.
mql4 позволяет "тащить" любое время(типа datetime из которого опять же легко вытащить всё что нужно уже другими функциями):
время брокера - TimeCurrent()
время GMT(зависит от корректности настройки часового пояса локального ПК) - TimeGMT()
локальное время ПК - TimeLocal()

это стандартные функции, используемые в коде, но вы, как я понимаю, не за этим же пришли?)) Изменено пользователем dermitay
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Этот сайт я нашёл в первую очередь - где там обработка нажатия на кнопку?



а, да...
ну почитай вот это.
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 Изменено пользователем dermitay
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

может кто подсказать как сделать ?
есть код который определяет уровни
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 - это ID
4 - это 4 параметра уровня
понимаю как должно быть но не пойму как написать

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

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

Зачем Вам 2-мерный массив? имхо хватит 1-мерного - Вы же всегда на 1 свече определяете уровень, он может иметь номер (3,4,5) или может остаться = 0 - вот этот номер и пишите в ячейку массива. Только с массивами осторожнее - там надо-бы его объявить как тайм-серию, хотя настаивать не буду - Вам виднее.
Или Вы только значения больше 0 будете туда писать? - тогда нужен 2-мерный массив, чтоб записывать время бара и номер уровня, или 2 1-мерных - чтоб не путаться. №бара писать не советую - они меняются.

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

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

Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.

Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...

Вверху наложенная, внизу встроенная в код:

manaosma1.png
OsMA_MA.mq4

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

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


Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.

Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...

Вверху наложенная, внизу встроенная в код:



Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Спойлер


Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.

Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...

Вверху наложенная, внизу встроенная в код:



Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике.


То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять?

SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду?

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

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



Спойлер


Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию iMAOnArray отличается по показаниям от просто навешанной сверху средней.

Я раньше уже так делала с другими индикаторами, а с этим вот чего-то "не пошло" ...

Вверху наложенная, внизу встроенная в код:



Обратите внимание на нумерацию буферов, каким номером идет МА и сколько и какие буферы отрисовываются на графике.


То есть мне нужно массив с МА обязательно ко второму по счёту буферу прикреплять?

SetIndexBuffer(3,MA); 1 поставить и дальше соответствующие исправления по коду?


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

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


Спойлер




Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию 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 parameters
input int InpFastEMA=12; // Fast EMA Period
input int InpSlowEMA=26; // Slow EMA Period
input int InpSignalSMA=9; // Signal SMA Period
input int MAPeriod=5;
input int MAMethod=1;
input int MAShift =0;




//--- indicator buffers
double ExtOsmaBuffer[]; // задаём буфер
double ExtMacdBuffer[];
double ExtSignalBuffer[];
double MA[];
//--- right input parameters flag
bool 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;
//--- done

for (i = limit; i >= 0; i--) // Проходим по графику слева направо
MA = iMAOnArray(ExtOsmaBuffer, 0, MAPeriod, MAShift, MAMethod, i);// Рассчитываем среднее


return(0);
}
//+------------------------------------------------------------------+
Изменено пользователем Viper
Ссылка на сообщение
Поделиться на другие сайты

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



Спойлер




Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию 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 parameters
input int InpFastEMA=12; // Fast EMA Period
input int InpSlowEMA=26; // Slow EMA Period
input int InpSignalSMA=9; // Signal SMA Period
input int MAPeriod=5;
input int MAMethod=1;
input int MAShift =0;




//--- indicator buffers
double ExtOsmaBuffer[]; // задаём буфер
double ExtMacdBuffer[];
double ExtSignalBuffer[];
double MA[];
//--- right input parameters flag
bool 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;
//--- done

for (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
Ссылка на сообщение
Поделиться на другие сайты

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


Спойлер



Спойлер




Прошу помощи в разборе причин некорректной работы индикатора после моей "модификации" ;;)

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию 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 parameters
input int InpFastEMA=12; // Fast EMA Period
input int InpSlowEMA=26; // Slow EMA Period
input int InpSignalSMA=9; // Signal SMA Period
input int MAPeriod=5;
input int MAMethod=1;
input int MAShift =0;




//--- indicator buffers
double ExtOsmaBuffer[]; // задаём буфер
double ExtMacdBuffer[];
double ExtSignalBuffer[];
double MA[];
//--- right input parameters flag
bool 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;
//--- done

for (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
Ссылка на сообщение
Поделиться на другие сайты

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


Зачем Вам 2-мерный массив? имхо хватит 1-мерного - Вы же всегда на 1 свече определяете уровень, он может иметь номер (3,4,5) или может остаться = 0 - вот этот номер и пишите в ячейку массива. Только с массивами осторожнее - там надо-бы его объявить как тайм-серию, хотя настаивать не буду - Вам виднее.
Или Вы только значения больше 0 будете туда писать? - тогда нужен 2-мерный массив, чтоб записывать время бара и номер уровня, или 2 1-мерных - чтоб не путаться. №бара писать не советую - они меняются.


У меня в массиве должно быть как минимум 2 цены хай и Лоу относящиеся к одному уровню а их минимум 10 уровней
это получиться с простым массивом
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Войти

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

Войти

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


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

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