//+------------------------------------------------------------------+
//|                                                  TestApEn.mq5    |
//+------------------------------------------------------------------+

#property script_show_inputs

#include <ApEn\ApEnCalculator.mqh>

#define ASSERT(cond,msg) \
   if(!(cond)) { PrintFormat("FAIL: %s",msg); } \
   else        { PrintFormat("PASS: %s",msg); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   int n=100;
   double periodic[];
   double pseudo_random[];
   ArrayResize(periodic,n);
   ArrayResize(pseudo_random,n);

   for(int i=0;i<n;i++)
      periodic[i]=::MathSin(i*0.3);

   ::MathSrand(42);
   for(int i=0;i<n;i++)
      pseudo_random[i]=(double)::MathRand()/32767.0-0.5;

   CApEnCalculator calc_periodic;
   CApEnCalculator calc_random;
   calc_periodic.Init(n,2,0.2);
   calc_random.Init(n,2,0.2);

   for(int i=0;i<n;i++)
      calc_periodic.Push(periodic[i]);
   for(int i=0;i<n;i++)
      calc_random.Push(pseudo_random[i]);

   double apen_periodic=calc_periodic.Compute();
   double apen_random=calc_random.Compute();

   PrintFormat("Periodic series ApEn: %.4f",apen_periodic);
   PrintFormat("Pseudo-random series ApEn: %.4f",apen_random);

   ASSERT(apen_periodic!=EMPTY_VALUE,"Periodic ApEn computed");
   ASSERT(apen_random!=EMPTY_VALUE,"Random ApEn computed");
   ASSERT(apen_periodic<apen_random,"Periodic ApEn lower than random ApEn");
  }
//+------------------------------------------------------------------+