Элитные показатели :) - страница 183

 

Сообщение DTosc...

Младен,

Я получаю сообщение в папке Expers, которое говорит....... "incorrect start position 10148 for Array Maximum function" - индикатор, кажется, ведет себя прекрасно.

Объясните, пожалуйста, что это значит?

Заранее благодарю.

 

ValeoFX

Не зная, о каком индикаторе идет речь, обычно это что-то вроде этого Найдите, где определяется лимит, и измените его на что-то вроде этого :

limit=MathMin(Bars-counted_bars,Bars-1);

Второй параметр в этом выражении (Bars-1) в данном случае гарантирует, что лимит не больше, чем количество баров на графике.

Но, как вы уже заметили, это "доброкачественная" ошибка: она произойдет только один раз (при загрузке индикатора или при смене таймфрейма) и, в отличие от некоторых других ошибок, она не останавливает расчет индикатора, поэтому все остальные расчеты выполняются правильно и значения вычисляются корректно.

с уважением

mladen

ValeoFX:
Mladen,

Я получаю сообщение в папке Expers, которое гласит....... "incorrect start position 10148 for Array Maximum function" - индикатор, кажется, ведет себя прекрасно.

Пожалуйста, дайте объяснение?

Заранее благодарю.
 

Спасибо...

mladen:
ValeoFX

Не зная, о каком индикаторе идет речь, обычно это что-то вроде этого Найдите, где определяется лимит, и измените его на что-то вроде этого :

limit=MathMin(Bars-counted_bars,Bars-1);

Второй параметр в этом выражении (Bars-1) в данном случае гарантирует, что лимит не больше, чем количество баров на графике.

Но, как вы уже заметили, это "доброкачественная" ошибка: она произойдет только один раз (при загрузке индикатора или при смене таймфрейма) и, в отличие от некоторых других ошибок, она не останавливает расчет индикатора, поэтому все остальные расчеты выполняются правильно и значения вычисляются корректно.

с уважением

mladen

======================

Извините, Mladen, у меня в окне "Title" (DTOsc) было название индикатора и я не подумал повторить его еще раз. Тем не менее, спасибо за объяснение - я посмотрю на это немедленно.

В строке 124 я нашел:

limit = MathMax(limit,MathMin(Bars,iCustom(NULL,timeFrame,IndicatorFileName, "getBarsCount",0,0)*timeFrame/Period()));

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

Очень признателен.

 

ValeoFX

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

В любом случае, если вы используете тот, что в этом посте: https: //www.mql5.com/en/forum/general, то вы получите это сообщение.

С другой стороны, если вы используете тот, что в этом посте: https: //www.mql5.com/en/forum/general (более новый), то вы не получите это сообщение.

Я не помню, когда именно я сделал тот, что в первом посте, но с тех пор я изменил некоторые стили кодирования (отсюда и отсутствие сообщения об ошибке) и, честно говоря, раньше меня не слишком заботило это сообщение об ошибке, поскольку оно ничего не меняет. После этого я просто решил не оставлять места для возможных ошибок, отсюда и "проверка безопасности" при определении предела

____________________________________

PS: эта строка работает в режиме мультитаймфрейма. Она "спрашивает" целевой таймфрейм, сколько баров изменилось на целевом таймфрейме, чтобы иметь возможность пересчитать точное количество баров на текущем таймфрейме. Таким образом, эта линия эффективна только в режиме mtf

 

Младен,

Я новичок в кодировании. И это сложно. Но если у меня есть только книга CodersGuru, чтобы сделать EA....... не будет достаточно...

см. мой пост на странице 183

 

Tradefx1

Дневной тренд, который вы пытаетесь найти : вам нужно переопределить его (переписать). Сейчас он написан следующим образом:

int GetDailyTrend (int res){

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

BarCount=Bars;

return (res);

}[/php]and you are calling it like this :

if (GetDailyTrend(1) && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend(2) && ...) Order = SIGNAL_SELL;

