Скачать MetaTrader 5

Помогите с индикатором!!!!!!!!!!!!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Мы сами переведем ее на другие языки!
Mr_Vetal
49
Mr_Vetal 2011.11.30 07:39 

Помогите пожалуйста подправить прогу. Хочу что бы индикатор давал звуковой сигнал когда появляеться сигнал на покупку и продажу, но что то не работает!! Заранее спасибо)

//+------------------------------------------------------------------+
//| SilverTrend_Signal.mq4
//| Ramdass - Conversion only
//+------------------------------------------------------------------+
#property copyright "SilverTrend rewritten by CrazyChart"
#property link "http://viac.ru/"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Violet

//---- input parameters
extern int RISK=3;
extern int CountBars=350;
extern bool SoundAlert = true;
int SSP=9;

//---- buffers
double val1[];
double val2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,233);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| SilverTrend_Signal |
//+------------------------------------------------------------------+
int start()
{
if (CountBars>=Bars) CountBars=Bars;
SetIndexDrawBegin(0,Bars-CountBars+SSP);
SetIndexDrawBegin(1,Bars-CountBars+SSP);
int i,shift,counted_bars=IndicatorCounted();
int i1,i2,K;
double Range,AvgRange,smin,smax,SsMax,SsMin,price;
bool uptrend,old;
//----

if(Bars<=SSP+1) return(0);
//---- initial zero
if(counted_bars<SSP+1)
{
for(i=1;i<=SSP;i++) val1[CountBars-i]=0.0;
for(i=1;i<=SSP;i++) val2[CountBars-i]=0.0;
}
//----

K=33-RISK;
for (shift = CountBars-SSP; shift>=0; shift--)
{

Range=0;
AvgRange=0;
for (i1=shift; i1<=shift+SSP; i1++)
{AvgRange=AvgRange+MathAbs(High[i1]-Low[i1]);
}
Range=AvgRange/(SSP+1);

SsMax=High[shift]; SsMin=Low[shift];
for (i2=shift;i2<=shift+SSP-1;i2++)
{
price=High[i2];
if(SsMax<price) SsMax=price;
price=Low[i2];
if(SsMin>=price) SsMin=price;
}

smin = SsMin+(SsMax-SsMin)*K/100;
smax = SsMax-(SsMax-SsMin)*K/100;
val1[shift]=0;
val2[shift]=0;
if (Close[shift]<smin)
{
uptrend = false;
}
if (Close[shift]>smax)
{
uptrend = true;
}
if (uptrend!=old && uptrend==true) {val1[shift]=Low[shift]-Range*0.5;}
if (uptrend!=old && uptrend==false) {val2[shift]=High[shift]+Range*0.5;}
old=uptrend;
}
return(0);
}
//+------------------------------------------------------------------+
void SendAlert(string txt) {
if (Time[0] != tt) {
if (SoundAlert) {
if (txt == "buy") Alert("Trend Long " + Symbol() + ", " + Period());
if (txt == "sell") Alert("Trend Short " + Symbol() + ", " + Period());
}
tt = Time[0];
}
}

Владимир Тезис
4266
Владимир Тезис 2011.11.30 09:07  
А где у него тут сигнал на покупку или продажу?? Да и SendAlert() тут не нужна - она ни где в коде не вызывается.
Mr_Vetal
49
Mr_Vetal 2011.11.30 09:30  
drknn:
А где у него тут сигнал на покупку или продажу?? Да и SendAlert() тут не нужна - она ни где в коде не вызывается.


Та нужно найти где он принимает решение о том чтобы поставить стрелку вниз или вверх и там же пставить алерт, но я не могу понять как он вообще ставит их. Думал там где Drow Arrow, ну типа стрелка, оказывается оно до старта выполняется, а после не могу найти. По идее это какая-то стандартная функция должна быть
Mr_Vetal
49
Mr_Vetal 2011.11.30 09:48  
drknn:
А где у него тут сигнал на покупку или продажу?? Да и SendAlert() тут не нужна - она ни где в коде не вызывается.


Вот прога для примера!!!!!! Индикатор рисует стрелки вверх или вниз и при этом выдает звуковые сигналы!!!

//+------------------------------------------------------------------+
//| Trend.mq4 |
//| Copyright © 2010, DimDimych |
//| dm34@mail.ru |
//+------------------------------------------------------------------+
#property copyright "DimDimych"
#property link "dm34@mail.ru"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Gold
#property indicator_color5 White
//---- input parameters

extern int Bands_Period = 20;
extern double Bands_Deviation = 2;
extern int Power_Period = 13;
extern int range = 15; //кол-во пипсов
extern int Continue_Priod = 7;
extern int CountBars = 300;
extern bool histo = false;
extern bool arrows = true;
extern bool SoundAlert = true;
//---- buffers
double value[];
double value2[];
double flat[],temp[],up[],dn[];
string sPrefix;int tt;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
// string short_name;
//---- indicator line
IndicatorBuffers(6);
if(histo)
{
SetIndexStyle(0, DRAW_HISTOGRAM,0,2);
SetIndexStyle(1, DRAW_HISTOGRAM,0,2);
}
else
{
SetIndexStyle(0, DRAW_LINE,0,2);
SetIndexStyle(1, DRAW_LINE,0,2);
}
SetIndexBuffer(0, value); //1
SetIndexBuffer(1, value2);//2

