Пробую заполнить индикаторный буфер с другого конца (ArraySetAsSeries (..., false)), какое-то время все работает нормально, но потом что-то происходит с буфером и появляется заполнение самый последний индекс массива , хотя этого быть не должно. Я так понимаю, терминал в какой-то момент обрезает буфер, и из за этого появляется вес буфер заполнен даже самый последний индекс массива. Наверно в какой-то момент надо освобождать буфер массива, но когда? Можете тестовый пример поправить?
Подскажите пожалуйста, почему данный индикатор на истории рисует стрелки редко, а когда начинаешь торговать, то начинает рисовать часто.
Потом если закрыть МТ4, и снова открыть, то на том же месте, где в реальном времени индикатор как пулемёт рисовал сделки, уже опять 1-2 сделки.
И получается когда смотришь историю, то кажется что индикатор должен хорошо торговать, но как только включаешь на реальном времени торговлю, то начинается что попало.
Подскажите почему так? Вот код индикатора:
//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_color1 Blue
#property indicator_color2 Red
//---- indicator parametersexternint period = 4; //12externint shift = 0; //сдвиг по бару//---- indicator buffersdouble BufferUp[],BufferDn[];
int q,st=5;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
IndicatorBuffers(2);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW,2);
SetIndexArrow(0,233);
SetIndexStyle(1,DRAW_ARROW,2);
SetIndexArrow(1,234);
SetIndexBuffer(0,BufferUp);//стрелка синяя верхSetIndexBuffer(1,BufferDn);//стрелка красная вниз//---- name for DataWindow and indicator subwindow label
IndicatorShortName("T3MA-ALARM ("+period+")");
//---- initialization doneif(Digits==3 || Digits==5) q=10;
st=st*q;
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int deinit()
{
ObjectDelete("low");
ObjectDelete("high");
}
//+----------------------------------------------------------------------+//| Moving Average of Oscillator |//+----------------------------------------------------------------------+int start()
{
//---- ArraySetAsSeries -------------------------------------------------- double Ma[],MaOn[];
double y0[],y1[],y2[];
// int i;int i;
ArraySetAsSeries(Ma,true);
//---- IndicatorCounted --------------------------------------------------int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
int limit1=Bars-counted_bars;
if(counted_bars==0) limit1-=1+MathMax(period,shift)+2;
int buffer_size=ArraySize(BufferUp);
ArrayResize(Ma,buffer_size);
ArrayResize(MaOn,buffer_size);
ArrayResize(y0,buffer_size+shift+2);
ArrayResize(y1,buffer_size+shift+2);
ArrayResize(y2,buffer_size+shift+2);
int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- for(i=limit1; i>=0; i--) Ma[i] =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
for(i=limit1; i>=0; i--) MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);
for(i=limit1; i>=0; i--)
{
y0[i+shift]=MaOn[i+shift];
y1[i+1+shift]=MaOn[i+1+shift];
y2[i+2+shift]=MaOn[i+2+shift];
if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0){BufferDn[i+1]=High[i+1]+st*Point;}
if(y0[i+shift]-y1[i+1+shift]>0 && y1[i+1+shift]-y2[i+2+shift]<0){BufferUp[i+1]=Low[i+1]-st*Point;}
//---- Signal Trend Up || Dn --------------------------------------------- if(y0[i]-y1[i+1]>0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
" SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n BUY TREND ",DoubleToStr(Close[i],Digits));
elseif(y0[i]-y1[i+1]<0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
" SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n SELL TREND ",DoubleToStr(Close[i],Digits));
}
//---- donereturn(0);
}
//+---------------------------------------------------------------------+
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
Спасибо большое. А как бы его теперь заставить открывать сделки только в конце текущей свечи на текущем таймфрейме? :)) Просто сейчас он открывает не понять когда сделки... Стрелочки то вроде верно рисует, и на свечах смотришь, вроде всё хорошо, но сами сделки открываются получается как оказывается по середине или ближе к концу свечи, в общем где угодно, только не там где надо. :(
//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_color1 Blue
#property indicator_color2 Red
//---- indicator parametersexternint period = 4; //12externint shift = 0; //сдвиг по бару//---- indicator buffersdouble BufferUp[],BufferDn[];
int q,st=5;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
IndicatorBuffers(2);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW,2);
SetIndexArrow(0,233);
SetIndexStyle(1,DRAW_ARROW,2);
SetIndexArrow(1,234);
SetIndexBuffer(0,BufferUp);//стрелка синяя верхSetIndexBuffer(1,BufferDn);//стрелка красная вниз//---- name for DataWindow and indicator subwindow label
IndicatorShortName("T3MA-ALARM ("+period+")");
//---- initialization doneif(Digits==3 || Digits==5) q=10;
st=st*q;
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int deinit()
{
ObjectDelete("low");
ObjectDelete("high");
}
//+----------------------------------------------------------------------+//| Moving Average of Oscillator |//+----------------------------------------------------------------------+int start()
{
//---- ArraySetAsSeries -------------------------------------------------- double Ma[],MaOn[];
double y0[],y1[],y2[];
// int i;int i;
ArraySetAsSeries(Ma,true);
//---- IndicatorCounted --------------------------------------------------int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
int limit1=Bars-counted_bars;
if(counted_bars==0) limit1-=1+MathMax(period,shift)+2;
int buffer_size=ArraySize(BufferUp);
ArrayResize(Ma,buffer_size);
ArrayResize(MaOn,buffer_size);
ArrayResize(y0,buffer_size+shift+2);
ArrayResize(y1,buffer_size+shift+2);
ArrayResize(y2,buffer_size+shift+2);
int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- for(i=limit1; i>=1; i--) Ma[i] =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
for(i=limit1; i>=1; i--) MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);
for(i=limit1; i>=1; i--)
{
y0[i+shift]=MaOn[i+shift];
y1[i+1+shift]=MaOn[i+1+shift];
y2[i+2+shift]=MaOn[i+2+shift];
if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0){BufferDn[i+1]=High[i+1]+st*Point;}
if(y0[i+shift]-y1[i+1+shift]>0 && y1[i+1+shift]-y2[i+2+shift]<0){BufferUp[i+1]=Low[i+1]-st*Point;}
//---- Signal Trend Up || Dn --------------------------------------------- if(y0[i]-y1[i+1]>0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
" SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n BUY TREND ",DoubleToStr(Close[i],Digits));
elseif(y0[i]-y1[i+1]<0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
" SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n SELL TREND ",DoubleToStr(Close[i],Digits));
}
//---- donereturn(0);
}
//+---------------------------------------------------------------------+
int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- // а не вот сюда?for(i=limit1; i>=1; i--) Ma[i] =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
for(i=limit1; i>=1; i--) MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);
for(i=limit1; i>=1; i--)
Пробую заполнить индикаторный буфер с другого конца (ArraySetAsSeries (..., false)), какое-то время все работает нормально, но потом что-то происходит с буфером и появляется заполнение самый последний индекс массива , хотя этого быть не должно.
Я так понимаю, терминал в какой-то момент обрезает буфер, и из за этого появляется вес буфер заполнен даже самый последний индекс массива. Наверно в какой-то момент надо освобождать буфер массива, но когда? Можете тестовый пример поправить?
Здравствуйте.
Подскажите пожалуйста, почему данный индикатор на истории рисует стрелки редко, а когда начинаешь торговать, то начинает рисовать часто.
Потом если закрыть МТ4, и снова открыть, то на том же месте, где в реальном времени индикатор как пулемёт рисовал сделки, уже опять 1-2 сделки.
И получается когда смотришь историю, то кажется что индикатор должен хорошо торговать, но как только включаешь на реальном времени торговлю, то начинается что попало.
Подскажите почему так? Вот код индикатора:
попробуйте 0 заменить на 1 в трёх местах
попробуйте 0 заменить на 1 в трёх местах
Я бы ещё и это переместил
попробуйте 0 заменить на 1 в трёх местах
Спасибо большое. А как бы его теперь заставить открывать сделки только в конце текущей свечи на текущем таймфрейме? :)) Просто сейчас он открывает не понять когда сделки... Стрелочки то вроде верно рисует, и на свечах смотришь, вроде всё хорошо, но сами сделки открываются получается как оказывается по середине или ближе к концу свечи, в общем где угодно, только не там где надо. :(
вообще принято открывать сделки в момент образования новой свечи, когда уже есть вся информация о только что закрытой свечке
Я бы ещё и это переместил
А точно туда куда показали?
вообще принято открывать сделки в момент образования новой свечи, когда уже есть вся информация о только что закрытой свечке
Виталий, заметил, люди напишут вопрос и пошли по делам, а мы тут между собой веселимся. Иногда по несколько листов с выкладками.