Кто знает язык С? Есть код индика оч хорошего надо бы перевести и поюзать в МТ4

 

Вопрос в теме.

Вот код:

#include "math.h"
#include "stdlib.h"

__declspec(dllexport) void Entropy (double *price, double *entropy, long int size, long int numbars)
{
double *in, *out, P, G;
long int i,j;
double sumx = 0.0;
double sumx2 = 0.0;
double avgx = 0.0;
double rmsx = 0.0;

in=price;
out=entropy;

for (i=0; i<size; i++)
{
if (i < numbars+1) *out = 3.4e38;
else
{
sumx = sumx2 = avgx = rmsx = 0.0;
for (j=0;j<numbars+1;j++)
{
sumx += log(*(in-j) / *(in-j-1)) ;
sumx2 += log(*(in-j) / *(in-j-1)) * log(*(in-j) / *(in-j-1));
}
if (numbars==0)
{
avgx = *in;
rmsx = 0.0;
}
else
{
avgx = sumx / numbars;
rmsx = sqrt(sumx2/numbars);
}

P = ((avgx/rmsx)+1)/2.0;
G = P * log(1+rmsx) + (1-P) * log(1-rmsx);
*out=G;
}
in++; out++;
}
}




 
Где-то я уже видел его на форуме. Но руки в тот момент не дошли до переноса.
 
Rosh писал (а) >>
Где-то я уже видел его на форуме. Но руки в тот момент не дошли до переноса.

Я писал ветку индикатор энтропии.

'Индикатор энтропии'

Я неплохо знаю С, но к сожалению пока не очень разобрался в том, как писать индикаторы.

Любая помощь была бы очень кстати.

 
Поишите тут где то есть уроки (Rosh их делал), там все пошагово и с пояснениями, как что и зачем делать. Тем более у Вас есть опыт программирования, вам будет легко разобраться. И после этого написать любой индикатор.
 
void Entropy (double& price[], double& entropy[], int size, int numbars)
{
double  P, G;
int in, out;
int i,j;
double sumx = 0.0;
double sumx2 = 0.0;
double avgx = 0.0;
double rmsx = 0.0;

in=0;  //price;
out=0; //entropy;

for (i=0; i<size; i++)
{
      if (i < numbars+1) entropy[out] = 999999999;//3.4e38;
         else 
            {
                  sumx = 0; sumx2=0 ; avgx =0; rmsx = 0.0;
                     for (j=0;j<numbars+1;j++)
                        {
                           sumx += MathLog(price[in-j] / price[in-j-1]) ;
                           sumx2 += MathLog(price[in-j] / price[in-j-1]) * MathLog(price[in-j] / price[in-j-1]);
                        }
                     if (numbars==0) 
                        {
                        avgx = price[in];
                        rmsx = 0.0;
                        }
            else 
            {
               avgx = sumx / numbars;
               rmsx = MathSqrt(sumx2/numbars);
            }

            P = ((avgx/rmsx)+1)/2.0;
            G = P * MathLog(1+rmsx) + (1-P) * MathLog(1-rmsx);
            entropy[out]=G;
}
in++; out++;
}
}
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime

double entropy[];

extern int numbars=14;
    
//+------------------------------------------------------------------+
int init()
{
    SetIndexBuffer(0,entropy); SetIndexStyle(0,DRAW_LINE); IndicatorShortName("Entropy");
    return(0);
}
//+------------------------------------------------------------------+
int deinit() { return(0); }
//+------------------------------------------------------------------+
int start ()
{
    double  P, G;
    int in, out;
    int i,j;
    double sumx = 0.0;
    double sumx2 = 0.0;
    double avgx = 0.0;
    double rmsx = 0.0;
    
    in=0;  //price;
    out=0; //entropy;
    int count = IndicatorCounted();

    for (i=0; i<Bars-count+1; i++)
    {
        if (i>Bars-numbars+1) entropy[out] = EMPTY_VALUE;//3.4e38;
        else 
        {
            sumx = 0; sumx2=0 ; avgx =0; rmsx = 0.0;
            for (j=0;j<numbars+1;j++)
            {
                sumx += MathLog(Close[in+j] / Close[in+j+1]) ;
                sumx2 += MathLog(Close[in+j] / Close[in+j+1]) * MathLog(Close[in+j] / Close[in+j+1]);
            }
        if (numbars==0)  { avgx = Close[in]; rmsx = 0.0; }
        else  { avgx = sumx / numbars; rmsx = MathSqrt(sumx2/numbars); }
        P = ((avgx/rmsx)+1)/2.0;
        G = P * MathLog(1+rmsx) + (1-P) * MathLog(1-rmsx);
        entropy[out]=G;
    }
    in++; out++;
    }
}
Исправленный
А куда автор того чего я исправввлял подевался?
 
Korey писал (а) >>
Исправленный
А куда автор того чего я исправввлял подевался?

У нас на Дальнем Востоке ночь была), очевидно я спал.

Спасибо за перевод. ;)

Изучаю возможности индикатора.

 

Индикатор был размещен в 'EntropyMath ' в простом виде для того чтобы с ним разобраться без макияжа.
Вот тот же индикатор с сигнальной линией.
в Сode Base этот вариант не ставил, чтобы не портить настроение.
кроме того, меня смущает, что сигнальная линия появляется в окне не сразу, а ждет прихода тика. Причина в большой длительности расчета истории при старте.

Файлы: