Proszę o wskazanie błędu w kodzie

O jezykach programowania w platformach i nie tylko.
farnick
Bywalec
Bywalec
Posty: 18
Rejestracja: 02 lis 2011, 09:51

Proszę o wskazanie błędu w kodzie

Nieprzeczytany post autor: farnick »

Witam,

To mój pierwszy wpis na forum.
Jestem początkującym programistą dlatego proszę na mnie nie krzyczeć ;)

Napisałem sobie prosty wskaźnik, który w przypadku gdy EMA100>EMA200 daje sygnał 1 a w przypadku EMA100<EMA200 daje sygnał -1. Wynik trafia do tablicy SYG[].

Chciałbym jednak w drugiej tablicy otrzymać wynik dotyczący poprzedniej świeczki czyli SYGPopSw=SYG[i+1]

Program jednak nie działa tzn - nie rysuje mi wykresu SYGPopSw

Poniżej wklejam cały kod:

Kod: Zaznacz cały

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue

//--- input parameters


double SYGPopSw[];
double SYG[];

int init()
  {
 string short_name;
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,SYGPopSw);

   short_name="Wskaznik";
   IndicatorShortName(short_name);
   SetIndexLabel(1,short_name);
//----
   SetIndexDrawBegin(0,300);
  
//----
   return(0);
  }

int deinit()
  {
//----
   
//----
   return(0);
  }

int start()
  {
  int i, counted_bars=IndicatorCounted();
  
  if(Bars<=300) return(0);
  
   i=Bars-300-1;
   if(counted_bars>=300) i=Bars-counted_bars-1;
      while(i>=0)
      {
       
     if (iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)>iMA(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i)) 
        {
          SYG[i]=1;
         }
          else if (iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)<iMA(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i)) 
           {
            SYG[i]=-1;
            }
            else
               {
               SYG[i]=SYG[i+1];
               }
     
      SYGPopSw[i]=SYG[i+1];
           
      i--;
      }
      
 
   
   return(0);
   }
//+------------------------------------------------------------------+      
 



Bardzo proszę o pomoc i wskazanie błędu.[/code]

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

musisz miec 2 bufory albo zdecydować sie ktory ma byc rysowany

Kod: Zaznacz cały

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue

//--- input parameters


double prevSYG[];
double SYG[];

int init()
{
string short_name;
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,SYG);

   IndicatorShortName ("Siganals");
   SetIndexLabel(1,short_name);

//----
return(0);
}

int deinit()
{
return(0);
}

int start()
  {
int limit;
int counted_bars=IndicatorCounted();
 
  if(Bars<=300) return(0);
 
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- the last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
 
   limit=Bars-counted_bars;
   //---- main loop
   for(int i=0; i<limit; i++)
   { 
     if (iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)>iMA(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i))
        {
        SYG[i]=1;
        }
 
     if (iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)<iMA(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i))
        {
        SYG[i]=-1;
        }
 
      }
     
 
   
   return(0);
   }
//+------------------------------------------------------------------+      


Dodano po 7 minutach:

Kod: Zaznacz cały

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
//+------------------------------------------------------------------+
//--- input parameters


double prevSYG[];
double SYG[];
//+------------------------------------------------------------------+
int init()
{
   IndicatorShortName ("Signals");
//---- indicator line

   SetIndexBuffer(0,SYG);
   SetIndexLabel (0, "Signal");
   SetIndexStyle(0,DRAW_LINE);
 
//----
   SetIndexBuffer(1, prevSYG);
   SetIndexLabel (1, "SignalPrev");
   SetIndexStyle (1, DRAW_LINE);

//----
return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
int start()
  {
int limit;
int counted_bars=IndicatorCounted();
 
  if(Bars<=300) return(0);
 
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- the last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
 
   limit=Bars-counted_bars;
   //---- main loop
   for(int i=0; i<limit; i++)
   { 
     if (iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)>iMA(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i))
        {
        SYG[i]=1;
        prevSYG[i-1]=1;
        }
 
     if (iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)<iMA(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i))
        {
        SYG[i]=-1;
        prevSYG[i-1]=-1;
        }
 
      }
         
   return(0);
   }
//+------------------------------------------------------------------+      
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

Zadeklaruj wymiar dla tablicy.

Przykładowo:

Kod: Zaznacz cały

double prevSYG[1000];

Albo dodaj jeszcze jeden bufor dla obliczeń. Zmieniasz wtedy na samej górze liczbę buforów na dwa i dodajesz do kodu jeszcze:

SetIndexStyle(1,DRAW_NONE);
SetIndexBuffer(1,SYG);


*UPDATE*
Reptile był szybszy.
fx-forum

farnick
Bywalec
Bywalec
Posty: 18
Rejestracja: 02 lis 2011, 09:51

Nieprzeczytany post autor: farnick »

Dzięki wielkie za tak szybkie odpowiedzi.

:)

Pozdrawiam

Dodano po 2 godzinach 45 minutach:

Rozwiązanie zaproponowane przez Reptile jest oczywiście poprawne (jeszcze raz dzięki).

Nadal jednak nie rozumiem dlaczego mój kod jest niepoprawny.

Załóżmy, że nie chcę rysować SYG, tylko SYGPopSw (wg mojej nomenklatury).
I chcę do tablicy SYGPopSw wziąć dane z tablicy SYG ale z poprzedniej świeczki czyli

