Pomoc MQL4

O jezykach programowania w platformach i nie tylko.
WojtexWay
Gaduła
Gaduła
Posty: 145
Rejestracja: 18 wrz 2012, 19:22

Re: Pomoc MQL4

Nieprzeczytany post autor: WojtexWay »

Lucky1978 pisze:OK rozumiem ale jednak wygląda na to że pobiera wartości true i false bo zmienia kierunki wchodzenia w zlecenia w zależności od spełnienia warunku if.
Niby co pobiera wartość true i false? Po prostu zawsze zwracana jest wartość true przez OrderSelect, dlatego nie dostrzegasz konsekwencji błędnego kodu. Równie dobrze możesz w ogóle wywalić tego if-a przy OrderSelect (ale samo OrderSelect powinno zostać) i również będzie działać.
A działało tylko dlatego, że x zawsze był równy 0 - tak na prawdę mogłeś wpisać 0 do OrderSelect zamiast tego x, z którym próbowałeś zrobić coś dziwnego, ale na szczęście nie wyszło, gdy dałeś x = x++;
Lucky1978 pisze:Teraz się morduje w sumie z tym samym bo chcę aby w zależności od warunku if była zwiększana stawka zlecenia i nie wychodzi mi jakoś :-(
Co to znaczy zwiększana stawka zlecenia? O_o

A tak wracając jeszcze do tego kodu to moim zdaniem on jest napisany troszkę do góry nogami. Niby działa, ale ciężko jest go zrozumieć i modyfikować, bo zaczynasz od złej strony...
Moim zdaniem najpierw powinieneś zacząć od sprawdzenia warunku czy jakaś pozycja jest już otwarta - jeśli nie to dopiero wtedy analizować czy i jaką pozycję otworzyć.
Inna sprawa to czy na pewno powinieneś analizować otwarte zlecenia czy te zamknięte? Looknij sobie jakie argumenty przyjmuje OrderSelect i zastanów się, czy nie lepiej byłoby wybierać i analizować zamknięte pozycje...

Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Re: Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

Co to znaczy zwiększana stawka zlecenia? O_o
Miałem na myśli zwiększenie LotSize ;-)
A co do OrdersSelect to nie kumam za bardzo jak oznaczać zlecenia.

-- Dodano: 04 mar 2014, 23:14 --

Proszę o podpowiedź co jest nie tak w kodzie że nie zmienia LotSize.

Kod: Zaznacz cały

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
extern double TakeProfit=60;
extern double StopLoss=60;
extern double LotSize=0.3;
double bid_price;
double pips;
double Change_LotSize;
extern double step_of_pips=60;
double FAccount;
int x;
int OnInit()
  {
   double ticksize = MarketInfo(Symbol(),MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001)
       pips = ticksize*10;
   else pips= ticksize;
        bid_price=Bid;
        FAccount=AccountBalance();
   return(INIT_SUCCEEDED);
  }


void start()
   { if(Change_LotSize>0.2)Change_LotSize=0;

     if (OrdersTotal()==0)
     { 
  
    if (Ask>bid_price+step_of_pips*pips)
      {   OrderSend(Symbol(),OP_BUY,LotSize+Change_LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,0,0,Green); 
          bid_price=bid_price+step_of_pips*pips;
          if(OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)==True){
          if(OrderClosePrice()<OrderOpenPrice())Change_LotSize=Change_LotSize+0.1;
          if(OrderClosePrice()>OrderOpenPrice())Change_LotSize=0;}
         
         }
   
    if (Bid<bid_price-step_of_pips*pips)
      {  
          OrderSend(Symbol(),OP_SELL,LotSize+Change_LotSize,Bid,3,Bid+(StopLoss*pips),Bid-(TakeProfit*pips),NULL,0,0,Red);
          bid_price=bid_price-step_of_pips*pips;
          if(OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)==True){
          if(OrderClosePrice()>OrderOpenPrice())Change_LotSize=Change_LotSize+0.1;
          if(OrderClosePrice()<OrderOpenPrice())Change_LotSize=0;}
        
        }
  }}

 
  

