wskaźnik w kodzie EA

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

wskaźnik w kodzie EA

Nieprzeczytany post autor: personov »

Mam ogromny problem z wpisaniem kodu wskaźnika do EA ( a mam potrzebę aby tak właśnie zrobić ). Wpisywałem już kilka wskaźników do kodu i nie napotykałem się na problemy, ale teraz nie mogę. Chodzi konkretnie o Center_Of_Gravity. Chciałbym aby w Comment() wyprowadzone były wartości wszystkich pięciu linii. Linia środkowa i skrajne wyprowadziłem, ale dwóch linii pośrednich nie udaje mi się. Może ktoś pomoże ?
Z góry dziękuję.
Poniżej załączam kod wskaźnika i kod EA z moja dotychczasową pracą.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: Pierz Andrzej »

Witam

zrób sobie to na tablicach jak we wskaźniku a nóż będziesz chciał się odwołać do wartości na świecy wstecz :)

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                       EA COG.mq4 |
//|                     Copyright 2013, Forex-Service Andrzej Pierz. |
//|                                 https://www.forex-programming.eu |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern int bars_back = 125;
extern int m = 2;
extern int i = 0;
extern double kstd = 2.0;
extern int sName = 1105;
//-----------------------
double fx[], sqh[], sql[], stdh[], stdl[];
double ai[10,10], b[10], x[10], sx[20];
double sum;
int    ip, p, n, f;
double qq, mm, tt;
int    ii, jj, kk, ll, nn;
double sq, std;
int init()
{
   ArrayResize(fx, p+1);
   ArrayResize(sqh, p+1);
   ArrayResize(sql, p+1);
   ArrayResize(stdh, p+1);
   ArrayResize(stdl, p+1); 
   nn = m + 1;
   ObjectCreate("pr" + sName, 22, 0, Time[p], fx[p]);
   ObjectSet("pr" + sName, 14, 159);
   return(0);
}

int deinit()
{
   ObjectDelete("pr" + sName);
}
int start()
  {
//----
   cog();
//----
   return(0);
  }

