Programowanie dla początkujących

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

Nieprzeczytany post autor: tytoos »

Zaraz będę z tym kombinował, dzieki
a zmienną zlecenie wstawiłem na samym początku z myslą, ze pomoze to w ustalaniu czy sa otwarte jakies pozycje i jakie :) Nie wiedzialem jak to zrobic, wiec wymyslilem sobie taki sposob ;)
kombinowac trzeba, bo inaczej sie nizcego nei nauczymy :D

Dodano po 8 minutach:

To był chyba milowy krok dla mnie :D dzieki serdeczne thisredone

Dodano po 3 godzinach 21 minutach:

Wymyśliłem sobie coś takiego:

Na sygnał EMA zajmuję przeciwne pozycje, każda ze stoplosem - obecnie ustawiony na 15.
W zamyśle miałoby to działac tak, że zajmuje dwie pozycje, aby sie zabezpieczyć przed fałszywym sygnałem. Stoploss zamyka jedną pozycję, a druga zarabia dalej az do sygnału sprzedaży (lub stoploss).

Nie chodzi o strategię, tylko o kod, a problem jest taki, że nie zawsze otwiera pozycje. W dzienniku wywala jakieś błędy i nei wiem dlaczego :(

Kod: Zaznacz cały

int start()
  {
//----

//zdefiniowanie zmiennych dla łatwiejszej dalszej pracy
double MACurrent;
double MAPrevious;
double MACD1;
double MACD2;
double SL = 15;

MACurrent = iMA(Symbol(),0,20,3,MODE_EMA,0,0);
MAPrevious = iMA(Symbol(),0,20,3,MODE_EMA,0,1);
MACD1 = iMACD(Symbol(),0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MACD2 = iMACD(Symbol(),0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

if (Hour()<7)// && Hour()>1)
{
if (Volume[0]>1) return;

if (OrdersTotal()==0)   //sprawdzanie, czy są otwarte pozycje, aby nie dublować
{
   if (Open[1] < MAPrevious && Open[0] > MAPrevious ) // sprawdzanie czy porpzednie otwarcie jest poniżej poziomu EMA a obecne powyżej
   {
      OrderSend(Symbol(), OP_BUY, 1, Ask, 5, Ask-SL*Point,0,NULL,0,0,Red);
      OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid+SL*Point,0,NULL,0,0,Red);
   }
   else
   {
      if (Open[1] > MAPrevious && Open[0] < MAPrevious) // sprawdzanie czy porpzednie otwarcie jest powużej poziomu EMA a obecne poniżej
      {
         OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid+SL*Point,0,NULL,0,0,Red);
         OrderSend(Symbol(), OP_BUY, 1, Ask, 5, Ask-SL*Point,0,NULL,0,0,Red);
      }
   }
}
}
else
{
if (Hour()>15)// && Hour()<21)
{
if (Volume[0]>1) return;

if (OrdersTotal()==0)   //sprawdzanie, czy są otwarte pozycje, aby nie dublować
{
   if (Open[1] < MAPrevious && Open[0] > MAPrevious ) // sprawdzanie czy porpzednie otwarcie jest poniżej poziomu EMA a obecne powyżej
   {
      OrderSend(Symbol(), OP_BUY, 1, Ask, 5, Ask-SL*Point,0,NULL,0,0,Red);
      OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid+SL*Point,0,NULL,0,0,Red);
   }
   else
   {
      if (Open[1] > MAPrevious && Open[0] < MAPrevious) // sprawdzanie czy porpzednie otwarcie jest powużej poziomu EMA a obecne poniżej
      {
         OrderSend(Symbol(), OP_SELL, 1, Bid, 3, Bid+SL*Point,0,NULL,0,0,Red);
         OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-SL*Point,0,NULL,0,0,Red);
      }
   }
}
}
}
if (OrdersTotal()==1)
   {
   OrderSelect(0,SELECT_BY_POS);
   if (OrderType()==OP_BUY) 
   {
      if (Open[1] > MAPrevious && Point < MAPrevious) 
      OrderClose(OrderTicket(), 1, Bid, 3, Blue);
   }
   else
   if (OrderType()==OP_SELL) 
   {
      if (Open[1] < MAPrevious && Point > MAPrevious)
      OrderClose(OrderTicket(), 1, Ask, 3, Blue);
   }
}





//----

  }

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

Nieprzeczytany post autor: thisredone »

na pierwszy rzut oka co widzę to wywołanie 'Hour()'.

Funkcja Hour() zwraca godzinę serwera, w której system został załączony. Czyli nieważne ile świeczek przeminie od czasu zapuszczenia systemu to Hour() zawsze zwróci tą samą wartość.

Zamiast tego użyj TimeHour(TimeLocal()). TimeHour() wyciąga godzinę z jakiejkolwiek zmiennej 'datetime'. TimeLocal() zwraca czas lokalny komputera czyli w wyniku otrzymasz aktualną godzinę.

Co do errorów no to od tego bym zaczął. Każdy error sprawdź tutaj.

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

Hour()

Nieprzeczytany post autor: bialy »

dziwna sprawa bo ja mam ta funkcje w czesci kiedy automat ma dzialac i jest jak trzeba
uzywam na kilka sposobow:

1 funkcja zewnetrzna:

Kod: Zaznacz cały

int GetMaxTrades(int h) {
   if(h >= 20 || h < 8) return (5);
   if(h >= 12 && h < 15) return (10);
   if((h >= 8 && h < 12) || (h >= 15 && h < 20)) return (15);
}
i wywolanie

Kod: Zaznacz cały

MaxTrades = GetMaxTrades(Hour());
2.

Kod: Zaznacz cały

if(BarCount != Bars && Period() == 60) {
   if(Hour()>=From && Hour()<To) {
        //czesc sygnalowa
   }
}
w testerze strategii tez tak jest OK
PS
taki zapis

Kod: Zaznacz cały

#import "stdlib.ex4" 
string ErrorDescription(int error_code); 
Print("Blad. ",ErrorDescription(GetLastError())); 
nie wywoluje okienek. w logach dostajesz nazwe bledu i od razu wiesz co i jak
thisredone podal Ci link do kodow bledow, a mozesz od razu dostac odpowiedz w logach
oszczedzajmy cykle procesora

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

Re: Hour()

Nieprzeczytany post autor: thisredone »

bialy pisze:dziwna sprawa bo ja mam ta funkcje w czesci kiedy automat ma dzialac i jest jak trzeba
rzeczywiście funkcja działa inaczej niż opisane jest w doc'u
nigdy jej nie używałem bo OPIS jest dość jednoznaczny

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

mql doc's

Nieprzeczytany post autor: bialy »

widze ze nie tylko ja czytam doc'a z metaeditora
dla mnie to byl jedyny nauczyciel + metoda prob i bledow + fragmenty kodu z forexfactory i http://www.forex-tsd.com ostatni polecam chociaz ostatnio czesciej zagladam na FF
P.S. jesli ktos z poczatkujacych doczyta do tego miejsca to zadawajcie pytania, aktualnie sie nudze i proste proste problemy odnosnioe mql'a potrafie rozwiazac i pomoge. na chwile obecna dla siebie zaprogramowalem wszystko co wymyslilem.
trademanager http://www.forexfactory.com/showthread.php?t=89371
ja mam wlasnego a to jest niezle, jednak nie mialem ochoty obczaic co,jak,dlaczego, dlatego napisalem swoj
oszczedzajmy cykle procesora

ODPOWIEDZ