Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

mikolaj2 pisze:Witam! Czy możliwe jest stworzenie warunku, który spełni się po : najpierw przecięcie dwóch średnich, a następnie odczekanie do końca formowania świecy, aby sprawdzić czy była rosnąca czy malejąca i dopiero wtedy zawarcie transakcji?

Do głowy przychodzi mi coś takiego :

Kod: Zaznacz cały

if((MathAbs(Open[1]-Close[1])>(5*Point))&&(Open[1]-Close[1]<0)&&(srednia1==srednia2)){
Jednakże powyższy kod działa dla świecy ubiegłej a nie przyszłej...
czekasz do konca formowania sie swiecy, czyli do jej zamkniecia, tak ?
czyli jesli swieca sie zamknela, to otwierasz pozycje z pierwszym tickiem nowej swiecy, tak ?

w takim wypadku - obecna, nowa swieca ma numer 0 a ta dla ktorej robiles obliczenia ma juz numer 1. czyli:
aby sprawdzic czy srednie sie w czasie zycia swiecy nr 1 przeciely, to musisz zbadac ich wartosci i wzajemne polozenie zarowno dla swiecy 1 jak i 2:
srednia11=iMA(....,1) // to jest srednia1 na swiecy nr 1
srednia12=iMA(....,2) // to jest srednia1 na swiecy nr 2
srednia21=iMA(....,1) // to jest srednia2 na swiecy nr 1
srednia22=iMA(....,2) // to jest srednia2 na swiecy nr 2

jesli teraz srednia12 > srednia22 && srednia11<srednia21 to znaczy ze sie przeciely "w dol" przy odwrotnym kierunku znakow wiekszosci sprawdzimy przeciecie "w gore".

teraz trzeba tylko zbadac czy swieca nr. 1 byla rosnaca czy malejaca, dodatkowo czy byla "odpowienio duza": (MathAbs(Open[1]-Close[1])>(5*Point))
i juz.

jesli chcesz jednak otworzyc pozycje koniecznie na koniec obecnej swiecy, a nie na poczatku nowej - to warunki sa dokladnie takie same tylko index bedzie odpowiednio 0 i 1.

Lite
Bywalec
Bywalec
Posty: 15
Rejestracja: 01 maja 2008, 14:17

Nieprzeczytany post autor: Lite »

Hej, mam wydaje mi się dość prosty problem związany z error 4108, ktory dotyczy nieprawidlowego ticketa. Mianowicie na podstawie okreslonych zalozen otwieram 3 pozycje, ktore nazywam okreslonymi ticketami:

Kod: Zaznacz cały

if(iClose(Rynek,PERIOD_H1,2) > greenveg2 && iClose(Rynek,PERIOD_H1,1) < greenveg1 && iClose(Rynek,PERIOD_H1,1) > bluevegD5)//jezeli zamkniecie w pierwszej strefie
               {
               
               if(Trend_downV == "true" && Trend_downS == "true")
                     {
                     
                     Ticket1 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                     
                     Ticket2 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                     
                     Ticket3 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
Nastepnie odwolujac sie do tych wartosci (ticket1, ticket2, ticket3) chce je zamknac - SL nie wchodzi tutaj w gre. No i niestety przy funkcji OrderClose w ogole nie rozpoznaje mi tej wartosci Ticket1,2,3.:

Kod: Zaznacz cały

if(iClose(Rynek,PERIOD_H1,1) < bluevegD5 && iClose(Rynek,PERIOD_H1,1) > bluevegD6){//jezeli II strefa
         Print("zamknij ostatnia pozycje");
         
            
            OrderSelect(Ticket1,SELECT_BY_TICKET);
            Print("zaznaczyłem=",Ticket1);
            OrderClose(Ticket1,1,Bid,3);
Probowalem naprawde roznymi metodami, lacznie z iteracja za pomoca funkcji for, zeby wyszukal mi konrektny ticket na bazie pętli, no ale też nie pomaga- zamyka wszystkie naraz. Proszę o podpowiedź jak wyszukać tę jedną konkretną pozycję, tak aby orderclose ja zamknęla. Kwestia zamkniecia wszystkich naraz nie stanowi problemu. Z gory dziekuje.

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

trudno cos powiedziec bez calego kodu - ale przyczyny moga byc rozne, np.:

1. sprawdz, czy zmienne Ticket1,2,3 masz zadeklarowane na pewno jako integer i jako zmienne globalne.

2. gdzies w kodzie wartosci te sa zerowane i system nie potrafi znalezc ci otwartych pozycji o numerze ticketu = 0.

3. masz zmienne Ticket zadeklarowane jako globalne, oraz jako lokalne wewnatrz funkcji zamykajacej pozycje.

4. ??????

Sprawdz kod pod tym kontem....

Lite
Bywalec
Bywalec
Posty: 15
Rejestracja: 01 maja 2008, 14:17

Nieprzeczytany post autor: Lite »

Kod: Zaznacz cały

#property copyright "Copyright ˆ 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern string Rynek = "EURUSD";
int Ticket1;
int Ticket2;
int Ticket3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

int OpenBuyOrders = 0;
int OpenSellOrders = 0;
int OpenBuyStopOrders = 0;
int OpenSellStopOrders = 0;
int Pozycje_rynkowe = 0;
int Pozycje_oczekujace = 0;


double lastopentime=0;
int lastopenedordertype;
double lastorderprice2;



//**********************************************************************************************************
// zliczanie pozycji rynkowych oraz pozycji oczekujacych
//**********************************************************************************************************

   int cnt; 

   for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { 
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if (OrderType() == OP_BUY && OrderSymbol()==Rynek)
         OpenBuyOrders++;      
       if (OrderType() == OP_SELL && OrderSymbol()==Rynek)
         OpenSellOrders++;
       if (OrderType() == OP_BUYSTOP && OrderSymbol()==Rynek)
         OpenBuyStopOrders++;
       if (OrderType() == OP_SELLSTOP && OrderSymbol()==Rynek)
         OpenSellStopOrders++;
   }
   
   Pozycje_rynkowe = OpenBuyOrders + OpenSellOrders;
   Pozycje_oczekujace = OpenBuyStopOrders + OpenSellStopOrders;
   
//**********************************************************************************************************
//okreslenie kryteriow handlowych
//**********************************************************************************************************


//wskaźniki vegasowe

double greenveg1 = iCustom(Symbol(),NULL,"vegasik",0,1);
double greenveg2 = iCustom(Symbol(),NULL,"vegasik",0,2);
double greenveg3 = iCustom(Symbol(),NULL,"vegasik",0,3);


double blueveg1 = iCustom(Symbol(),NULL,"vegasik",1,1);
double blueveg2 = iCustom(Symbol(),NULL,"vegasik",1,2);
double blueveg3 = iCustom(Symbol(),NULL,"vegasik",1,3);

double bluevegD2 = iCustom(Symbol(),NULL,"vegasik",2,1);//=======
double bluevegD3 = iCustom(Symbol(),NULL,"vegasik",3,1);//powyzej
double bluevegD4 = iCustom(Symbol(),NULL,"vegasik",4,1);//=======
double bluevegD5 = iCustom(Symbol(),NULL,"vegasik",5,1);//======
double bluevegD6 = iCustom(Symbol(),NULL,"vegasik",6,1);// ponizej
double bluevegD7 = iCustom(Symbol(),NULL,"vegasik",7,1);//======

string Trend_upV = "false";
string Trend_downV = "false";

if(greenveg1 >= greenveg2 && blueveg1 >= blueveg2)
{
Trend_upV = "true";
}

if(greenveg1 <= greenveg2 && blueveg1 <= blueveg2)
{
Trend_downV = "true";
}
   
   
   
// wskaźnik slope direction line

double SDL1 = iCustom(Symbol(),0,"direction line",0,1);//uptrend
double SDL2 = iCustom(Symbol(),0,"direction line",1,1);//downtrend


string Trend_upS = "false";
string Trend_downS = "false";

if(SDL1 > 0 && SDL1 != EMPTY_VALUE)
   {
   Trend_upS = "true";
   }

if(SDL2 > 0 && SDL2 != EMPTY_VALUE)
   {
   Trend_downS = "true";
   }   
   
//===============================================================================================================
//==============================================================================================================     
   
if(Pozycje_rynkowe == 0)
      {

      //=============================SELL===============================================//
      
      if(iClose(Rynek,PERIOD_H1,2) > greenveg2 && iClose(Rynek,PERIOD_H1,1) < greenveg1 && iClose(Rynek,PERIOD_H1,1) > bluevegD5)//jezeli zamkniecie w pierwszej strefie
               {
               
               if(Trend_downV == "true" && Trend_downS == "true")
                     {
                     
                     Ticket1 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                     
                     Ticket2 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                     
                     Ticket3 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                     
                     }
               }
      if(iClose(Rynek,PERIOD_H1,2) > greenveg2 && iClose(Rynek,PERIOD_H1,1) < bluevegD5 && iClose(Rynek,PERIOD_H1,1) > bluevegD6)//jezeli zamkniecie w drugiej strefie
               {
              // Print("otwórz2",Trend_downV);
               if(Trend_downV == "true" && Trend_downS == "true")
                     {
                     
                     Ticket1 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                     Ticket2 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                    
                     }
               }
        
      if(iClose(Rynek,PERIOD_H1,2) > greenveg2 && iClose(Rynek,PERIOD_H1,1) < bluevegD6 && iClose(Rynek,PERIOD_H1,1) > bluevegD7)//jezeli zamkniecie w trzeciej strefie
               {
                //Print("otwórz3",Trend_downV);
               if(Trend_downV == "true" && Trend_downS == "true")
                     {
                    
                     Ticket1 = OrderSend(Rynek,OP_SELL,1,Bid,5,0,0);
                                         
                     }
               }
        
      //==================================BUY=====================================//  
          
      if(iClose(Rynek,PERIOD_H1,2) < blueveg2 && iClose(Rynek,PERIOD_H1,1) > blueveg1 && iClose(Rynek,PERIOD_H1,1) < bluevegD2)//jezeli zamkniecie w pierwszej strefie
               {
               
               if(Trend_upV == "true" && Trend_upS == "true")
                     {
                    
                     Ticket1 = OrderSend(Rynek,OP_BUY,1,Ask,5,0,0);
                     Ticket2 = OrderSend(Rynek,OP_BUY,1,Ask,5,0,0);
                     Ticket3 = OrderSend(Rynek,OP_BUY,1,Ask,5,0,0);
                     }
               } 
      if(iClose(Rynek,PERIOD_H1,2) < blueveg2 && iClose(Rynek,PERIOD_H1,1) > bluevegD2 && iClose(Rynek,PERIOD_H1,1) < bluevegD3)//jezeli zamkniecie w drugiej strefie        
               {
               
               if(Trend_upV == "true" && Trend_upS == "true")
                     {
                    
                     Ticket1 = OrderSend(Rynek,OP_BUY,1,Ask,5,0,0);
                     Ticket2 = OrderSend(Rynek,OP_BUY,1,Ask,5,0,0);
                   
                     }
               } 
       
      if(iClose(Rynek,PERIOD_H1,2) < blueveg2 && iClose(Rynek,PERIOD_H1,1) > bluevegD3 && iClose(Rynek,PERIOD_H1,1) < bluevegD4)//jezeli zamkniecie w trzeciej strefie
               {
               
               if(Trend_upV == "true" && Trend_upS == "true")
                     {
                    
                     Ticket1 = OrderSend(Rynek,OP_BUY,1,Ask,5,0,0);
                
                   
                     }
               } 
       }
 
 //===============================================================================================================
 //==============================================================================================================     
      
if(Pozycje_rynkowe == 3)//oznacza to ze zawarte zostaly w pierwszej strefie, 
{
for(cnt = 0; cnt < OrdersTotal(); cnt++) {
         
            if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderOpenTime()>lastopentime && OrderType() <= 1) {
            lastopentime = OrderOpenTime();
            lastopenedordertype = OrderType();
            lastorderprice2 = OrderOpenPrice();
            
            }
      }//for
           
   if(lastopenedordertype == 0){//dla BUY || 
 
           
   
         if(iClose(Rynek,PERIOD_H1,1) > bluevegD2 && iClose(Rynek,PERIOD_H1,1) < bluevegD3){//jezeli II strefa
         //zamknij ostatnia pozycje
            if(OrderSelect(Ticket1,SELECT_BY_TICKET)==true){
            OrderClose(Ticket1,1,Bid,3);
            }
         }
         
         if(iClose(Rynek,PERIOD_H1,1) > bluevegD3 && iClose(Rynek,PERIOD_H1,1) < bluevegD4){//jezeli III strefa
         //zamknij ostatnie dwie pozycje
               if(OrderSelect(Ticket1,SELECT_BY_TICKET)==true){
               OrderClose(Ticket1,1,Bid,3);
               }
               if(OrderSelect(Ticket2,SELECT_BY_TICKET)==true){
               OrderClose(Ticket2,1,Bid,3);
               }
        }
        
        if(iClose(Rynek,PERIOD_H1,1) > bluevegD4){//jezeli IV strefa
        //zamknij wszystkie trzy pozycje
               if(OrderSelect(Ticket1,SELECT_BY_TICKET)==true){
               OrderClose(Ticket1,1,Bid,3);
               }
               if(OrderSelect(Ticket2,SELECT_BY_TICKET)==true){
               OrderClose(Ticket2,1,Bid,3);
               }
               if(OrderSelect(Ticket3,SELECT_BY_TICKET)==true){
               OrderClose(Ticket3,1,Bid,3);
               }
        }
        
        if(iClose(Rynek,PERIOD_H1,1) < bluevegD5){//Stop loss
               if(OrderSelect(Ticket1,SELECT_BY_TICKET)==true){
               OrderClose(Ticket1,1,Bid,3);
               }
               if(OrderSelect(Ticket2,SELECT_BY_TICKET)==true){
               OrderClose(Ticket2,1,Bid,3);
               }
               if(OrderSelect(Ticket3,SELECT_BY_TICKET)==true){
               OrderClose(Ticket3,1,Bid,3);
               }
        }
   }
   
   if(lastopenedordertype == 1){//dla SELL
   
         if(iClose(Rynek,PERIOD_H1,1) < bluevegD5 && iClose(Rynek,PERIOD_H1,1) > bluevegD6){//jezeli II strefa
         Print("zamknij ostatnia pozycje");
         
            
            OrderSelect(Ticket1,SELECT_BY_TICKET);
            Print("zaznaczyłem=",Ticket1);
            OrderClose(Ticket1,1,Bid,3);
            
            
            
         }
         
         if(iClose(Rynek,PERIOD_H1,1) < bluevegD6 && iClose(Rynek,PERIOD_H1,1) > bluevegD7){//jezeli III strefa
         Print("zamknij ostatnie dwie pozycje");
                
               
               OrderSelect(Ticket1,SELECT_BY_TICKET);
               Print("zaznaczyłem=",Ticket1);
               OrderClose(Ticket1,1,Bid,3);
              
               OrderSelect(Ticket2,SELECT_BY_TICKET);
               OrderClose(Ticket2,1,Bid,3);
               
               
        }
        
        if(iClose(Rynek,PERIOD_H1,1) < bluevegD7){//jezeli IV strefa
         Print("zamknij ostatnie trzy pozycje");
                
               OrderSelect(Ticket1,SELECT_BY_TICKET);
               Print("zaznaczyłem=",Ticket1);
               OrderClose(Ticket1,1,Bid,3);
               
               OrderSelect(Ticket2,SELECT_BY_TICKET);
               OrderClose(Ticket2,1,Bid,3);
               
               OrderSelect(Ticket3,SELECT_BY_TICKET);
               OrderClose(Ticket3,1,Bid,3);
               
               
        }
        
        if(iClose(Rynek,PERIOD_H1,1) > bluevegD2){
        Print("Stop loss");
                 
               if(OrderSelect(Ticket1,SELECT_BY_TICKET)==true){
               Print("zaznaczyłem=",Ticket1);
               OrderClose(Ticket1,1,Bid,3);
               }
               
               if(OrderSelect(Ticket2,SELECT_BY_TICKET)==true){
               OrderClose(Ticket2,1,Bid,3);
               }
               if(OrderSelect(Ticket3,SELECT_BY_TICKET)==true){
               OrderClose(Ticket3,1,Bid,3);
               }
               
        }
        
         
   
   }
   
 
 }
Zalaczam wiekosc kodu. Bardzo prosze o pomoc. Bede wdzieczny. Ticket jest zmienna globalna i ponadto jest integer'em, jak widzisz. Pozdrawiam[/code]

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

sluchaj - a zawsze probujesz zamknac pozycje zarowno dla Buy jak i dla Sell po cenie Bid ?

czy

Kod: Zaznacz cały

Print("zaznaczyłem=",Ticket1); 
zwraca ci prawidlowy numer ticketa czy zwraca jakas dziwna wartosc ?

bo nie zauwazylem, w ktorym miejscu zerujesz wartosci zmiennych Ticket - nawet na poczatku nie wpisales im zadnej wartosci i - jak mniemam - zmienne te przybraly losowa wartosc.

Lite
Bywalec
Bywalec
Posty: 15
Rejestracja: 01 maja 2008, 14:17

Nieprzeczytany post autor: Lite »

wlasnie sęk w tym ze jezeli wyprintuje sobie wartosci Ticket1, to w kazdym, doslownie w kazdym momencie wyrzuca poprawna wartosc, az do momentu, kiedy wchodzi funkcja orderclose. To tak jakby orderclose cos mieszalo w odczytywaniu wartosci Ticket1.
Probowalem zamieniac aski z bidami i tez nic nie daje.
Co masz na mysli poprzez zerowanie Ticketow? Musze wyzerowac za kazdym razem w wartosciach globalnych tickety? Czyli nadac im int Ticket1 = 0;?
Sprobowalem bez rezultatu.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Lite pisze:Probowalem zamieniac aski z bidami i tez nic nie daje.
nie prubuj tylko zamien bo to i tak Ci nic nie da ;)

OP_BUY - open ASK, close BID
OP_SELL- open BID,close ASK

sugerowal bym tez zamiast uzywac Bid i Ask skorzystać z MarketInfo(...,MODE_BID);
skoro Symbol podjesz jako zmienna

i na koniec .. po uzyciu OrderSelect(Ticket1,.....);
sprubuj tak :

Kod: Zaznacz cały

OrderClose(OrderTicket(),OrderLots(),....);
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Lite
Bywalec
Bywalec
Posty: 15
Rejestracja: 01 maja 2008, 14:17

Nieprzeczytany post autor: Lite »

Poprawiłem i obecnie kod wygląda w ten sposób:

Kod: Zaznacz cały

if(iClose(Rynek,PERIOD_H1,1) < bluevegD5 && iClose(Rynek,PERIOD_H1,1) > bluevegD6){//jezeli II strefa
         Print("zamknij ostatnia pozycje");
         
            
            OrderSelect(Ticket1,SELECT_BY_TICKET);
            Print("zaznaczyłem=",Ticket1);
            Print("cena=",OrderOpenPrice());
            OrderClose(OrderTicket(),OrderLots(),Ask,3);
Niestety wciąż pojawia się błąd związany z ticketem 4108. Dla sprawdzenia czy zwraca wartości dzieki funkcji orderselect, okazuje sie ze zwraca = ticket wynosi 1 natomiast orderopenprice zwraca poprawne wartosci 1.4389. Wciaz czegos nie kuma funkcja orderclose i za cholere nie wiem o co chodzi. Jest to irytujace.

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

pozycje Buy zawsze zamykamy po cenie Bid, a Sell po cenie Ask
jesli kiedykolwiek masz jakies watpliwosci to sprawdz to sobie tu:
http://book.mql4.com/trading/orders

co do zerowania zmiennych Ticket to sugerowalbym to robic po zamknieciu pozycji - w przeciwnym wypadku zmienne beda wciaz przechowywaly numery ticketow z poprzednich tradow - a o ile zdazylem sie zapoznac z twoim systemem, to warunkowo otwierasz 1, 2 lub trzy pozycje.

no dobra - jesli jednak piszesz, ze Print zwraca ci prawidlowy numer ticketu a pomimo to OrderClose z tym samym ticketem nie chce ci zamknac pozycji, a rownoczesnie numer zwracanego bledu to jest 4108 to oznaczaloby to, ze byc moze odwolujesz sie do pozycji znajdujacej sie na liscie pozycji juz zamknietych... i dlatego nie mozesz ich zamknac.... sprobuj dodac parametr MODE_TRADES i sprobuj jednak je wyszukiwac z posrod pozycji otwartych przy pomocy SELECT_BY_POS.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

CoVal pisze:sprobuj dodac parametr MODE_TRADES
mialem to samo zasugerowac ;)

bo moze zamykasz juz zaknieta tranzakcje ;)

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ODPOWIEDZ