Прошу помощи в преобрвазовании индикатора "ZIG-ZAG"

 
Индикатор для MetaStock нужно преобразовать для " MT-4 "

{Зиг-заг}

a:=Input("size %", 0.01,10,0.3);
LEx:=If((Ref(L,-1)>=L),L,H);
HEx:=If((Ref(H,-1)<=H),H,L);
HL:=If(Abs(LEx-Ref(LEx,-1))/Ref(LEx,-1)>=Abs(Hex-Ref(HEx,-1))/Ref(HEx,-1),LEx,HEx);
HiLo:=If(PeakBars(1,HL,a)<TroughBars(1,HL,a),
If(H>=Peak(1,HL,a), H, L), If(L<=Trough(1,HL,a), L, H));
ZZ:= Zig(HiLo,a,%);
ZZ;
 
Нет проблем
 
Проблема есть!
ZigZag Метастока и МТ4 - это две большие разницы, у них совершенноразные алгоритмы работы.
И соответственно индикатор или система работаюшая в Метасе в МТ будет работать совершенно по другому.

Может кто знает код ZigZag именно Метастока?!
 
.
 
Индикатор для MetaStock нужно преобразовать для " MT-4 "

{Зиг-заг}

a:=Input("size %", 0.01,10,0.3);
LEx:=If((Ref(L,-1)>=L),L,H);
HEx:=If((Ref(H,-1)<=H),H,L);
HL:=If(Abs(LEx-Ref(LEx,-1))/Ref(LEx,-1)>=Abs(Hex-Ref(HEx,-1))/Ref(HEx,-1),LEx,HEx);
HiLo:=If(PeakBars(1,HL,a)<TroughBars(1,HL,a),
If(H>=Peak(1,HL,a), H, L), If(L<=Trough(1,HL,a), L, H));
ZZ:= Zig(HiLo,a,%);
ZZ;


Я могу преобразовать, но я не знаю язык, используемый MetaStock, и не очень то хочу знать, т.к. никогда не буду им пользоваться. Но если вы объясните, что делает каждый вышеприведенный оператор, т.е. если вы объясните используемый алгоритм, то я буду вам признателен.
Я изучаю все индикаторы на основе ZigZag, чтобы разработать наиболее совершенный. Я уже улучшил алгоритм MetaQuotes (т.е. МТ4), устранив ряд ошибок и упростив настройку (всего один естественный параметр, типа процента). Могу выслать мой индикатор ZigZagEF и буду благодарен за ваши замечания и предложения по улучшению.
 
если можно, киньте мне zigzagEF

vvvall at inbox.ru

спасибо
 
a:=Input("size %", 0.01,10,0.3); - открывает окно ввода данных с возможностью изменить значение от 0,01 до 10, по умолчанию устновлено 0,3

LEx:=If((Ref(L,-1)>=L),L,H); - если Low[предыдущее]>=Low[текущее], тогда LEx=Low[текущее], иначе High[текущий]

HEx:=If((Ref(H,-1)<=H),H,L); - если High[предыдущее]>=High[текущее], тогда HEx=High[текущее], иначе Low[текущий]

HL:=If(Abs(LEx-Ref(LEx,-1))/Ref(LEx,-1)>=Abs(Hex-Ref(HEx,-1))/Ref(HEx,-1),LEx,HEx); - если MathAbs(LEx - предыдущий LEx)/предыдущий LEx >= MathAbs(HEx - предыдущий HEx)/предыдущий HEx, то HL = LEx иначе HEX

HiLo:=If(PeakBars(1,HL,a)<TroughBars(1,HL,a),
If(H>=Peak(1,HL,a), H, L), If(L<=Trough(1,HL,a), L, H)); -

если последний экстремум зигзага построенного по значению HL наверху{
если текущий High>этого экстремума, то HiLo=текущму High, иначе текщему Low
}
иначе{
если текущtt Low<этого экстремума, то HiLo=текущму Low, иначе текщему High}

ZZ:= Zig(HiLo,a,%); - рассчитывается значение зигзага по знчению HiLo

ZZ; - рисуем згзаг