SYGPopSw=SYG[i+1];

Czy ilość zadeklarowanych buforów musi być taka jak ilość tablic wykorzystywanych w programie czy też nie ma to związku ? (z tego co wiem ilość buforów może być max 8 buforów).

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

Nieprzeczytany post autor: Pierz Andrzej »

Jezeli chcesz cos wpisac do tablicy musi miec ona jakis wymiar .....

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

Muszę cię zmartwić, ale kod Reptila też zawiera błędy.

Kod: Zaznacz cały

prevSYG[i-1]=1; 
jest niepoprawne (w tym wypadku), gdyż wtedy próboje przypisać wartośc indeksowi -1

Co do tablic i wymiarów.
Jeżeli chcesz używać tablicy jako bufor, to nie musisz miec rozmiaru tablicy ty jednak, w przypadku SYG ustaliłeś to jako buffor

Kod: Zaznacz cały

 SetIndexBuffer(0,SYG); 
a tablicy SYGPopSw już nie
(oczywiście należy także pamiętać o zmianie ilości buforów
#property indicator_buffers 1

Oczywiści mogłeś nie chcieć miec tego jako bufor i nie wyświetlac (Tylko co wtedy chciałbys z tym robic?) wtedy tak jak ci napisał Andrzej, musisz deklarować rozmiar (nie wymiar, bo ilośc wymiarów określiłeś) wymiaru.

Patrząc na twój kod (pomijając błedy) to twój kod jest jeszcze lepszy, bo widzę, że chcesz w stytuacji gdy te średnie są równe przepisać sygnał z poprzedniej świeczki, w przypadku kodu Reptila, będzie pusty sygnał. (Oczywiście jeżeli było takie zamierzenie)

Z rad:
iMA(NULL,0,100,8,MODE_EMA,PRICE_CLOSE,i)
i
(NULL,0,200,8,MODE_EMA,PRICE_CLOSE,i))

Lepiej trzymac w zmiennych, wtedy tylko raz je wyliczasz, a nie w przyapdku else if wyliczasz je jeszcze raz. Szkoda czasu.

farnick
Bywalec
Bywalec
Posty: 18
Rejestracja: 02 lis 2011, 09:51

Nieprzeczytany post autor: farnick »

dzięki,

wieczorem jak będę w domu to jeszcze pokombinuję.

Czyli z tego co zrozumiałem jeżeli tablica nie jest zadeklarowana jako bufor to musi mieć podany rozmiar ??

W moim przypadku chcę tylko wyświetlić double SYGPopSw a SYG ma tylko przetrzymać wartość

a więc:

double SYGPopSw[]; // to bedzie bufor
double SYG[1000]; // to nie bedzie bufor tylko tablica o rozmiarze 1000 swieczek

int init()
{
string short_name;
//---- indicator line
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,SYGPopSw);

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

farnick pisze:Czyli z tego co zrozumiałem jeżeli tablica nie jest zadeklarowana jako bufor to musi mieć podany rozmiar ??
I tak i nie. ;)
1. jeżeli jest bufforem, nie musi mieć rozmiaru
2. jeżeli jest tablica dynamiczna, na wstępie nie musi mieć rozmiaru, ale musisz go zdefiniować później dynamicznie
3. Tak musi miec rozmiar ;)


Dokładnie w Twoim przypadku, chcesz mięc i tablice i buffor, czyli jeden traktujesz jak bufor a w drugim deklarujesz rozmiar.

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

LowcaG pisze:Patrząc na twój kod (pomijając błedy) to twój kod jest jeszcze lepszy, bo widzę, że chcesz w stytuacji gdy te średnie są równe przepisać sygnał z poprzedniej świeczki, w przypadku kodu Reptila, będzie pusty sygnał. (Oczywiście jeżeli było takie zamierzenie)
Ja zmieniłem kod dla siebie :D robilem szybki test bez testera na wykresie na wzor MC i tradeStation.. :)
farnick napewno sie polapal.. wystarczy prevSYG[i+1]
farnick pisze:Czyli z tego co zrozumiałem jeżeli tablica nie jest zadeklarowana jako bufor to musi mieć podany rozmiar ??
nie.. mt4 rozdziela.. ale rozne sa przypadki kiedy trzeba jednak zadeklarować
jesli tablice nie przypiszesz pod odpowiedni bufor to bedzie pusto.. mozesz miec 1 bufor i 2 tablice.. ale warunek (prawidlowy- twoj pierwszy ie mial zbytniej logiki) kiedy bufora ma korzystac z ktorej tablicy

Najważniejsze jest to

#property indicator_buffers 1
lub
#property indicator_buffers 2

oraz fakt ze
SetIndexBuffer(0, - zero odnosi sie do buffora 1
SetIndexBuffer(1, - zero odnosi sie do buffora 2
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

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

Nieprzeczytany post autor: Pierz Andrzej »

obrazujac to co napisal LowcaG ;)

1 -

Kod: Zaznacz cały

doble tablica[];
.......
SetIndexBuffer(0,tablica);
2-

Kod: Zaznacz cały

double tablica[];
.............
ArrayResize(tablica,1000);
3-

Kod: Zaznacz cały

double tablica[1000];

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ODPOWIEDZ