- [Архив!] Напишу любого эксперта или индикатор бесплатно.
- Спасите помогите кто может с советником SimpleMACD
- Цветовой градиент
Здравствуйте, помогите разобраться что я не так сделал. Не удаётся покрасить гисторграмму. Код прописал вроде верно, но что-то не так. Вот мой MACD:
Спасибо, поставил, но чего-то всё-равно не хватает
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtSignalBuffer2,INDICATOR_DATA);
SetIndexBuffer(3,ExtMACDColor,INDICATOR_COLOR_INDEX);
Нужно изменить последовательность индексации буферов. Буфер цвета должен идти сразу же за буфером значений соответствующей граф. серии.
Да, вставляйте код прямо на форум через кнопку SRC, чтобы каждый раз не скачивать файл.
Благодарю за помощь.
Теперь всё заработало.
А можно последний вопрос? Я всё пытаюсь привязать к MACD осциллятор Volatility FBA NR чтобы тот показывал перекупленнось\перепроданость на макди другим цветом при достижение границы. На mq4 у меня был рабочий вариант.
iCustom(NULL,0,"_MACD_Xtr",FastMA,SlowMA,SignalSMA1,SignalSMA2,Source,SourcePeriod,FrontPeriod,xVolatility,Sens, N,i);
*/
#property indicator_separate_window // в окне индикатора
#property indicator_buffers 8
#property indicator_color1 RoyalBlue //
#property indicator_color2 Crimson // скользящая средняя симпл
#property indicator_color3 RoyalBlue // скользящая средняя симпл
#property indicator_color4 Lime // уровень ПК
#property indicator_color5 Crimson // уровень ПП
#property indicator_color6 Lime // бар в зоне ПК
#property indicator_color7 Crimson // бар в зоне ПП
// входные параметры
// MACD
extern int FastMA=5; // период быстрой EMA
extern int SlowMA=13; // период медленной EMA
// Скользящие средние cимпл
extern int SignalSMA1=5;
extern int SignalSMA2=34;
// волатильность
extern int Source=1; // источник: 0 - объем, 1 - ATR, 2 - ст.девиация
extern int SourcePeriod=5; // период источника
// сигнальная
double FrontPeriod=1; // период сглаживания фронта; м.б. <1
extern double BackPeriod=444; // период сглаживания затухания; м.б. <1
// уровни ПК/ПП
extern double xVolatility=0.5;
extern double Sens=0; // порог чувствительности в пп. или в тиках (для объема)
extern bool SoundON=false;
int History=0; // кол-во баров предыстории; 0 - все
// инд.буферы
double MACD[], // MACD
SMAI[], // Скользящая средняя cимпл
SMAII[], // Скользящая средняя cимпл
OB[], // уровень ПК
OS[], // уровень ПП
OBH[], // бар в зоне ПК
OSH[]; // бар в зоне ПП
// общие (глобальные) переменные
bool first=1; // флаг первого запуска
double sens; // порог чувствительности в ценах
// Сигнал уведомления
#define SIGNAL_BAR 1
// инициализация
int init()
{
first=1;
sens=Sens*Point; // порог чувствительности в ценах
string _md="MACD("+FastMA+","+SlowMA+","+SignalSMA1+","+SignalSMA2+")";
SetIndexBuffer(0,MACD);
SetIndexStyle(0,DRAW_HISTOGRAM,0);
SetIndexLabel(0,_md);
SetIndexBuffer(1,SMAI);
SetIndexStyle(1,DRAW_LINE,0,2);
SetIndexLabel(1,"SMAS");
SetIndexBuffer(2,SMAII);
SetIndexStyle(2,DRAW_LINE,0,2);
SetIndexLabel(2,"SMAL");
SetIndexBuffer(3,OB);
SetIndexStyle(3,DRAW_LINE,2);
SetIndexLabel(3,"OB");
SetIndexBuffer(4,OS);
SetIndexStyle(4,DRAW_LINE,2);
SetIndexLabel(4,"OS");
SetIndexBuffer(5,OBH);
SetIndexStyle(5,DRAW_HISTOGRAM,0,2);
SetIndexLabel(5,"Peak");
SetIndexBuffer(6,OSH);
SetIndexStyle(6,DRAW_HISTOGRAM,0,2);
SetIndexLabel(6,"Trough");
if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0);
// чувствительность
if(Sens>0) string _src=DoubleToStr(Sens,1)+" ";
// источник
switch(Source) {
case 0: _src=_src+"Volume"; break; // объем
case 1: _src=_src+"ATR"; break; // ATR
case 2: _src=_src+"StDev"; // ст.девиация
}
_src=_src+"("+SourcePeriod+","+_bk+")";
IndicatorShortName(_md+" "+_src);
return(0);
}
// ф-я дополнительной инициализации
int reinit()
{
ArrayInitialize(MACD,0.0); // обнуление массива
ArrayInitialize(SMAI,0.0); // обнуление массива
ArrayInitialize(OB,0.0); // обнуление массива
ArrayInitialize(OS,0.0); // обнуление массива
ArrayInitialize(OBH,0.0); // обнуление массива
ArrayInitialize(OSH,0.0); // обнуление массива
return(0);
}
int start()
{
int ic=IndicatorCounted();
if(!first && Bars-ic-1>1) ic=reinit(); // если есть пропущенные бары не на подключении - пересчет
bool ic0=ic==0; // флаг пересчета
int limit=Bars-ic-1; // кол-во пересчетов
if(History!=0 && limit>History) limit=History-1; // кол-во пересчетов по истории
for(int i=limit; i>=0; i--) { // цикл пересчета по ВСЕМ барам
double macd=iMACD(NULL,0,FastMA,SlowMA,1,0, 0,i);
MACD[i]=macd;
double SMA1=iMAOnArray(MACD,Bars,SignalSMA1,0,MODE_SMA,i);
SMAI[i]=SMA1;
double SMA2=iMAOnArray(MACD,Bars,SignalSMA2,0,MODE_SMA,i);
SMAII[i]=SMA2;
double vlt=xVolatility*iCustom(NULL,0,"Volatility FBA NR",Source,SourcePeriod,FrontPeriod,BackPeriod,0, 1,i);
double lev=MathMax(sens,vlt);
OB[i]=lev; OS[i]=-lev;
if(macd> lev) OBH[i]=macd; else OBH[i]=0;
if(macd<-lev) OSH[i]=macd; else OSH[i]=0;
}
first=0; // сброс флага первого цикла
//---- Сигнал уведомления
static int PrevSignal = 0, PrevTime = 0;
if(SIGNAL_BAR > 0 && Time[0] <= PrevTime )
return(0);
PrevTime = Time[0];
if(PrevSignal <= 0)
{
if(MACD[SIGNAL_BAR] - MACD[SIGNAL_BAR+1] > 0)
{
PrevSignal = 1;
if (SoundON) PlaySound ("alert.wav");
}
}
if(PrevSignal >= 0)
{
if(MACD[SIGNAL_BAR+1] - MACD[SIGNAL_BAR] > 0)
{
PrevSignal = -1;
if (SoundON) PlaySound ("alert.wav");
}
}
return(0);
}
Но вот как это сделать в mql5? Мне бы хотя бы пример кодовой части подсказать, а то в mql5 я плохо разбираюсь.
Сам Volatility прикреплю ниже на всякий случай. Он уже переделан под mql5.
Благодарю за помощь.
Теперь всё заработало.
А можно последний вопрос? Я всё пытаюсь привязать к MACD осциллятор Volatility FBA NR чтобы тот показывал перекупленнось\перепроданость на макди другим цветом при достижение границы. На mq4 у меня был рабочий вариант.
- www.mql5.com
[spoiler]
//| MACD.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 11
#property indicator_plots 7
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_COLOR_HISTOGRAM
#property indicator_type4 DRAW_HISTOGRAM
#property indicator_type5 DRAW_HISTOGRAM
#property indicator_type6 DRAW_LINE
#property indicator_type7 DRAW_LINE
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White, LimeGreen, DarkGreen, Maroon, Red
#property indicator_color4 Blue
#property indicator_color5 Blue
#property indicator_color6 Blue
#property indicator_color7 Blue
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 2
#property indicator_width7 2
#property indicator_label1 "Скользящая"
#property indicator_label2 "Скользящая+"
#property indicator_label3 "MACD"
#property indicator_label4 "ПК"
#property indicator_label5 "ПП"
#property indicator_label6 "Уровень ПК"
#property indicator_label7 "Уровень ПП"
//--- входные параметры
input int InpFastEMA=5; // Fast EMA period
input int InpSlowEMA=13; // Slow EMA period
input int InpSignalSMA=5; // Signal SMA period
input int InpSignalSMA2=34; // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- волатильность
input int Source=1; // источник: 0 - объем, 1 - ATR, 2 - ст.девиация
input int SourcePeriod=5; // период источника
//--- сигнальная линия
input double FrontPeriod=1; // период сглаживания фронта; м.б. <1
input double BackPeriod=444; // период сглаживания затухания; м.б. <1
//--- уровни ПК/ПП
input double xVolatility=0.5;
input double Sens=0; // порог чувствительности в пп. или в тиках (для объема)
//--- indicator buffers
double ExtSignalBuffer[];
double ExtSignalBuffer2[];
double ExtMacdBuffer[];
double ExtMACDColor[];
double OBH[];
double OSH[];
double OB[];
double OS[];
double VolatilityBuffer[];
double ExtFastMaBuffer[];
double ExtSlowMaBuffer[];
//--- MA handles
int ExtFastMaHandle;
int ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtSignalBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,ExtMacdBuffer,INDICATOR_DATA);
SetIndexBuffer(3,ExtMACDColor,INDICATOR_COLOR_INDEX);
SetIndexBuffer(4,OBH,INDICATOR_DATA);
SetIndexBuffer(5,OSH,INDICATOR_DATA);
SetIndexBuffer(6,OB,INDICATOR_DATA);
SetIndexBuffer(7,OS,INDICATOR_DATA);
SetIndexBuffer(8,VolatilityBuffer,INDICATOR_DATA);
SetIndexBuffer(9,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(10,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpFastEMA)+","+string(InpSlowEMA)+","+string(InpSignalSMA)+","+string(InpSignalSMA)+")");
//--- получение хэндлов
ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);
ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_EMA,InpAppliedPrice);
//---а это как вписать?
if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0);
// чувствительность
if(Sens>0) string _src=DoubleToStr(Sens,1)+" ";
//---------------------
Volatility_Handle=iCustom(NULL,0,"Examples\\Volatility FBA NR",
Volume,
ATR,
STDEV,
);
Print("Volatility_Handle = ",Volatility_Handle," error = ",GetLastError());
//---и это?
double lev=MathMax(sens,vlt);
OB[i]=lev; OS[i]=-lev;
//--- инициализация закончена
}
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence |
//+------------------------------------------------------------------+
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[])
{
//--- скопируем значения индикатора Volatility FBA NR в наш индикаторный буфер
int copy=CopyBuffer(Volatility_Handle,0,0,rates_total,VolatilityBuffer);
Print("copy =",copy," rates_total =",rates_total);
//--- если попытка неудачная - сообщим об этом
if(copy<=0)
Print("Неудачная попытка получить значения индикатора Volatility FBA NR");
//--- return value of prev_calculated for next call
//--- check for data
if(rates_total<InpSignalSMA)
return(0);
//--- not all data may be calculated
int calculated=BarsCalculated(ExtFastMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
calculated=BarsCalculated(ExtSlowMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
//--- we can copy not all data
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//--- get Fast EMA buffer
if(IsStopped()) return(0); //Checking for stop flag
if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
{
Print("Getting fast EMA is failed! Error",GetLastError());
return(0);
}
//--- get SlowSMA buffer
if(IsStopped()) return(0); //Checking for stop flag
if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
{
Print("Getting slow SMA is failed! Error",GetLastError());
return(0);
}
//---
int limit;
if(prev_calculated==0)
limit=0;
else limit=prev_calculated-1;
//--- calculate MACD
for(int i=limit;i<rates_total && !IsStopped();i++)
{
ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
if(ExtMacdBuffer[i] > lev) OBH[i]=ExtMacdBuffer[i]; else OBH[i]=0;
if(ExtMacdBuffer[i] < -lev) OSH[i]=ExtMacdBuffer[i]; else OSH[i]=0;
if(ExtMacdBuffer[i] > 0)
{
if(ExtMacdBuffer[i] > ExtMacdBuffer[i-1])
ExtMACDColor[i] = 1;
else
ExtMACDColor[i] = 2;
}
else if(ExtMacdBuffer[i] < 0)
{
if(ExtMacdBuffer[i] < ExtMacdBuffer[i-1])
ExtMACDColor[i] = 3;
else
ExtMACDColor[i] = 4;
}
else
ExtMACDColor[i] = 0;
}
//--- calculate Signal
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA2,ExtMacdBuffer,ExtSignalBuffer2);
//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+
[/spoiler]
Как всегда где-то запряталась ошибка.
А как мне это вписать в индикатор? И нужно ли делать обнуление массивов?
if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0);
// чувствительность
if(Sens>0) string _src=DoubleToStr(Sens,1)+" ";
//---------------------
double lev=MathMax(sens,vlt);
OB[i]=lev; OS[i]=-lev;
//--- инициализация закончена
Далее я попытался присоединить код для отображения ПП\ПК другим цветом на макди, причем так, чтоб он не мешал работе 4ёхцветного макди(т.е в зоне ПП\ПК гистограмма отображается только синим, а не 4ёхцветом). Вот что у меня получилось:
for(int i=limit;i<rates_total && !IsStopped();i++)
{
ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
if(ExtMacdBuffer[i] > lev) OBH[i]=ExtMacdBuffer[i]; else OBH[i]=0;
if(ExtMacdBuffer[i] < -lev) OSH[i]=ExtMacdBuffer[i]; else OSH[i]=0;
if(ExtMacdBuffer[i] > 0)
{
if(ExtMacdBuffer[i] > ExtMacdBuffer[i-1])
ExtMACDColor[i] = 1;
else
ExtMACDColor[i] = 2;
}
else if(ExtMacdBuffer[i] < 0)
{
if(ExtMacdBuffer[i] < ExtMacdBuffer[i-1])
ExtMACDColor[i] = 3;
else
ExtMACDColor[i] = 4;
}
else
ExtMACDColor[i] = 0;
}
Похоже я много допустил ошибок, подскажите пожалуйста что мне нужно исправить?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования