Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привет,
Давно меня здесь не было...
Я работаю над идеей советника, мне нужно добавить индикатор, но я не знаю, как включить его в советник, не могли бы вы мне помочь?
Индикатор - Slope Directional Line, я хочу, чтобы он работал на дневном графике и запускал ордера на графике нижнего ТФ, код индикатора такой:
//+------------------------------------------------------------------+
//| slope directional line D.L.M.mq4 |
//| DANIEL LUCHINGER 2014 |
//| MQL5: автоматическая торговля на форекс, тестер стратегий и пользовательские индикаторы с MetaTrader | //| MQL5: автоматическая торговля на форекс, тестер стратегий и пользовательские индикаторы.
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 3
#property indicator_color2 Red
#property indicator_color2 Red #property indicator_width2 3
//---- входные параметры
extern int period=14;
extern int method=3; // MODE_SMA
extern int price=0; // PRICE_CLOSE
//---- буферы
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[];
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
SetIndexBuffer(0, Uptrend);
SetIndexBuffer(1, Dntrend);
SetIndexBuffer(2, ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer, true);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
IndicatorShortName("Линия направления склона");
return(0);
}
//+------------------------------------------------------------------+
//| Пользовательская функция деинициализации индикатора.
//+------------------------------------------------------------------+
int deinit(){return(0);}
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
//+------------------------------------------------------------------+
//| Пользовательская итерационная функция индикатора |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;
double vect[], trend[];
if(e > Bars)
e = Bars;
ArrayResize(vect, e);
ArraySetAsSeries(vect, true);
ArrayResize(trend, e);
ArraySetAsSeries(trend, true);
for(x = 0; x < e; x++)
{
vect[x] = 2*WMA(x, period/2) - WMA(x, period);
}
for(x = 0; x < e-period; x++)
ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);
for(x = e-period; x >= 0; x--)
{
trend[x] = trend[x+1];
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
if (trend[x]>0)
{ Uptrend[x] = ExtMapBuffer[x];
if (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];
Dntrend[x] = EMPTY_VALUE;
}
else
if (trend[x]<0)
{
Dntrend[x] = ExtMapBuffer[x];
if (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];
Uptrend[x] = EMPTY_VALUE;
}
}
return(0);
---------------
--------------
Я закодировал следующим образом:
double UpTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,0,1); // где 0 = UptrendBuffer
double DnTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,1,1); // где 1 = DntrendBuffer
double _sl = 0,_tp = 0;
{
if(haMode == 0 || haMode == 1)
{
if(UpTrend)
{label("LONG Condition OK");
if(Close[0] >= srDown && Close[0] < srUp)
//if(StopLoss > 0) _sl = Ask - StopLoss;
_sl = srDownHT-StopLossShift;
if(TakeProfit > 0) _tp = Ask + TakeProfit;
if(tt && orders<MaxTrades)
{
openOrder(getLots(),MagicNumber,OP_BUY, _sl,_tp);
}
}}
}
}
Кто-нибудь может меня поправить, пожалуйста, потому что я уверен, что это не работает.
Спасибо
Daniel1983
Большое спасибо Mistertools за помощь.
Но ...
То, что я хочу сделать, это применить скользящую среднюю к #_FullSSA_normalize correct mtf nmc.
Это работает без проблем, когда я делаю это на M5 обычным способом с помощью MA из MT4.
Это единственное, что я использую из МТ4...
На M1 это иногда работает, иногда нет. Возможно, это связано с настройками.
Просто посмотрите на картинку, SSA в порядке, но не MA...
Я пытался сделать это сам, но это слишком сложно для меня, хотя я получил только две ошибки, после "моей работы" ...
Наверное, мне повезло, но, тем не менее, SSA сработал без проблем, но MA нигде не было видно.
Конечно, SSA - это элитный .....
который я купил некоторое время назад, и он того стоит...
Здравствуйте,
Давно меня здесь не было...
Я работаю над идеей советника, мне нужно добавить индикатор, но я не знаю, как включить его в советник, не могли бы вы мне помочь?
Индикатор - Slope Directional Line, я хочу, чтобы он работал на дневном графике и запускал ордера на графике нижнего ТФ, код индикатора такой:
//+------------------------------------------------------------------+
//| slope directional line D.L.M.mq4 |
//| DANIEL LUCHINGER 2014 |
//| MQL5: автоматическая торговля на форекс, тестер стратегий и пользовательские индикаторы с MetaTrader | //| MQL5: автоматическая торговля на форекс, тестер стратегий и пользовательские индикаторы.
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 3
#property indicator_color2 Red
#property indicator_color2 Red #property indicator_width2 3
//---- входные параметры
extern int period=14;
extern int method=3; // MODE_SMA
extern int price=0; // PRICE_CLOSE
//---- буферы
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[];
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
SetIndexBuffer(0, Uptrend);
SetIndexBuffer(1, Dntrend);
SetIndexBuffer(2, ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer, true);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
IndicatorShortName("Линия направления склона");
return(0);
}
//+------------------------------------------------------------------+
//| Пользовательская функция деинициализации индикатора.
//+------------------------------------------------------------------+
int deinit(){return(0);}
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}
//+------------------------------------------------------------------+
//| Пользовательская итерационная функция индикатора |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;
double vect[], trend[];
if(e > Bars)
e = Bars;
ArrayResize(vect, e);
ArraySetAsSeries(vect, true);
ArrayResize(trend, e);
ArraySetAsSeries(trend, true);
for(x = 0; x < e; x++)
{
vect[x] = 2*WMA(x, period/2) - WMA(x, period);
}
for(x = 0; x < e-period; x++)
ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);
for(x = e-period; x >= 0; x--)
{
trend[x] = trend[x+1];
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
if (trend[x]>0)
{ Uptrend[x] = ExtMapBuffer[x];
if (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];
Dntrend[x] = EMPTY_VALUE;
}
else
if (trend[x]<0)
{
Dntrend[x] = ExtMapBuffer[x];
if (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];
Uptrend[x] = EMPTY_VALUE;
}
}
return(0);
---------------
--------------
Я закодировал следующим образом:
double UpTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,0,1); // где 0 = UptrendBuffer
double DnTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,1,1); // где 1 = DntrendBuffer
double _sl = 0,_tp = 0;
{
if(haMode == 0 || haMode == 1)
{
if(UpTrend)
{label("LONG Condition OK");
if(Close[0] >= srDown && Close[0] < srUp)
//if(StopLoss > 0) _sl = Ask - StopLoss;
_sl = srDownHT-StopLossShift;
if(TakeProfit > 0) _tp = Ask + TakeProfit;
if(tt && orders<MaxTrades)
{
openOrder(getLots(),MagicNumber,OP_BUY, _sl,_tp);
}
}}
}
}
Кто-нибудь может меня поправить, пожалуйста, потому что я уверен, что это не работает.
Спасибо
Даниил1983Это не работает просто потому, что slope directional line - это индикатор перерисовки. Возьмите любой нормальный Hull average ("slope directional line" - это Hull average) и все будет проще.
Спасибо, Младен, я ценю ваше время.
Я нашел в сообщениях о HMA, один, который вы создали с контролем скорости,
Я хотел бы попробовать его в советнике, та же идея, что я хотел с Slope Directional Indicator,
но с этим индикатором HMA, который вы опубликовали "Hull Moving Averages 2.0 &SR lines".
Какой должен быть код для этого, чтобы он работал в моем советнике?
Я написал:
input int IndicatorTF = 1440 //(индикатор в дневном таймфрейме)
input int HMAPeriod = 35; //(позвольте мне изменить эти параметры)
input ENUM_HMAPrice = PRICE_CLOSE; //(позвольте мне изменить эти параметры)
input int HMASpeed = 2.0; //(позвольте мне изменить эти параметры)
double trendUp = iCustom(Symbol(),IndicatorTF, "Hull moving average 2.0 & sr lines",HMAPeriod,ENUM_HMAPrice,HMASpeed,0,0);
double trendDn = iCustom(Symbol(),IndicatorTF, "Hull moving average 2.0 & sr lines",HMAPeriod,ENUM_HMAPrice,HMASpeed,1,0);
if(trendUp > 0)
{
Открыть покупку
}
Код индикатора:
//+------------------------------------------------------------------+
//| Hull moving average |
//| mladen |
//+------------------------------------------------------------------+
#property copyright"www.forex-tsd.com"
#property link "www.forex-tsd.com"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LimeGreen
#property indicator_color2 PaleVioletRed
#property indicator_color3 PaleVioletRed
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//
//
//
//
//
extern string TimeFrame = "Текущий временной интервал";
extern int HMAPeriod = 35;
extern int HMAPrice = PRICE_CLOSE;
extern double HMASpeed = 2.0;
extern bool LinesVisible = false;
extern int LinesNumber = 5;
extern color ColorUp = LimeGreen;
extern color ColorDown = PaleVioletRed;
extern string UniqueID = "HullLines1";
extern bool alertsOn = false;
extern bool alertsOnCurrent = true;
extern bool alertsMessage = true;
extern bool alertsSound = false;
extern bool alertsEmail = false;
//
//
//
//
//
double hma[];
double hmada[];
double hmadb[];
double work[];
double trend[];
int HalfPeriod;
int HullPeriod;
string indicatorFileName;
bool returnBars;
bool calculateValue;
int timeFrame;
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
int init()
{
IndicatorBuffers(5);
SetIndexBuffer(0,hma);
SetIndexBuffer(1,hmada);
SetIndexBuffer(2,hmadb);
SetIndexBuffer(3,trend);
SetIndexBuffer(4,work);
//
//
//
//
//
HMAPeriod = MathMax(2,HMAPeriod);
HalfPeriod = MathFloor(HMAPeriod/HMASpeed);
HullPeriod = MathFloor(MathSqrt(HMAPeriod));
indicatorFileName = WindowExpertName();
calculateValue = TimeFrame=="calculateValue"; if (calculateValue) { return(0); }
returnBars = TimeFrame=="returnBars"; if (returnBars) { return(0); }
timeFrame = stringToTimeFrame(TimeFrame);
//
//
//
//
//
IndicatorShortName(timeFrameToString(timeFrame)+" HMA ("+HMAPeriod+")");
return(0);
}
void deinit()
{
deleteLines();
}
void deleteLines()
{
int lookForLength = StringLen(UniqueID);
for (int i= ObjectsTotal()-1; i>=0; i--)
{
string name = ObjectName(i);
if (StringSubstr(name,0,lookForLength)==UniqueID) ObjectDelete(name);
}
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
int start()
{
int i,counted_bars = IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
int limit=MathMin(Bars-counted_bars,Bars-1);
if (returnBars) { hma[0] = MathMin(limit+1,Bars-1); return(0); }
//
//
//
//
//
if (calculateValue || timeFrame == Period())
{
if (trend[limit] == -1) CleanPoint(limit,hmada,hmadb);
for(i=limit; i>=0; i--) work = 2.0*iMA(NULL,0,HalfPeriod,0,MODE_LWMA,HMAPrice,i)-iMA(NULL,0,HMAPeriod,0,MODE_LWMA,HMAPrice,i);
for(i=limit; i>=0; i--)
{
hma = iMAOnArray(work,0,HullPeriod,0,MODE_LWMA,i);
hmada = EMPTY_VALUE;
hmadb = EMPTY_VALUE;
тренд = тренд;
если (hma > hma) тренд = 1;
если (hma < hma) trend = -1;
if (trend == -1) PlotPoint(i,hmada,hmadb,hma);
}
deleteLines();
if (LinesVisible)
{
int k = 0;
for (i=0; i<Bars && k<LinesNumber; i++)
if (trend!=trend)
{
string name = UniqueID+(string)Time;
ObjectCreate(name,OBJ_TREND,0,Time,hma,Time+Period()*60,hma);
if (trend==1)
ObjectSet(name,OBJPROP_COLOR,ColorUp);
else ObjectSet(name,OBJPROP_COLOR,ColorDown);
k++;
}
}
manageAlerts();
return(0);
}
//
//
//
//
//
limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName, "returnBars",0,0)*timeFrame/Period()));
if (trend[limit]==-1) CleanPoint(limit,hmada,hmadb);
for (i=limit; i>=0; i--)
{
int y = iBarShift(NULL,timeFrame,Time);
trend = iCustom(NULL,timeFrame,indicatorFileName, "calculateValue",HMAPeriod,HMAPrice,HMASpeed,LinesVisible,LinesNumber,ColorUp,ColorDown,UniqueID,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,3,y);
hma = iCustom(NULL,timeFrame,indicatorFileName, "calculateValue",HMAPeriod,HMAPrice,HMASpeed,LinesVisible,LinesNumber,ColorUp,ColorDown,UniqueID,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,0,y);
hmada = EMPTY_VALUE;
hmadb = EMPTY_VALUE;
}
for (i=limit;i>=0;i--) if (trend==-1) PlotPoint(i,hmada,hmadb,hma);
return(0);
}
//+-------------------------------------------------------------------
//|
//+-------------------------------------------------------------------
//
//
//
//
//
void manageAlerts()
{
if (alertsOn)
{
if (alertsOnCurrent)
int whichBar = 0;
else whichBar = 1;
if (trend[whichBar] != trend[whichBar+1])
{
if (trend[whichBar] == 1) doAlert(whichBar, "up");
if (trend[whichBar] == -1) doAlert(whichBar, "down");
}
}
}
//
//
//
//
//
void doAlert(int forBar, string doWhat)
{
static string previousAlert="ничего";
static datetime previousTime;
строковое сообщение;
if (previousAlert != doWhat || previousTime != Time[forBar]) {
previousAlert = doWhat;
previousTime = Time[forBar];
//
//
//
//
//
message = Symbol()+" "+timeFrameToString(Period())+" at "+TimeToStr(TimeLocal(),TIME_SECONDS)+" HMA trend changed to "+doWhat;
if (alertsMessage) Alert(message);
if (alertsEmail) SendMail(Symbol()+" HMA ",message);
if (alertsSound) PlaySound("alert2.wav");
}
}
//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
//
//
//
//
//
void CleanPoint(int i,double& first[],double& second[])
{
if ((second != EMPTY_VALUE) && (second != EMPTY_VALUE))
second = EMPTY_VALUE;
иначе
if ((first != EMPTY_VALUE) && (first != EMPTY_VALUE) && (first == EMPTY_VALUE))
first = EMPTY_VALUE;
}
//
//
//
//
//
void PlotPoint(int i,double& first[],double& second[],double& from[])
{
if (first == EMPTY_VALUE)
{
if (first == EMPTY_VALUE) {
first = from;
first = from;
second = EMPTY_VALUE;
}
else {
second = from;
второй = от;
first = EMPTY_VALUE;
}
}
else
{
first = from;
second = EMPTY_VALUE;
}
}
//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
//
//
//
//
//
string sTfTable[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"};
int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};
//
//
//
//
//
int stringToTimeFrame(string tfs)
{
tfs = stringUpperCase(tfs);
for (int i=ArraySize(iTfTable)-1; i>=0; i--)
if (tfs==sTfTable || tfs==""+iTfTable) return(MathMax(iTfTable,Period()));
return(Period());
}
string timeFrameToString(int tf)
{
for (int i=ArraySize(iTfTable)-1; i>=0; i--)
if (tf==iTfTable) return(sTfTable);
return("");
}
//
//
//
//
//
string stringUpperCase(string str)
{
string s = str;
for (int length=StringLen(str)-1; length>=0; length--)
{
int tchar = StringGetChar(s, length);
if((tchar > 96 && tchar 223 && tchar < 256))
s = StringSetChar(s, length, tchar - 32);
else if(tchar > -33 && tchar < 0)
s = StringSetChar(s, length, tchar + 224);
}
return(s);
}
Это не проблема вмешательства другого индикатора (если только вы не используете несколько экземпляров одного и того же индикатора на одном графике). В таком случае это может произойти, так как этот индикатор не предназначен для использования в качестве многоэкземплярного индикатора на одном графике.
Здравствуйте MLaden , спасибо большое, но это не тот случай, когда я использую более одного экземпляра на графике, только один. просто линии смещаются.
Если это не очевидно, не волнуйтесь, я оставлю все как есть, спасибо за ваш вклад! Хорошего дня...
zigflip
Здравствуйте MLaden, спасибо большое, но это не тот случай, когда я использую несколько экземпляров на графике, только один. просто линии сдвигаются.
если это не очевидно, не волнуйтесь, я оставлю все как есть, спасибо за ваш вклад! удачного дня...
zigflipЯ попробовал тот, который я разместил, и они не сдвигаются.
Попробуйте, может это поможет
Как вызвать индикатор HMA в советнике?
double (NULL,0, "HMA",??????)
А условия следующие
if(trendUp) then buy, or if(trendUp =1) then buy or something like this?
спасибо
Как вызвать индикатор HMA в советнике?
double (NULL,0, "HMA",??????)
И условия следующие
if(trendUp) then buy, or if(trendUp =1) then buy or something like this?
спасибоЗависит от параметров индикаторов, но для этого нужно использовать iCustom().
Гораздо больше информации с большим количеством примеров вы можете найти здесь: https: //www.mql5.com/en/forum/173108.
Зависит от параметров индикатора, но для этого нужно использовать iCustom() Гораздо больше информации и довольно много примеров вы можете найти здесь: https: //www.mql5.com/en/forum/173108.
Спасибо за подсказку, я все еще в замешательстве, я нашел индикатор HMA, код которого похож на код наклонной линии, это "HMA_Russian_Color", но у меня все еще есть проблемы с условиями, для фильтрации тренда покупки от тренда продажи.
я написал
double Uptrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0); // где последний 0 = UptrendBuffer
double Dntrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1); // где последний 1 = DntrendBuffer
//период = 20 / тип = 3 / цена = 0 правильно?
if(Uptrend) //Как мне это написать???
{
Open Buy
}
Ордера на покупку все еще открыты, пока HMA нисходящий тренд или красный цвет ...
Пожалуйста, поправьте меня, и или помогите мне исправить это...
Спасибо
Спасибо за подсказку, я все еще в замешательстве, я нашел индикатор HMA, код которого похож на код линии наклона, это "HMA_Russian_Color", но у меня все еще есть проблемы с условиями, для фильтрации тренда покупки от тренда продажи.
я написал
double Uptrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0); // где последний 0 = UptrendBuffer
double Dntrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1); // где последний 1 = DntrendBuffer
//период = 20 / тип = 3 / цена = 0 правильно?
if(Uptrend) //Как мне это написать???
{
Open Buy
}
Ордера на покупку все еще открыты, пока HMA нисходящий тренд или красный цвет ...
Пожалуйста, поправьте меня, и или помогите мне исправить это...
СпасибоДля изменения наклона попробуйте что-то вроде этого:
double previous1 = iCustom(Symbol(),0,"HMA_Russian_Color",20,3,0,1);
double previous2 = iCustom(Symbol(),0,"HMA_Russian_Color",20,3,0,2);
if (current>previous1 && previous1<previous2)
{
// slope changed to up
}
if (currentprevious2)
{
// slope changed to down
}