Alıntı Originally Posted by Caglar Yazıyı Oku
MAX(H, L, C) ile MAX(H) ve MIN(H, L, C) ile MIN(L) aynı değerleri verir ancak kodu sizin istediğiniz gibi yazdım. Gönderdiğiniz MRS hesaplamasına değerleri daha makul görebilmek amacıyla 100 ile çarpma işlemi ekledim. Beklediğimden farklı ve güzel bir çıktı verdi. Filtre olarak işe yarayabilir.

Kod:
var P = Sistem.GrafikVerileri;
var H = Sistem.GrafikFiyatOku(P, "Yuksek");
var C = Sistem.GrafikFiyatOku(P, "Kapanis");
var L = Sistem.GrafikFiyatOku(P, "Dusuk");

var MED10 = Sistem.Liste(0f);
var MAX20 = Sistem.Liste(0f);
var MIN20 = Sistem.Liste(0f);
var MRS = Sistem.Liste(0f);
var HLC10 = new List<float>();
var HLC20 = new List<float>();

for (var i = 21; i < P.Count; i++)
{
    var hlc = new List<float> { H[i], C[i], L[i] };
    HLC10.AddRange(hlc);
    HLC20.AddRange(hlc);

    if (HLC10.Count == 30)
    {
        MED10[i] = User.Median(HLC10);
        HLC10.RemoveRange(0, 3);
    }

    if (HLC20.Count == 60)
    {
        MAX20[i] = HLC20.Max();
        MIN20[i] = HLC20.Min();
        HLC20.RemoveRange(0, 3);
    }

    MRS[i] = 100 * (MED10[i] - MAX20[i]) / MAX20[i];
}

Sistem.Cizgiler[0].Deger = MED10;
Sistem.Cizgiler[1].Deger = MAX20;
Sistem.Cizgiler[2].Deger = MIN20;
Sistem.Cizgiler[3].Deger = MRS;
Kodu çalıştırabilmek için daha önce göndermiş olduğum median formülünü User.dll de tutmanız gerekiyor. Hesaplamalarda hatalar olabilir, dolayısıyla kendiniz test etmeyi unutmayın.

Sayin Caglar;
MSR icin tekrar tesekkurler.Kod calisiyor gozukuyor tam testlerini yapmadim. Sizden percentrank istegime ilave olarak benzer bir kodun cevirisi icin yardimlarinizi rica edecektim.

function PercentRankHLC(Data1, Data2, Data3, Periods)
{
Count = 0;
for (i = 0; i < Periods + 1; i++)
{
Count = Count + IIf(Ref(Data3, 0) > Ref(Data1, -i), 1, 0);
Count = Count + IIf(Ref(Data3, 0) > Ref(Data2, -i), 1, 0);
Count = Count + IIf(Ref(Data3, 0) > Ref(Data3, -i), 1, 0);
}
return 100 * Count / (Periods*3-1);
}

Bende ki ideal cevirisine uyarlamaya calistim ancak basarili olamadim. Yardimci olabilirseniz sevinirim.

Amibroker kodu :

function PercentRank( Data, Periods )

{
Count = 0;
for ( i = 1; i < Periods ; i++ )
{
Count = Count + ( Data > Ref( Data, -i ) );
}
return 100 * Count / (Periods-1);
}


Ideal Kodu ( MSR ornegi):

for ( int i = Lenght; i < C.Count; i++)
{
float Count = 0;
for (int j = i-Lenght; j <= i; j++)
{
if (MRS[j] < MRS[i]) Count ++;
}
Count = Count * 100 / (float)Lenght;
MRSB[i] = Count ;
}