void cog()
{
   int mi;
//-------------------------------------------------------------------------------------------
   ip = iBarShift(Symbol(), Period(), ObjectGet("pr" + sName, OBJPROP_TIME1));
   p = bars_back; 
   sx[1] = p + 1;
//----------------------sx-------------------------------------------------------------------
   for(mi = 1; mi <= nn * 2 - 2; mi++)
   {
      sum = 0;
      for(n = i; n <= i + p; n++)
      {
         sum += MathPow(n, mi);
      }
      sx[mi + 1] = sum;
   }  
//----------------------syx-----------
   for(mi = 1; mi <= nn; mi++)
   {
      sum = 0.00000;
      for(n = i; n <= i + p; n++)
      {
         if(mi == 1)
            sum += Close[n];
         else
            sum += Close[n] * MathPow(n, mi - 1);
      }
      b[mi] = sum;
   } 
//===============Matrix=======================================================================================================
   for(jj = 1; jj <= nn; jj++)
   {
      for(ii = 1; ii <= nn; ii++)
      {
         kk = ii + jj - 1;
         ai[ii, jj] = sx[kk];
      }
   }  
//===============Gauss========================================================================================================
   for(kk = 1; kk <= nn - 1; kk++)
   {
      ll = 0; mm = 0;
      for(ii = kk; ii <= nn; ii++)
      {
         if(MathAbs(ai[ii, kk]) > mm)
         {
            mm = MathAbs(ai[ii, kk]);
            ll = ii;
         }
      }
      if(ll == 0)
         return(0);   

      if(ll != kk)
      {
         for(jj = 1; jj <= nn; jj++)
         {
            tt = ai[kk, jj];
            ai[kk, jj] = ai[ll, jj];
            ai[ll, jj] = tt;
         }
         tt = b[kk]; b[kk] = b[ll]; b[ll] = tt;
      }  
      for(ii = kk + 1; ii <= nn; ii++)
      {
         qq = ai[ii, kk] / ai[kk, kk];
         for(jj = 1; jj <= nn; jj++)
         {
            if(jj == kk)
               ai[ii, jj] = 0;
            else
               ai[ii, jj] = ai[ii, jj] - qq * ai[kk, jj];
         }
         b[ii] = b[ii] - qq * b[kk];
      }
   }  
   x[nn] = b[nn] / ai[nn, nn];
   for(ii = nn - 1; ii >= 1; ii--)
   {
      tt = 0;
      for(jj = 1; jj <= nn - ii; jj++)
      {
         tt = tt + ai[ii, ii + jj] * x[ii + jj];
         x[ii] = (1 / ai[ii, ii]) * (b[ii] - tt);
      }
   } 
//===========================================================================================================================
   for(n = i; n <= i + p; n++)
   {
      sum = 0;
      for(kk = 1; kk <= m; kk++)
      {
         sum += x[kk + 1] * MathPow(n, kk);
      }
      fx[n] = x[1] + sum;
   } 
//-----------------------------------Std-----------------------------------------------------------------------------------
   sq = 0.0;
   for(n = i; n <= i + p; n++)
   {
      sq += MathPow(Close[n] - fx[n], 2);
   }
   sq = MathSqrt(sq / (p + 1)) * kstd;
   std = iStdDev(NULL, 0, p, MODE_SMA, 0, PRICE_CLOSE, i) * kstd;
   for(n = i; n <= i + p; n++)
   {
      sqh[n] = fx[n] + sq;
      sql[n] = fx[n] - sq;
      stdh[n] = fx[n] + std;
      stdl[n] = fx[n] - std;
   } 
   Comment
   (
   "\n"+
   "sc0 "+fx[0]
   +"\n"+
   "sc1 "+sqh[0]
   +"\n"+
   "sc2 "+sql[0]
   +"\n"+
   "sc3 "+stdh[0]
   +"\n"+
   "sc4 "+stdl[0]
   );
//-------------------------------------------------------------------------------
   ObjectMove("pr" + sName, 0, Time[p], fx[p]);
//----------------------------------------------------------------------------------------------------------------------------
   return(0);
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: personov »

Niby działa, ale te dwie linie pośrednie nadal wskazują jakieś dziwne wartości.
Nie wiem jaka jest tego przyczyna, a przesiedziałem już nad tym parę godzin.
Chodzi o sqh[n] i sql[n].
Solą życia jest kasa.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: Pierz Andrzej »

co masz na mysli dziwne wartosci ?? bo powiem szcerze że wydaje mi się że pokazuja prawidłowe ?

wez dodaj jescze do kodu odwolanie przez icustom do wskaznika i prownaj wartosci i bedziesz wiedzial czy jest ok ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: personov »

Pierz Andrzej pisze:co masz na mysli dziwne wartosci ?? bo powiem szcerze że wydaje mi się że pokazuja prawidłowe ?

wez dodaj jescze do kodu odwołanie przez icustom do wskaznika i prownaj wartosci i bedziesz wiedzial czy jest ok ;)
Dodaję za każdym razem w iCustom porównanie samego wskaźnika i wychodzą wartości, które nie są w ogóle ceną EURUSD. Zobacz na załącznik.

-- Dodano: czw 08-08-2013, 16:14 --

Przy porównaniu w iComment() wskaźnika przeliczonego w kodzie EA oraz tego samego wskaźnika poprzez iCustom() - wszystkie wartości się zgadzają z wyjątkiem tych dwóch. Jak widać na załączniku te wartości nie przypominają w ogóle ceny EURUSD. Jedna ma wartość 3.xxx, a druga jest ujemna.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: personov »

Pomoże ktoś rozwikłać tą zagadkę ? Będę wdzięczny.
Solą życia jest kasa.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: Pierz Andrzej »

moze Ci danych brakuje do przeliczenia ?? u mnie pokazuje normalnie ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: personov »

Niestety to nie jest kwestia braku danych. Próbowałem na różnych TFach i w różnych okresach.
Zauważyłem jednak jedną ważną rzecz. EA pokazuje błędne wartości w backteście w trybie wizualnym. Jeśli natomiast wrzucę go na live to wszystko jest OK.
O co chodzi ?
Jeśli wyprowadzę wartości buforów wskaźnika do Comment() to wszystko chodzi fajnie i w backteście i na live.
Jeśli użyje w ten sposób EA z wpisanym kodem wskaźnika to poprawnie chodzi tylko na live, a w backteście wskazuje głupoty.
Andrzej sprawdzałeś to na live, czy na backteście w trybie wizualnym ?
Solą życia jest kasa.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: Pierz Andrzej »

wykasuj z init() ten kod

Kod: Zaznacz cały

   ArrayResize(fx, p+1);
   ArrayResize(sqh, p+1);
   ArrayResize(sql, p+1);
   ArrayResize(stdh, p+1);
   ArrayResize(stdl, p+1); 
i wrzuć go na początek funkcji cog()
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: wskaźnik w kodzie EA

Nieprzeczytany post autor: personov »

Dziękuję bardzo Andrzej. Pomogło.
Solą życia jest kasa.

ODPOWIEDZ