Помощь в кодировании - страница 320

 

Привет,

Давно меня здесь не было...

Я работаю над идеей советника, мне нужно добавить индикатор, но я не знаю, как включить его в советник, не могли бы вы мне помочь?

Индикатор - 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 - это элитный .....

который я купил некоторое время назад, и он того стоит...

Файлы:
ssa.png  72 kb
 
daniel1983:
Здравствуйте,

Давно меня здесь не было...

Я работаю над идеей советника, мне нужно добавить индикатор, но я не знаю, как включить его в советник, не могли бы вы мне помочь?

Индикатор - 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:
Это не проблема вмешательства другого индикатора (если только вы не используете несколько экземпляров одного и того же индикатора на одном графике). В таком случае это может произойти, так как этот индикатор не предназначен для использования в качестве многоэкземплярного индикатора на одном графике.

Здравствуйте MLaden , спасибо большое, но это не тот случай, когда я использую более одного экземпляра на графике, только один. просто линии смещаются.

Если это не очевидно, не волнуйтесь, я оставлю все как есть, спасибо за ваш вклад! Хорошего дня...

zigflip

 
zigflip:
Здравствуйте MLaden, спасибо большое, но это не тот случай, когда я использую несколько экземпляров на графике, только один. просто линии сдвигаются.

если это не очевидно, не волнуйтесь, я оставлю все как есть, спасибо за ваш вклад! удачного дня...

zigflip

Я попробовал тот, который я разместил, и они не сдвигаются.

Попробуйте, может это поможет

 

Как вызвать индикатор HMA в советнике?

double (NULL,0, "HMA",??????)

А условия следующие

if(trendUp) then buy, or if(trendUp =1) then buy or something like this?

спасибо

 
daniel1983:
Как вызвать индикатор 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.

 
mladen:
Зависит от параметров индикатора, но для этого нужно использовать 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 нисходящий тренд или красный цвет ...

Пожалуйста, поправьте меня, и или помогите мне исправить это...

Спасибо

 
daniel1983:
Спасибо за подсказку, я все еще в замешательстве, я нашел индикатор 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 current = iCustom(Symbol(),0,"HMA_Russian_Color",20,3,0,0);

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

}