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

От xbms, 13 апреля, 2013 в Уголок Программиста

#3026
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

#3027

Спасибо. Разобрался. Все заработало как надо.

#3028

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

Изменено 20 января, 2016 пользователем Stanislava

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

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

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

#3031

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

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

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

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


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

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

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


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

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

Спойлер


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


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

Изменено 20 января, 2016 пользователем Stanislava

#3034

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

#3035

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

#3036


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



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

http://docs.mql4.com/ru/constants/objectconstants/enum_object/obj_button
#3037



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


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

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


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

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

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

это стандартные функции, используемые в коде, но вы, как я понимаю, не за этим же пришли?))

Изменено 20 января, 2016 пользователем dermitay

#3038

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

#3039


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



а, да...
ну почитай вот это.
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

#3040

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

#3041

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

#3042

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

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

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

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

manaosma1.png
OsMA_MA.mq411 скач.

#3043


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

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

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

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



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


Спойлер


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

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

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

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



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


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

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

#3045



Спойлер


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

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

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

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



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


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

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


Можно и так сделать.
#3046


Спойлер




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

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию 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);
}
//+------------------------------------------------------------------+

Изменено 23 января, 2016 пользователем Viper

#3047



Спойлер




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

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию 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
#3048


Спойлер



Спойлер




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

Я не могу понять (а очень хочется) почему средняя встроенная в код через функцию 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

#3049


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


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

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025