Programowanie dla początkujących

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

wystarczy zrobić

Kod: Zaznacz cały

int start()
{
  if(OrdersTotal()>0)
    {
       //cały twój kod
    }
}
pamiętaj również, że każdy if() dotyczy tylko jednej linijki następującej bezpośrednio za nim o ile nie użyjesz klamr
czyli

Kod: Zaznacz cały

if(warunek)
OrderSend();
zlecenie=1;
zadziała w ten sposób, że zmienna zlecenie dostanie wartość 1 niezależnie od tego czy warunek zostanie spełniony czy nie tak więc poprawny zapis byłby taki:

Kod: Zaznacz cały

if(warunek)
{
OrderSend();
zlecenie=1;
}
zmiennym możesz przypisywać wartości od razu przy inicjalizacji
Ogólnie używaj klamr gdzie tylko możesz oraz 'else'. Pierwszy zwiększy czytelność kodu i unikniesz wielu błędów, a drugie zwiększy prędkość wykonywania kodu oraz ułatwi pisanie kodu

poprawiony kod:

Kod: Zaznacz cały

int start() 
{
if(OrdersTotal()>0)
{
   double MACurrent = iMA(NULL,0,20,3,MODE_EMA,0,0); 
   double MAPrevious = iMA(NULL,0,20,3,MODE_EMA,0,1);
   int zlecenie = 0;
   if(zlecenie == 0)
   {
      if(Open[1] < MAPrevious && Open[0] > MACurrent)
      {
        OrderSend(NULL, OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Red); 
        zlecenie = 1;
      }
      else if(Open[1] > MAPrevious && Open[0] < MACurrent)
      {
        OrderSend(NULL, OP_SELL, 1, Bid, 3, 0,0,NULL,0,0,Red); 
        zlecenie = 2;
      }
   }
   else if(zlecenie == 1)
   {
      if(Open[1] > MAPrevious && Open[0] < MACurrent)    
         OrderSend(NULL, OP_SELL, 1, Bid, 3, 0,0,NULL,0,0,Blue); 
   }
   else if(zlecenie == 2)
   {
      if(Open[1] < MAPrevious && Open[0] > MACurrent)    
         OrderSend(NULL, OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Blue);
   }
}
}
StopLoss w tych OrderSend()'ach nie ma sensu większego ponieważ zapisuje się go jako cenę czyli, np.

Kod: Zaznacz cały

Ask-(10*Point)
i dla OP_SELL 
Bid+(10*Point)

tytoos
Bywalec
Bywalec
Posty: 9
Rejestracja: 17 maja 2011, 10:39

Nieprzeczytany post autor: tytoos »

Dzięki za funkcję sprawdzającą otwarte pozycje, będę z nią kombinował.
Na razie zrobiłem tak, że przy otwarciu zlecenia nadaje wartość zmiennej :)

Niestety dziś raczej będę zapracowany więc nie wiem czy będę miał chwilę na dalsze kombinowanie, ale będę dalej w wolnych chwilach

Awatar użytkownika
batman
Gaduła
Gaduła
Posty: 159
Rejestracja: 19 kwie 2011, 07:55

Nieprzeczytany post autor: batman »

Jesli troche rozumiesz po angielsku, to tu jest MQL4 book: http://book.mql4.com/content gdzie w szczegolnowsci tu: http://book.mql4.com/programm/structure jest o strukturze a tu przyklad EA http://book.mql4.com/samples/expert .
Sam to wlasnie studiuje ;)
Pozdrawiam

Awatar użytkownika
RafalT
Stały bywalec
Stały bywalec
Posty: 77
Rejestracja: 25 wrz 2010, 00:24

Nieprzeczytany post autor: RafalT »

Polecam po polsku:

Kurs MetaQuotes Language 4

link jest gdzieś na forum.

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

Nieprzeczytany post autor: dulf »

Nie spiesz się , zawsze zdążysz stracić .

bialy
Stały bywalec
Stały bywalec
Posty: 54
Rejestracja: 16 maja 2011, 20:41

przedatny skrot klawiszowy

Nieprzeczytany post autor: bialy »

dla poczatkujacych na pewno sie przyda
jesli jestesmy w nawiasach jakiejs funkcji skrot klawiszowy CTRL+SHIFT+SPACJA wywoluje skladnie parametrow funkcji. przydatne przy sprawdzaniu i uzupelnianiu parametrow bez szukania skladni w helpie

tytoos
Bywalec
Bywalec
Posty: 9
Rejestracja: 17 maja 2011, 10:39

Nieprzeczytany post autor: tytoos »

Kilka dni zawalonych pracą, więc nie mogłem się bawić :)

Ale już jestem z powrotem.
thisredone napisał o co chodzi z kalmerkami - przyda się na pewno :)

Jedną rzecz poprawiam, bo nie chce działać uruchamianie zleceń.
zamiast

Kod: Zaznacz cały

OrderSend(NULL, OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Blue);
wpisuję

Kod: Zaznacz cały

OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Blue);


Dodano po 28 minutach:

troche musiałem pogrzebać, bo mi otwieralo sporo zleceń i nie zwróciłem wcześniej uwagi, że nie miałem zamykania zleceń tylko otwieranie przeciwnych :)
Niestety jakoś nie chce mi się zamknąć zlecenie :/ jest otwierane jedno, ale zamyka się z końcem testu.

Kod teraz mam taki:

Kod: Zaznacz cały

int start()
  {
//----

//zdefiniowanie zmiennych dla łatwiejszej dalszej pracy
double MACurrent;
double MAPrevious;
double zlecenie;


MACurrent = iMA(Symbol(),0,20,3,MODE_EMA,0,0);
MAPrevious = iMA(Symbol(),0,20,3,MODE_EMA,0,1);

//sprawdzanie, czy są otwarte pozycje, aby nie dublować

if (OrdersTotal()==0) 
{
   if (Open[1] < MAPrevious && Open[0] > MACurrent) // sprawdzanie czy porpzednie otwarcie jest poniżej poziomu EMA a obecne powyżej
   {
      OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Red);
      zlecenie = 1; //zlecenie = 1 gdy zajęliśmy pozycję długą
   }
   
   if (Open[1] > MAPrevious && Open[0] < MACurrent) // sprawdzanie czy porpzednie otwarcie jest powużej poziomu EMA a obecne poniżej
   {
      OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0,0,NULL,0,0,Red);
      zlecenie = 2; //zlecenie = 2 gdy zajęliśmy pozycję krótką
   }
}


if (OrdersTotal()>1)
{
   if (zlecenie==1) //zlecenie = 1;
   {
      if (Open[1] > MAPrevious && Open[0] < MACurrent)   
      OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue);
   }
   
   if (zlecenie == 2)
   {
      if (Open[1] < MAPrevious && Open[0] > MACurrent)   
      OrderClose(OrderTicket(), OrderLots(), Ask, 3, Blue);
   }

//wprowadzenie warunków



}

//----

  }


Dodano po 42 minutach:

Działam dalej i sa jakieś postępy :)

Tym razem otwiera mi się zlecenie buy, zamyka się, otwiera się zlecenie Sell, ale już sie nie zamyka :/

Na innych ustawieniach okresu testowania otwiera się jako pierwsze zlecenie sell, ale już sie nie zamyka :/

Kod: Zaznacz cały

int start()
  {
//----

//zdefiniowanie zmiennych dla łatwiejszej dalszej pracy
double MACurrent;
double MAPrevious;
double zlecenie;


MACurrent = iMA(Symbol(),0,20,3,MODE_EMA,0,0);
MAPrevious = iMA(Symbol(),0,20,3,MODE_EMA,0,1);

//sprawdzanie, czy są otwarte pozycje, aby nie dublować

if (OrdersTotal()==0) 
{
   if (Open[1] < MAPrevious && Open[0] > MACurrent) // sprawdzanie czy porpzednie otwarcie jest poniżej poziomu EMA a obecne powyżej
   {
      OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Red);
      zlecenie = 1; //zlecenie = 1 gdy zajęliśmy pozycję długą
   }
   
   if (Open[1] > MAPrevious && Open[0] < MACurrent) // sprawdzanie czy porpzednie otwarcie jest powużej poziomu EMA a obecne poniżej
   {
      OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0,0,NULL,0,0,Red);
      zlecenie = 2; //zlecenie = 2 gdy zajęliśmy pozycję krótką
   }

}

if (OrdersTotal()>0)
{
   if (OrderType()==OP_BUY) //zlecenie == 1;
   {
      if (Open[1] > MAPrevious && Open[0] < MACurrent)   
      OrderClose(OrderTicket(), 1, Bid, 3, Blue);
   }
 
   if (OrderType()==OP_SELL) //zlecenie == 2;
   {
      if (Open[1] < MAPrevious && Open[0] > MACurrent)   
      OrderClose(OrderTicket(), 1, Ask, 3, Blue);
   }

//wprowadzenie warunków



}

//----

  }


Dodano po 18 minutach:

Wkurzające to jest, bo raz pokazuje jakieś zamknięcie, a raz nie pomimo, że żadnych zmian nie robię

bialy
Stały bywalec
Stały bywalec
Posty: 54
Rejestracja: 16 maja 2011, 20:41

kody bledow

Nieprzeczytany post autor: bialy »

zrob tak
na samym poczatku przed start() wrzuc cos takiego

Kod: Zaznacz cały

#import "stdlib.ex4"
string ErrorDescription(int error_code);
a funkcje OrderClose zapisz tak:

Kod: Zaznacz cały

 if(OrderClose(OrderTicket(),OrderLots(),Bid,3,Orange))
      Print("OK");
   else 
      Print("Blad. ",ErrorDescription(GetLastError()));
namierzysz gdzie jest problem
pomijam to ze brakuje OrderSelect przed OrderClose

tytoos
Bywalec
Bywalec
Posty: 9
Rejestracja: 17 maja 2011, 10:39

Nieprzeczytany post autor: tytoos »

na razie grzebię w kodzie i testuję na danych historycznych (tygodniowych, żeby szybciej przeliczalo :)) więc wyskakujące okienka nie za bardzo by mi tutaj pasowały.

Odnośnie OrderSelect - może to być problemem :) pokombinuje ze wstawieniem i zobaczymy czy pomoże :)

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

Używasz OrderType() bez OrderSelect() i system nie wie skąd ma ten OrderType() wziąć

potrzeba to zrobić tak:

Kod: Zaznacz cały

if (OrdersTotal()>0) 
 { 
 OrderSelect(0,SELECT_BY_POS);
    if (OrderType()==OP_BUY) //zlecenie == 1; 
    { 
       if (Open[1] > MAPrevious && Open[0] < MACurrent)    
       OrderClose(OrderTicket(), 1, Bid, 3, Blue); 
    } 
    else //zlecenie == 2; 
    { 
       if (Open[1] < MAPrevious && Open[0] > MACurrent)    
       OrderClose(OrderTicket(), 1, Ask, 3, Blue); 
    } 
 }
dodałem również 'else'
to co jest za else wykonuje się w przypadku gdy warunek if'a, który jest z nim w parze zwróci fałsz. Czyli jeżeli warunek if'a zwróci prawdę to wykonuje się to co jest w jego klamrach i else jest ignorowany, a w przeciwnym wypadku od razu wykonywany jest kod zawarty w klamrach za 'else'.
Ważne jest żeby stosować takie praktyki bo przyspiesza to wykonanie kodu ponieważ zamiast sprawdzać dwa warunki komputer sprawdza tylko jeden bo w tej akurat sytuacji jeśli trade NIE jest typu OP_BUY no to wiemy na pewno, że jest typu OP_SELL.


Dodatkowo zmienna zlecenie jest zbyteczna ;).

ODPOWIEDZ