WojtexWay
Gaduła
Gaduła
Posty: 145
Rejestracja: 18 wrz 2012, 19:22

Re: Pomoc MQL4

Nieprzeczytany post autor: WojtexWay »

Nie wiem jak długo uczysz się programować, ale powinieneś wiedzieć, że kluczową sprawą jest dodawanie komentarzy - i nie robisz tego tylko dla siebie, ale również (a może przede wszystkim) dla innych, którzy (w dodatku na Twoją prośbę) muszą analizować ten kod. W Twoim przypadku jest to szczególnie istotne, bo tak jak powiedziałem wcześniej, ten kod jest pisany do góry nogami i ciężko się w nim odnaleźć (i stwierdzić co autor maił na myśli).
Dodawanie komentarzy pomorze Ci również odnaleźć miejsca, gdzie logika zaczyna przegrywać z chaosem ;)

Druga sprawa jest taka, że masz straszny bałagan w kodzie i nie stosujesz żadnych konwencji programowania. Najbardziej irytują mnie klamry, które są u Ciebie raz na końcu instrukcji raz w oddzielnej linii a jeszcze gdzie indziej dwie obok siebie O_o. Przyjmij sobie jakieś standardy kodowania i się ich trzymaj. Najlepiej, by każda klamra była w oddzielnej linii - bo się pogubić można. Nie rób również czegoś takiego, że instrukcje po if-ie wpisujesz w tej samej linii co if. Każda instrukcja powinna być w osobnej linii. I pamiętaj, by zawsze stosować wcięcia po if-ie i w pętlach - szczególnie jak nie stosujesz klamer.

Pomocne (i praktyczne) byłoby również używanie bardziej intuicyjnych nazw zmiennych. Np. powiedz mi czym jest x i po co je utworzyłeś jeśli w ogóle z niego nie korzystasz (poza funkcją OrderSelect, gdzie zawsze ma taką samą wartość)?
Powinieneś również wiedzieć, że jeśli chcesz analizować historyczne pozycje to pierwsza otwarta pozycja ma index 0 a ostatnia zamknięta N-1, gdzie N to liczba zamkniętych transakcji. Więc w tym wypadku korzystanie ze zmiennej x (która jest równa 0) w funkcji OrderSelect jest raczej nieuzasadnione. Powinieneś zainteresować się w tym wypadku funkcją OrdersHistoryTotal().

Nie wiem skąd czerpiesz wiedzę na temat MQL4, ale na stronie bossy masz w miarę dobrze opisane te funkcje: http://bossa.pl/index.jsp?layout=2&page ... at_id=1354

David_Plavko
Gaduła
Gaduła
Posty: 132
Rejestracja: 27 sie 2011, 13:10

Re: Pomoc MQL4

Nieprzeczytany post autor: David_Plavko »

1.Otóż, istnieje funkcja sprawdzająca czy zlecenie było profitowe, przeanalizuj kod i domyśl się które to.
2. Nauczyłeś się już używać instrukcji warunkowej if, teraz przyszedł czas na else ;)
3. Na temat OrderHistoryTotal() masz napisane w poprzednim poście, Twoje zadanie to sprawdzić dlaczego odejmuję jeden.

Kolejnym zadaniem, może być przerobienie EA tak, aby nie zamykało pozycji która jest zyskowna (zgadnij, którą funkcją to możesz łatwo zrobić), lecz przestawiało SL ;)

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
extern double TakeProfit=60;
extern double StopLoss=60;
extern double LotSize=0.3;


double bid_price;
double pips;
double Change_LotSize;
extern double step_of_pips=60;
double FAccount;
int x;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   double ticksize=MarketInfo(Symbol(),MODE_TICKSIZE);
   if(ticksize==0.00001 || ticksize==0.001)
      pips = ticksize*10;
   else pips= ticksize;
   bid_price=Bid;
   FAccount=AccountBalance();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Change_LotSize>0.2)Change_LotSize=0; 

   if(OrdersTotal()==0)
     {

      if(Ask>bid_price+step_of_pips*pips)
        {
         OrderSend(Symbol(),OP_BUY,LotSize+Change_LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,0,0,Green);
         bid_price=bid_price+step_of_pips*pips;
         if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==True)
           {
            if(OrderProfit() > 0 )Change_LotSize=Change_LotSize+0.1;
            else Change_LotSize=0;
           }

        }

      if(Bid<bid_price-step_of_pips*pips)
        {
         OrderSend(Symbol(),OP_SELL,LotSize+Change_LotSize,Bid,3,Bid+(StopLoss*pips),Bid-(TakeProfit*pips),NULL,0,0,Red);
         bid_price=bid_price-step_of_pips*pips;
         if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==True)
           {
            if(OrderProfit() > 0 )Change_LotSize=Change_LotSize+0.1; 
            else Change_LotSize=0;
           }

        }
     }}
//+------------------------------------------------------------------+

Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Re: Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

Bardzo dziękuje za podpowiedzi wszystko przeanalizuję i będę stosował w moich EA :-)
A jeśli chodzi o mój staż w programowaniu to jest zaledwie kilku dniowy stąd pewnie ten bałagan i brak poprawności w kodzie.

-- Dodano: 05 mar 2014, 13:05 --

Oto poprawiony i sprzątnięty Kod :-)

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
extern double TakeProfit=60;
extern double StopLoss=60;
extern double LotSize=0.3;
double bid_price;
double pips;
double Change_LotSize;
extern double step_of_pips=60;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   double ticksize=MarketInfo(Symbol(),MODE_TICKSIZE);
   
   if(ticksize==0.00001 || ticksize==0.001)
      pips = ticksize*10;
   else pips= ticksize;
        
   bid_price=Bid;
 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  { 
  
//Wybiera ostatnią zamkniętą pozycje
    if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==True) 
      { 
//Jeżeli pozycja zyskowna to Change_LotSize+0.1
       if(OrderProfit()>0 )                                                  
          Change_LotSize=Change_LotSize+0.1;                                                                          
//Jeżeli pozycja stratna to Change_LotSize=0
       else 
          Change_LotSize=0;                                                  
      }
       
                                                        
//Jeżeli Change_LotSize > 0.1 to Change_LotSize=0 
   if(Change_LotSize>0.1)                                                                                                   
      Change_LotSize=0; 
//Jeżeli nie ma zleceń otwartych
   if(OrdersTotal()==0)                                                      
     {
//Warunek Kup     
      if(Ask>bid_price+step_of_pips*pips)                                    
         buy();
//Warunek Sprzedaj        
      if(Bid<bid_price-step_of_pips*pips)                                    
         sell();
     }

   }

//+------------------------------------------------------------------+

     void buy()
      { 
        OrderSend(Symbol(),OP_BUY,LotSize+Change_LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,0,0,Green);
        bid_price=bid_price+step_of_pips*pips;
      }
      
     void sell()
      { 
        OrderSend(Symbol(),OP_SELL,LotSize+Change_LotSize,Bid,3,Bid+(StopLoss*pips),Bid-(TakeProfit*pips),NULL,0,0,Red);
        bid_price=bid_price-step_of_pips*pips;
      }
Tylko nie rozumiem czemu jak zamienię kod na taki

Kod: Zaznacz cały

 
//Jeżeli pozycja zyskowna to Change_LotSize=0
       if(OrderProfit()>0 )                                                  
        Change_LotSize=0;                                                                       
//Jeżeli pozycja stratna to  Change_LotSize+0.1
       else 
       Change_LotSize=Change_LotSize+0.1;
          
to nie działa prawidłowo Hmmm?

ODPOWIEDZ