Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

gooral87 pisze:mam hydro-zagadkę

dlaczego wyniki wskaźnika są inne w realu i w testerze dla identycznego okresu w przeszłości ?
u góry tester, na dole real:
http://ifotos.pl/zobacz/testerJPG_rxxrxhh.JPG/

nurtuje mnie to ponieważ w takim wypadku tester nie symuluje zleceń.
parametry wskaźnika się niezmienione, skala na wykresie również

Będę wdzięczny za oświecenie.
Czy dane masz te same?
Pytanie też co wskaźnik liczy, bo samo MT4 nie ma danych tickowych i je generuje losowo w obrębie świecy (czy jakoś tak).
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

gooral87
Stały bywalec
Stały bywalec
Posty: 28
Rejestracja: 07 paź 2010, 14:59

Nieprzeczytany post autor: gooral87 »

hmmm.. tu może tkwi sekret... dane tickowe... gdzieś na forum był wątek jak je zaimplementować do MT4.
Spróbuje coś pogmerać. Dzięki

Awatar użytkownika
Ciekawy
Pasjonat
Pasjonat
Posty: 384
Rejestracja: 20 lis 2009, 23:07

Nieprzeczytany post autor: Ciekawy »

Kurczę nie potrafię programować więc nie mam pojęcia co jest źle w tym kodzie który zkleciłem... założenie jest takie, że EA ma kasować zlecenie oczekujące jeśli Bid/Ask będzie na pewnym poziomie zaznaczonym linią. Teraz EA kasuje zlecenia w pierwszym ticku po ustawieniu nawet jak nie ma linii....

Kod: Zaznacz cały

int i,ord;
double Poziom_dla_zlecen_buylimit,Poziom_dla_zlecen_selllimit;
string Linia,Linia1;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

  Poziom_dla_zlecen_buylimit=ObjectGet("high", OBJPROP_PRICE1);               //pobierz cenę z poziomu linii i przypisz do zmiennej

  Poziom_dla_zlecen_selllimit=ObjectGet("low", OBJPROP_PRICE1);
  
 

  for (i=0;i<OrdersTotal();i++)                                                              //wyszukaj 
   {ord=OrderType();  
    OrderSelect(i,SELECT_BY_POS, MODE_TRADES); }
     if(ord==OP_BUYLIMIT && Ask>=Poziom_dla_zlecen_buylimit*Point) 
         OrderDelete(OrderTicket(),Pink);                                        //jeśli to buylimit Ask jest większy lub równy niż poziom linii wtedy skasuj zlecenie
   
      if(ord==OP_SELLLIMIT && Bid<=Poziom_dla_zlecen_selllimit*Point) 
         OrderDelete(OrderTicket(),Pink);
  return(0);
  }
:?

z góry dzięki za pomoc - tylko prosiłbym jak można to łopatologicznie ;)

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Ciekawy
Twój kod to:
1. pobierz ceny (nie sprawdza czy się udało - może nie być linii)
2. aby sprawdzać typ zlecenia musisz najpierw zlecenie wybrać (orderselect musi być pierwsze)
3. masz pomieszane z blokami (nawiasami) - np lecisz po wszystkich zleceniach i koniec bloku
4. na samym końcu instrukcje kasujące zlecenie

Funkcja start (bez uwzględniania pierwszego punktu):

Kod: Zaznacz cały

Poziom_dla_zlecen_buylimit=ObjectGet("high", OBJPROP_PRICE1);
Poziom_dla_zlecen_selllimit=ObjectGet("low", OBJPROP_PRICE1);

  for (i=0;i<OrdersTotal();i++)                                                              //wyszukaj
   {
    if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
     if(OrderType()==OP_BUYLIMIT  && Ask>=Poziom_dla_zlecen_buylimit*Point)
         OrderDelete(OrderTicket(),Pink);                                        //jeśli to buylimit Ask jest większy lub równy niż poziom linii wtedy skasuj zlecenie
   
      if(OrderType()==OP_SELLLIMIT && Bid<=Poziom_dla_zlecen_selllimit*Point)
         OrderDelete(OrderTicket(),Pink);
  }
}
  return(0); 
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
Ciekawy
Pasjonat
Pasjonat
Posty: 384
Rejestracja: 20 lis 2009, 23:07

Nieprzeczytany post autor: Ciekawy »

Tig3r dziękuję za szybką pomoc :)
jeszcze dopytam o jedno - jak chciałbym wiele zleceń to wiem, że każde musiałoby mieć swój ticket aby nim zarządzać(jeśli chciałbym aby EA kasowało je w określonej kolejności) teraz pytanie po czym EA mogłoby poznać które zlecenie to które gdybym zlecenia stawiał ręcznie....

EDIT:
Tig3r widzę, że dodałeś nawiasy i wyrzuciłeś OrderType niżej ale jednak jest tak samo jak było - kasuje zlecenia od razu...

Pozdrawiam ;)

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

Ciekawy pisze:Tig3r dziękuję za szybką pomoc :)
jeszcze dopytam o jedno - jak chciałbym wiele zleceń to wiem, że każde musiałoby mieć swój ticket aby nim zarządzać(jeśli chciałbym aby EA kasowało je w określonej kolejności) teraz pytanie po czym EA mogłoby poznać które zlecenie to które gdybym zlecenia stawiał ręcznie....
do tego sluzy MagicNumber. Kazde zlecenie otwierane recznie ma MagicNumber == 0. Mozesz wysylac zlecenia za pomoca skryptu z jakims MagicNumber i wtedy EA ma po czym je rozpoznac

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Ciekawy pisze:EDIT:
Tig3r widzę, że dodałeś nawiasy i wyrzuciłeś OrderType niżej ale jednak jest tak samo jak było - kasuje zlecenia od razu...

Tak jak napisałem - nie ma sprawdzania czy są odczytane dane z linii i tu może być błąd, bo może wczytać EMPTY, EMPTY_VALUE lub 0.
Należałoby dodać warunki sprawdzające czy odczytało jakąś wartość z linii i nie jest tymi powyższymi
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
bud fox
Gaduła
Gaduła
Posty: 168
Rejestracja: 01 lip 2011, 19:24

Nieprzeczytany post autor: bud fox »

Witajcie.

Napisałem wskaźnik (według wzoru: http://book.mql4.com/samples/indicators) wyświetlający alarm, po przecięciu średniej przez cenę.

Alarm wyświetla się bezbłędnie, jednak średnia na wykresie jest niewidoczna, wiecie może dlaczego?

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                      Średnia.mq4 |
//|                                                                  |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#property link      "http://www.metaquotes.net"

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

extern int Period_Ma=21;

bool up=true;
bool down=true;

int start()
  {
   int    counted_bars=IndicatorCounted();
   double ma;
   
   ma=iMA(Symbol(), 0, Period_Ma, 0, MODE_SMA, PRICE_CLOSE, 0);
   
   if(Bid>ma && up==true){
      down=true;
      up=false;
      Alert("Price is above MA (", Period_Ma, ").");
      
          }
      
      
    if(Bid<ma && down==true){
        up=true;
        down=false;
        Alert("Price is below MA (", Period_Ma, ").");
    
    

   
   }
   
   
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Ostatnio zmieniony 26 lut 2012, 17:24 przez bud fox, łącznie zmieniany 1 raz.
Życzę wszystkim wolności i sukcesów!

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Bo trzeba ją jeszcze narysować .Do tego służą bufory w które wrzucasz odpowiednie wartości dla danego przesunięcia (świecy) dopiero masz wykres .
Sama iMa dla jednej świecy (0 - ostatni parametr) nie utworzy wykresu .

Kod: Zaznacz cały

 #property indicator_chart_window
 
 #property indicator_buffers 1
 #property indicator_color1 Red
 
 double MA_Buffer[];

 //+------------------------------------------------------------------+ 
 //| Custom indicator initialization function                         | 
 //+------------------------------------------------------------------+ 
 int init() 
   { 
 //---- indicators
     //<================
     SetIndexBuffer(0, MA_Buffer); 
     SetIndexStyle(0,DRAW_LINE);
     //<================
 //---- 
    return(0); 
   } 
 //+------------------------------------------------------------------+ 
 //| Custom indicator deinitialization function                       | 
 //+------------------------------------------------------------------+ 
 int deinit() 
   { 
 //---- 
     
 //---- 
    return(0); 
   } 
 //+------------------------------------------------------------------+ 
 //| Custom indicator iteration function                              | 
 //+------------------------------------------------------------------+ 

 extern int Period_Ma=21; 

 bool up=true; 
 bool down=true; 

 int start() 
   { 
   //<==========
   int    counted_bars=IndicatorCounted();
    
   if (counted_bars<0) return(-1);
   
   if (counted_bars>0) counted_bars--;
   
   counted_bars= Bars-counted_bars;
   
   for(int i=counted_bars;i>=0;i--)
   {
   
          MA_Buffer[i] = iMA(Symbol(), 0, Period_Ma, 0, MODE_SMA, PRICE_CLOSE, i); 
   
   }
   //<===================
   
   //-------------------------------------------
    double ma; 
     
    ma=iMA(Symbol(), 0, Period_Ma, 0, MODE_SMA, PRICE_CLOSE, 0); 
   // lub  ma = MA_Buffer[0] ;  bo juz mamy wyliczony  zamiast iMA  
     
    if(Bid>ma && up==true){ 
       down=true; 
       up=false; 
       Alert("Price is above MA (", Period_Ma, ")."); 
       
           } 
       
       
     if(Bid<ma && down==true){ 
         up=true; 
         down=false; 
         Alert("Price is below MA (", Period_Ma, ")."); 
     
     

     
    } 
     
     
 //---- 
     
 //---- 
    return(0); 
   } 
 //+------------------------------------------------------------------+
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
bud fox
Gaduła
Gaduła
Posty: 168
Rejestracja: 01 lip 2011, 19:24

Nieprzeczytany post autor: bud fox »

Bardzo Ci dziękuję dulf.

Pozdrawiam!
Życzę wszystkim wolności i sukcesów!

ODPOWIEDZ