SetIndexBuffer(2, up); //3
SetIndexBuffer(3, dn); //4
SetIndexStyle(2,DRAW_ARROW,0,1);
SetIndexStyle(3,DRAW_ARROW,0,1);
SetIndexArrow(2,108);
SetIndexArrow(3,108);
SetIndexStyle(4, DRAW_LINE,0,8);
SetIndexBuffer(4, flat); //5
SetIndexBuffer(5, temp); //6
//---- name for DataWindow and indicator subwindow label
sPrefix ="Trend (" + Bands_Period + ", " + DoubleToStr(Bands_Deviation,2) + " flat: "+range+ "p.)";
IndicatorShortName(sPrefix);
SetIndexLabel(0, "iTrend1 (" + Bands_Period + ", " + DoubleToStr(Bands_Deviation,2) + ")");
SetIndexLabel(1, "iTrend2 (" + Bands_Period + ", " + DoubleToStr(Bands_Deviation,2) + ")");
//----
SetIndexDrawBegin(0, Bars - CountBars + Bands_Period + 1);
SetIndexDrawBegin(1, Bars - CountBars + Bands_Period + 1);
//----

return(0);
}
//--------------
void DelOb()
{
int n = ObjectsTotal();
for (int i = n - 1; i >= 0; i--)
{
string sName = ObjectName(i);
if (StringFind(sName, sPrefix) == 0)
{
ObjectDelete(sName);
}
}
}
//--------------

void deinit()
{
DelOb();
}
//----------------------------------------------------------------------
void DrawAr(string ssName, int i)
{

string sName=sPrefix+" "+ssName+" "+ TimeToStr(Time[i],TIME_DATE|TIME_MINUTES);
//ObjectDelete(sName);
ObjectCreate(sName, OBJ_ARROW, 0, Time[i], 0);
if(ssName=="up")
{
ObjectSet(sName, OBJPROP_ARROWCODE, 225);
ObjectSet(sName, OBJPROP_PRICE1, Low[i]-5*Point);
ObjectSet(sName, OBJPROP_COLOR, Lime);
}
if(ssName=="dn")
{
ObjectSet(sName, OBJPROP_ARROWCODE, 226);
ObjectSet(sName, OBJPROP_PRICE1, High[i]+5*Point);
ObjectSet(sName, OBJPROP_COLOR, Red);
}
ObjectSet(sName, OBJPROP_WIDTH, 1);
}

//+------------------------------------------------------------------+
//| Trend |
//+------------------------------------------------------------------+
int start()
{
int i, CurrentBar, Bands_Mode, counted_bars = IndicatorCounted();
double Power_Price, CurrentPrice,tmp,Range_level;
//----
Range_level=range*Point;

if(Bars <= Bands_Period)
return(0);
//---- initial zero
if(counted_bars < Bands_Period)
{
for(i = 1; i <= Bands_Period; i++)
{
value[Bars-i] = 0.0;
value2[Bars-i] = 0.0;
flat[Bars - i] = EMPTY_VALUE;
up[Bars - i] = EMPTY_VALUE;
dn[Bars - i] = EMPTY_VALUE;
}
}
//----
i = CountBars - Bands_Period - 1;

for(i = CountBars - 1; i >= 0; i--)
{
value[i]=Close[i]-iBands(NULL,0,Bands_Period,Bands_Deviation,0,0,0,i);
value2[i]=-(iBearsPower(NULL, 0, Power_Period,0,i)+
iBullsPower(NULL,0,Power_Period,0,i));

if (value[i]>value2[i] && up[i]!=0.0)
{
if(value[i+1]<=value2[i+1])
{
up[i]=0.0;dn[i]=EMPTY_VALUE;
}
}
if (value[i]<value2[i]&& dn[i]!=0.0)
{
if(value[i+1]>=value2[i+1])
{
dn[i]=0.0;up[i]=EMPTY_VALUE;
}
}

if (value[i] < Range_level && value[i] > (-Range_level) &&
value2[i]< Range_level && value2[i]> (-Range_level))
temp[i] = 0;
else
temp[i] = -0.00001;

tmp = 0;
for (int y = i + Continue_Priod - 1; y >= i; y--)
tmp = MathMin(tmp, temp[y]);
if (tmp == 0.0)
flat[i] = 0.0;
else
flat[i] = EMPTY_VALUE;

if(arrows)
{
if(up[i]==0.0 && flat[i]!=0.0)
{
DrawAr("up",i);
}
if(dn[i]==0.0 && flat[i]!=0.0)
{
DrawAr("dn",i);
}
}

}

if(up[0]==0.0 && flat[0]!=0.0 )
SendAlert("buy");
if(dn[0]==0.0 && flat[0]!=0.0 )
SendAlert("sell");

return(0);
}
//+------------------------------------------------------------------+
void SendAlert(string txt) {
if (Time[0] != tt) {
if (SoundAlert) {
if (txt == "buy") Alert("SilverTrend Long " + Symbol() + ", " + Period());
if (txt == "sell") Alert("SilverTrend Short " + Symbol() + ", " + Period());
}
tt = Time[0];
}
}
Владимир Тезис
4266
Владимир Тезис 2011.11.30 09:52  
Vertik:


Та нужно найти где он принимает решение о том чтобы поставить стрелку вниз или вверх и там же пставить алерт, но я не могу понять как он вообще ставит их. Думал там где Drow Arrow, ну типа стрелка, оказывается оно до старта выполняется, а после не могу найти. По идее это какая-то стандартная функция должна быть


SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);

Как только в буффер val1 или val2 попадает значение, так сразу отрисовывается стрелка. Попробовали бы вникниуть в работу кода. Легче будет в дальнейшем. А ещё лучше - будет изучить написание индикаторов

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий