Programowanie dla początkujących

O jezykach programowania w platformach i nie tylko.
tytoos
Bywalec
Bywalec
Posty: 9
Rejestracja: 17 maja 2011, 10:39

Programowanie dla początkujących

Nieprzeczytany post autor: tytoos »

Witam,
jestem nowym użytkownikiem forum jak i również początkującym użytkownikiem MSQ4 :)
Miałem wcześniej do czynienia z programowaniem (TPascal, VBA), ale w MSQ to moje pierwsze kroki.
Przeglądałem forum i wydaje mi się, że jest więcej osób takich jak ja, tzn chcących zacząć programować własne strategie, ale potrzebujących pomocy.
Oczywiście można zacząć od modyfikacji jakichś przykładowych kodów, ale do tego również potrzebne są jakieś podstawowe informacje, a przeglądanie książek często jest bardzo czasochłonne i nie zawsze da się tak zrobić.
Dlatego postanowiłem zacząć temat i mam nadzieję, że znajdą się "dobre dusze" chcące pomóc innym w ich pierwszych krokach.
Nie chcę, żeby ten temat służył do pytania o gotowce, tyko o wskazywanie drogi do dalszych prac.

Przechodząc do konkretów:

uruchamiam nowy projekt w MSQ4 (działającym pod Meta Traderem) i napotykam na pierwsze wątpliwości:
po uruchomieniu nowego projektu mam następujący kod:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
no i pytanie do czego służą poszczególne części? co i gdzie wpisywać? czy jest podział, że zmienne wpisujemy w pierwszej części a sam program w ostatniej?

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

do init wbijasz wszystko co ma sie wykonac raz gdy ea rozpoczyna prace

deinit wszystko co ma sie wykonac jak ea konczy prace

no i start czyli co ea bedzie robic co tick

ps. to nie jest msq tylko mql

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

Nieprzeczytany post autor: tytoos »

No super, tak szybka odpowiedź :)

A jak to jest z tymi klamerkami "{}". Czy każdy podrzędny warunek musimy dać w klamerkę? np coś takiego

Kod: Zaznacz cały

if a>b 
{if a<c}
czyli jeżeli a>b to sprawdza warunek a<c, a jakby nie było klamerek to by sprawdzał oba warunki?

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

w tym przypadku obecnosc klamer nie robi roznicy najpierw sprawdza pierwszy pozniej drugi warunek

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

Nieprzeczytany post autor: tytoos »

No to biorę się do pracy i na początek zrobię prościutki (tak mi się wydaje) przykład zawierania transakcji przy przecięciu EMA :)

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

Nieprzeczytany post autor: thisredone »

polecam podstawowy kursik języka C bo mql4 to jest jego uproszczona wersja, składniowo prawie identyczna

co do tych warunków to nie sprawdzi żadnego bo warunek if'a musi być w nawiasach

Kod: Zaznacz cały

if(a>b)
drugi warunek zostanie sprawdzony jeśli pierwszy zostanie spełniony

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

Nieprzeczytany post autor: tytoos »

Istotna uwaga :)

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

Nieprzeczytany post autor: Tig3r »

weź jakiś przykładowy kod sobie otwórz i się przyjrzyj składni, najechanie na funkcje i F1 przeniesie cię do helpa, a tam już jest większość informacji
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

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

Nieprzeczytany post autor: tytoos »

No to na razie zrobiłem coś takiego. Ściągam dane historyczne, żeby można było sprawdzić na testerze czy działa :)

Kod: Zaznacz cały

int start()
  {
//----

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


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

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

//nie wiem jak sprawdzić :(

//wprowadzenie warunków

zlecenie = 0; //ustalenie, że zmienna określająca otwarcie zlecenia = 0. Tylko dla zlecenie = 0 będą zawierane transakcje
if (zlecenie == 0)
   if (Open[1] < MAPrevious && Open[0] > MACurrent) // sprawdzanie czy porpzednie otwarcie jest poniżej poziomu EMA a obecne powyżej
      OrderSend(NULL, 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(NULL, OP_SELL, 1, Bid, 3, 0,0,NULL,0,0,Red);
      zlecenie = 2; //zlecenie = 2 gdy zajęliśmy pozycję krótką

if (zlecenie == 1) //jezeli zajęliśmy pozycję długą testujemy, czy EMA nie daje sygnału sprzedaży
   if (Open[1] > MAPrevious && Open[0] < MACurrent)   
      OrderSend(NULL, OP_SELL, 1, Bid, 3, 0,0,NULL,0,0,Blue);

if (zlecenie == 2) //jeżeli zajęliśmy pozycję krótką testujemy, czy EMA nie daje sygnału zakupu
   if (Open[1] < MAPrevious && Open[0] > MACurrent)   
      OrderSend(NULL, OP_BUY, 1, Ask, 3, 0,0,NULL,0,0,Blue);



//----

  }


Dodano po 1 minutach:

Trochę mnie denerwuje kilka rzeczy:
- średniki na końcu, ale podobnie było w TP,
- wrażliwość na duże i małe litery - jak napisze prawidłowo, ale np. "red" zamiast "Red", to wywala błąd :/
- podwójny "==" przy definiowanych parametrach
Ale trzeba się przyzwyczaić i tyle :D

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

Nieprzeczytany post autor: RafalT »

funkcja do sprawdzania czy są otwarte pozycje

Kod: Zaznacz cały

int countOrders() {
   int count=0;
   for(int i=0;i<OrdersTotal();i++) 
               {
               if(OrderSelect(i,SELECT_BY_POS)) 
               {              
                 if(OrderSymbol()==Symbol()) 
                 {
                  count++;
                  }
                 }
                }   
              return(count);
   }
wywołujesz poprzez np.:

Kod: Zaznacz cały


if(   inne_warunki                                 && countOrders()<1   ) //jeśli ilość otawrtych transakcji mniejsza od 1
        {
         ticket=OrderSend(Symbol(),OP_SELL, Lots ,Bid,3,(Bid+SL),(Bid-TP),"bla bla",16000,0,Red);
        }


ODPOWIEDZ