[/php]The way it is used and called now expressions GetDailyTrend(1) and GetDailyTrend(2) are always true (in metatrader any value not equal to 0 is considered a true.

_________________________

Redefine the GetDailyTrend() to something like this:

[php]int GetDailyTrend ()

{

int res = 0;

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

return (res);

}

And then use it this way :

[php]if (GetDailyTrend()==1 && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend()==2 && ...) Order = SIGNAL_SELL;

_________________________

Что касается книг и кодинга: я всегда считал, что лучший способ научиться кодингу - это примеры и работающие программы. Хотите верьте, хотите нет, но люди из Microsoft отлично подходят для обучения (они пишут код единообразно (что означает, что у них есть твердые командные правила, как должен быть написан код) очень чисто и они стараются сделать его настолько эффективным, насколько могут).

В элитном разделе есть много примеров и работающих советников, которые может использовать любой желающий (я могу порекомендовать вам вот этот https://www.mql5.com/en/forum/180383 ) по причинам, которые я уже изложил в этой теме, и я думаю, что его можно легко использовать в качестве "рамки" для других советников. Но также есть много других очень полезных советников, которые можно использовать для изучения и создания работающих советников.

И всегда помните одну вещь: языки кодирования - это именно так: "языки". А значит, это такой же простой разговор, как и любой другой. Просто будьте осторожны с тем, что вы "говорите" компьютеру, потому что компьютер, в отличие от людей, не задается вопросом о том, что вы ему говорите, а просто выполняет это (и иногда это не то, что мы хотим, чтобы он делал ) А потом, через некоторое время, вы привыкнете "говорить" с компьютером, и тогда все станет намного проще.

 

На всякий случай...

Если кому-то интересно, какова основная логика индикатора adxvma, вот один средний шаг, который может оказаться не менее полезным, чем сам индикатор. (после него есть еще дополнительные шаги, поэтому не стоит сравнивать эти два индикатора, но этот шаг кажется особенно интересным)

Если кому-то это кажется знакомым, то ответ "да". Похоже, что это индикатор Power Trend ("настоящий" Power Trend, а не те, которые выкладываются и публикуются как он - в этом я не уверен на 100% (все, что я видел от "настоящего" - это его фотографии), но он, черт возьми, очень похож на него).
Файлы:
 
mladen:
ValeoFX

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

В любом случае, если вы используете версию из этого сообщения: https: //www.mql5.com/en/forum/general, то вы получите это сообщение.

С другой стороны, если вы используете тот, что в этом посте: https: //www.mql5.com/en/forum/general (более новый), то вы не получите это сообщение.

Я не помню, когда именно я сделал тот, что в первом посте, но с тех пор я изменил некоторые стили кодирования (отсюда и отсутствие сообщения об ошибке) и, честно говоря, раньше меня не слишком заботило это сообщение об ошибке, поскольку оно ничего не меняет. После этого я просто решил не оставлять места для возможных ошибок, отсюда и "проверка безопасности" при определении предела.

____________________________________

PS: эта строка работает в режиме мультитаймфрейма. Она "спрашивает" целевой таймфрейм, сколько баров изменилось на целевом таймфрейме, чтобы иметь возможность пересчитать необходимое точное количество баров на текущем таймфрейме. Таким образом, эта линия эффективна только в режиме mtf

=========================================================

Большое спасибо за объяснение. Очень признателен и также помог мне лучше понять кодировку.

Я немедленно загружу 2-й вариант.

С наилучшими пожеланиями.

 

adxvma

Младен,

Я не ошибусь, если попрошу вас выложить версию Tradestation?

Рэй

mladen:
Ребята, я заметил одну нелогичную вещь в индикаторе (первый шаг, как вычисляется часть adx) Я использовал индикатор Tradestation в качестве модели и кажется, что в нем есть ошибка, которую я унаследовал, не думая об этом . В этой модели эта ошибка исправлена. Даже результаты лучше.
Этот расчет гораздо ближе к индикатору из публичного раздела (поэтому индикатор из публичного раздела является достаточно правильным индикатором) с гораздо более быстрым кодом в 99% времени и дополнительными функциями, характерными только для этих индикаторов, размещенных в элитном разделе. Так что если вы скачали индикаторы из предыдущих постов, пожалуйста, используйте эти вместо них. Также добавлена еще одна опция к "обычной" версии: MultiColorMode - если установлено значение false, то для отображения adxvma будет использоваться только один цвет (полезно, если нужно использовать пару adxvma для проверки пересечений в качестве сигналов).

с уважением

Mladen
 

Рэй,

Вот оно. Индикатор :

inputs:

Price (close),

length (14);

vars:

av (0);

av = ADXVMA(Price, length);

Plot1(av, "Rising");

Plot2(av, "Falling");

Plot3(av, "Neutral");

Plot4(av, "ADXVMA", iff(av = av[1], GetPlotColor(3), iff(av > av[1], GetPlotColor(1), GetPlotColor(2))));

NoPlot(1);

NoPlot(2);

NoPlot(3); [/php]and the adxvma function

[php]inputs:

Price (NumericSeries),

Length (NumericSimple);

vars:

TR(0),

DI_Diff(0),

DI_Sum(0),

ma(0),

pdm(0),

mdm(0),

pdi(0),

mdi(0),

DI_Factor(0),

VI(0),

diff(0),

HHV(0),

LLV(0),

WeightDM(Length),

WeightDI(Length),

WeightDX(Length),

ChandeEMA(Length),

out(0),

j(0);

once ma=Price;

//

// in order to make it right the "pdm=0; mdm=0;" must be added (it does not

// exist in original and that is an error, tradestation inherits values fom

// a previous loop and they must be zeroed before these calculations)

//

pdm=0; mdm=0;

if(Price>Price[1]) then pdm=Price-Price[1] else mdm=Price[1]-Price;

pdm=((WeightDM-1)*pdm[1] + pdm)/WeightDM;

mdm=((WeightDM-1)*mdm[1] + mdm)/WeightDM;

TR=pdm+mdm;

if (TR>0) then begin pdi=pdm/TR; mdi=mdm/TR; end

else begin

pdi=0;

mdi=0;

end;

pdi=((WeightDI-1)*pdi[1] + pdi)/WeightDI;

mdi=((WeightDI-1)*mdi[1] + mdi)/WeightDI;

DI_Diff=pdi-mdi;

if (DI_Diff<0) then DI_Diff= -DI_Diff;

DI_Sum=pdi+mdi;

DI_Factor=0;

if (DI_Sum>0) then out=DI_Diff/DI_Sum else out=0;

out=((WeightDX-1)*out[1] + out)/WeightDX;

if (out>out[1]) then begin HHV=out; LLV=out[1]; end

else begin

HHV=out[1];

LLV=out;

end;

for j = 1 to Length-1 begin

if(out[j+1]>HHV)then HHV=out[j+1];

if(out[j+1]<LLV) then LLV=out[j+1];

end;

diff = HHV - LLV;

VI=0;

if (diff>0) then VI=(out-LLV)/diff;

ma=((ChandeEMA-VI)*ma[1]+VI*Price)/ChandeEMA;

ADXVMA = ma;

Добавлен комментарий и исправление кода, которого не было в оригинале (это единственное изменение, которое я сделал в нем). Некоторые названия переменных вводят в заблуждение: нет расчета EMA ни на одном из шагов. Это сглаженное скользящее среднее, используемое на промежуточных шагах сглаживания, а не EMA. Также вы заметите, что даже если основная логика расчета взята из ADX, на самом деле это не ADX, но он достаточно близок, чтобы заслужить такое название в случае этого "гибридного" индикатора.

с уважением,

Младен

traderduke:
Младен,

Буду ли я не прав, если попрошу Вас выложить версию для Tradestation?

Рэй
Причина обращения: