Где-то я уже видел его на форуме. Но руки в тот момент не дошли до переноса.
Я писал ветку индикатор энтропии.
'Индикатор энтропии'Я неплохо знаю С, но к сожалению пока не очень разобрался в том, как писать индикаторы.
Любая помощь была бы очень кстати.
Поишите тут где то есть уроки (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++; } }Исправленный
А куда автор того чего я исправввлял подевался?
Индикатор был размещен в 'EntropyMath ' в простом виде для того чтобы с ним разобраться без макияжа.
Вот тот же индикатор с сигнальной линией.
в Сode Base этот вариант не ставил, чтобы не портить настроение.
кроме того, меня смущает, что сигнальная линия появляется в окне не сразу, а ждет прихода тика. Причина в большой длительности расчета истории при старте.
Файлы:
entropymathmcd.mq4
3 kb
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вопрос в теме.
Вот код:
#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++;
}
}