у функции зигзага метастока первый аргумент - массив данных, второй значение чувствительность (ну или как его там назвать), третий означает в чем вести рассчет чувствительности в абсолютном значении или в процентах.
 
Алгоритм понятен и довольно прост. Можно реализовать в МТ4. Лучше, если это сделают разработчики МТ4, им за это платят.
 
GS&Rosh
Проблема есть!
ZigZag Метастока и МТ4 - это две большие разницы, у них совершенноразные алгоритмы работы.
И соответственно индикатор или система работаюшая в Метасе в МТ будет работать совершенно по другому.

Может кто знает код ZigZag именно Метастока?!


Лицом к лицу лица не видно. Этот код приведен ниже.
 
Вот код метастоковского индикатора ZigZagMS (MS - это MetaStock). Для простоты я ограничился массивом Close. Проверил, все работает. Заглядывает в "будущее", т.е. последняя точка зигзага раположена на последней свече.
#property copyright "MetaStock"
#property link      "http://www.eforex.ultranet.ru/"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
extern double ExtProcent=0.3;
double ExtMapBuffer[],Procent,min,max;
int m,shift,shift0;
int init()//================================================
{IndicatorBuffers(1);
 //---- drawing settings
 SetIndexStyle(0,DRAW_SECTION);
 //---- indicator buffers mapping
 SetIndexBuffer(0,ExtMapBuffer);
 SetIndexEmptyValue(0,0.0);
 ArraySetAsSeries(ExtMapBuffer,true);
 IndicatorShortName("ZigZag("+DoubleToStr(ExtProcent,2)+" %)")");
 Procent=ExtProcent*0.01; 
 Comment("                                Procent="+DoubleToStr(ExtProcent,2)+" %");
 return(0);
}int deinit() {Comment("                                                                   ");}
int start()//=============================================================================
{min=Close[Bars-1];max=min;m=0;//m=0:building the first left point of ZigZag
 for (shift=Bars-2;shift>=0;shift--)
 {if (Close[shift]>max)
  {max=Close[shift];if (m!=2)//m=1:building the down-point (min) of ZigZag
   {if (max-min>=Procent*min)//min (m!=2) end,max (m=2) begin
    {m=2;ExtMapBuffer[shift]=max;shift0=shift;min=max;
    }else ExtMapBuffer[shift]=0.0;//max-min=miser,(m!=2) continue
   }else //max (m=2) continue
   {ExtMapBuffer[shift0]=0.0;ExtMapBuffer[shift]=max;shift0=shift;min=max;
  }}else if (Close[shift]<min)
  {min=Close[shift];
   if (m!=1)//m=2:building the up-point (max) of ZigZag
   {if (max-min>=Procent*max)//max (m!=1) end,min (m=1) begin
    {m=1;ExtMapBuffer[shift]=min;shift0=shift;max=min;
    }else ExtMapBuffer[shift]=0.0;//max-min=miser,(m!=1) continue
   }else //min (m=1) continue
   {ExtMapBuffer[shift0]=0.0;ExtMapBuffer[shift]=min;shift0=shift;max=min;
  }}else ExtMapBuffer[shift]=0.0;
 }if (ExtMapBuffer[0]==0.0) ExtMapBuffer[0]=Close[0];
}
 
Индикатор для MetaStock нужно преобразовать для " MT-4 "

{Зиг-заг}

a:=Input("size %", 0.01,10,0.3);
LEx:=If((Ref(L,-1)>=L),L,H);
HEx:=If((Ref(H,-1)<=H),H,L);
HL:=If(Abs(LEx-Ref(LEx,-1))/Ref(LEx,-1)>=Abs(Hex-Ref(HEx,-1))/Ref(HEx,-1),LEx,HEx);
HiLo:=If(PeakBars(1,HL,a)<TroughBars(1,HL,a),
If(H>=Peak(1,HL,a), H, L), If(L<=Trough(1,HL,a), L, H));
ZZ:= Zig(HiLo,a,%);
ZZ;

Объясните поподробнее алгоритмы функций PeakBars, TroughBars, Peak, Trough и Zig.
Причина обращения: