EA oczekujące pomoc

O jezykach programowania w platformach i nie tylko.
Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

EA oczekujące pomoc

Nieprzeczytany post autor: Kris82 »

Witam, mam problem z napisaniem EA które by otwierało dwie przeciwstawne pozycje oczekujące na poziomie 50 i - 50 pipsów od ceny zamknięcia wcześniejszej świeczki oraz trailingstopem 30, oraz aby zlecenia oczekujące które nie zostały aktywowane(wykonało się zlecenie) zostały skasowane z nadejściem kolejnej świeczki.
Jak na razie udało mi się napisać coś takiego, nie wiem w czym tkwi problem ponieważ ten kod nawet nie chce otwierać tej jednej pozycji:

Kod: Zaznacz cały

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

extern double trailingstop = 0.0030;

int init()
  {
   
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int total; 
   total=OrdersTotal();
   if (total > 1)
   {
   double otw = Close[1]
   int OrderSend(Symbol(),OP_BUYSTOP,0.1,otw + 0,0050,3,Bid-30*Point,Bid+30*Point);
   
  }
  }

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

Nieprzeczytany post autor: Tig3r »

Kris82 pisze:problem ponieważ ten kod nawet nie chce otwierać tej jednej pozycji:

int OrderSend(Symbol(),OP_BUYSTOP,0.1,3,otw + 0,0050,otw-30*Point,"",1);
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
mah1y
Pasjonat
Pasjonat
Posty: 669
Rejestracja: 30 sty 2011, 22:01

Nieprzeczytany post autor: mah1y »

Kris82 nie chce ci mieszac niepotrzebnie w glowie bo nie wiem jakie masz pojecie o programowaniu ale ja do takich prostych EA uzywam tej aplikacji:
http://strategytune.com/app/

mozna sobie pozniej popatrzec w kod i zobaczyc jak powinno wygladac piszac w jezyku MQL4 - dobra sciagawka

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

Re: EA oczekujące pomoc

Nieprzeczytany post autor: CoVal »

Kris82 pisze:Witam, mam problem z napisaniem EA które by otwierało dwie przeciwstawne pozycje oczekujące na poziomie 50 i - 50 pipsów od ceny zamknięcia wcześniejszej świeczki oraz trailingstopem 30, oraz aby zlecenia oczekujące które nie zostały aktywowane(wykonało się zlecenie) zostały skasowane z nadejściem kolejnej świeczki.
Jak na razie udało mi się napisać coś takiego, nie wiem w czym tkwi problem ponieważ ten kod nawet nie chce otwierać tej jednej pozycji:

Kod: Zaznacz cały

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

extern double trailingstop = 0.0030;

int init()
  {
   
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int total; 
   total=OrdersTotal();
   if (total > 1)
   {
   double otw = Close[1]
   int OrderSend(Symbol(),OP_BUYSTOP,0.1,otw + 0,0050,3,Bid-30*Point,Bid+30*Point);
   
  }
  }
ten kod nie powinien ci sie nawet poprawnie skompilowac w takie postaci jak tu zaprezentowales.

1. pamietaj o srednikach konczacych kazda linie (czyli np po: double otw = Close[1])
2. int ticket=OrderSend(...) albo w ogole bez przypisania wartosci zwracanej przez OrderSend() do jakiekolwiek zmiennej - w takiej postaci jak masz teraz to chyba nie powinno dzialac.

3. no i wreszcie - nie otworzy ci zadnej pozycj, bo to co sprawdzasz w warunku:
total=OrdersTotal();
if (total > 1)
{ ... }
to mozna przetlumaczyc jako:
jesli ilosc otwartych pozycji jest wieksza niz 1, to....wykonaj to co w klamrach....
ale TY NIE MASZ na poczatku otwartej zadnej pozycji... wiec ten warunek nigdy nie bedzie spelniony - czytaj nie otworzy ci zadnej pozycji.

to tyle na poczatek - nie sprawdzalem poprawnosci parametrow OrderSend,

EduSystem
Stały bywalec
Stały bywalec
Posty: 29
Rejestracja: 23 wrz 2011, 13:42

Nieprzeczytany post autor: EduSystem »

Przykładowa instrukcja :

Kod: Zaznacz cały

OrderSend(Symbol(),OP_BUYSTOP,ldLot,Ask+nadwyzka*myPoint,Slippage,ldStop,ldTake,lsComm,OrderMagicNumber(),expire,clOpenBuy); 
Technika Ichimoku

Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

Nieprzeczytany post autor: Kris82 »

Przede wszystkim chciałbym podziękować za zainteresowanie się tematem.
Poprawiłem trochę to EA i wprowadziłem kilka zmian i wyszło coś takiego:

Kod: Zaznacz cały

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


extern double Lots=0.1;
extern double TakeProfit=0;
extern double TrailingStop=20;
int ThisBarTrade=0;
extern double down = Close[1]-50*Point;
extern double up = Close[1]+50*Point;

int init()
  {
   
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
      {
      
      int ticket,total;
     
      if(Bars<30)
          { 
           Print("Za malo danych");
           return(0);
      } 
      
      if(OrdersTotal()<1) 
      
      {
      if (Bars != ThisBarTrade ) 
       {
         ThisBarTrade = Bars;  
   
        if(AccountFreeMargin()<1000*Lots) 
           {
             Print("Free Margin = ",AccountFreeMargin());
            return(0);
            }
               
              int Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,down,0,Blue);
              int Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,up,0,Red);
               
               if(ticket>0) 
                  {   
                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                  Print("Zlecenie otwarte : ",OrderOpenPrice());
           }
        return(0);
     }
     return(0);
    }
  return(0);
  }
Niestety pojawiło się pełno błędów z którymi mam problem nie wspominając o samych zleceniach. Nie wiem jak ten problem ugryść.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Kod: Zaznacz cały

extern double down = Close[1]-50*Point;
extern double up = Close[1]+50*Point; 
To tak nie zadziała. Musi być wewnątrz funkcji start().

Kod: Zaznacz cały

int Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,down,0,Blue);
              int Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,up,0,Red); 
Dwa razy nie można deklarować zmiennej o tej samej nazwie.(ticket)

Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

Nieprzeczytany post autor: Kris82 »

Zmieniłem kod powinno być wszystko w porządku ale cały czas wyskakuje mi błąd zamknięcia. Prawdopodobnie chodzi o klamrę } ale nie wiem gdzie ją dać już przepatrzyłem prawie wszystkie opcje :roll:

Kod: Zaznacz cały

extern double takeprofit = 10;

int init() 
  { 
    
   return(0); 
  } 
//+------------------------------------------------------------------+ 
//| expert deinitialization function                                 | 
//+------------------------------------------------------------------+ 
int deinit() 
  { 
//---- 
    
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+ 
//| expert start function                                            | 
//+------------------------------------------------------------------+ 
int start() 
  { 
   int total; 
   total=OrdersTotal(); 
   if (total < 1) 
   
   double ldStop=0, ldTake=0; 
   double otw = Close[1]+50*Point; 
   
   int ticket = OrderSend(Symbol(),OP_BUYSTOP,otw, ldStop, ldTake);
   
    
   
  	return (0);
  	
}

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

Nieprzeczytany post autor: CoVal »

Kris82 pisze:Zmieniłem kod powinno być wszystko w porządku ale cały czas wyskakuje mi błąd zamknięcia (...)
sluchaj... poczytaj troche o podstawach programowania...

wewnatrz funkcji start() stawiasz warunek:
if(total <1)

teraz to wszystko co ma zostac wykonane - jezeli ten warunek jest spelniony -powinno byc zawarte wewnatrz nawiasu klamrowego, (chyba, ze jest to tylko jedno nastepne polecienie)....

wiec jesli rozumiem to co chcesz osiagnac tutaj, to powinienes napisac:

Kod: Zaznacz cały

  if (total < 1) 
     {   
      double ldStop=0, ldTake=0; 
      double otw = Close[1]+50*Point; 
    
      int ticket = OrderSend(Symbol(),OP_BUYSTOP,otw, ldStop, ldTake); 
    }
nie chce mi sie wnikac w poprawnosc funkcji OrderSend() bo brakuje ci tam parametrow....
ale to sobie juz mozesz sprawdzic sam np. tu:

http://docs.mql4.com/trading/OrderSend

Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

Nieprzeczytany post autor: Kris82 »

Poradziłem sobie z kwestią składania zleceń oczekujących, teraz pozostało mi usuwanie zleceń oczekujących które nie zostały otwarte w poprzedniej świeczce.

Kod: Zaznacz cały

int ThisBarTrade=0;
extern double Lot=0.1;
extern int BuyStop=40;
extern int SellStop=40;
extern int TakeProfit=20;
extern int StopLoss=100;
bool orderOpened[2];
int init()
  {
 

    

   return(0);
   
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  
   if (Bars != ThisBarTrade ) 
       { 
         ThisBarTrade = Bars;  
        
         
          
            double W = Close[1];
            double OP, SL, TP;
            int id;
            
            int Ticket=OrderTicket();
            if(Ticket>0) 
                  {    
                  if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                  Print("Zlecenie otwarte : ",OrderOpenPrice());
                  }
                  
                  
                 
            OP=W+BuyStop*Point;
            TP=OP+TakeProfit*Point;
            SL=OP-StopLoss*Point;
            Ticket=OrderSend(Symbol(),4,Lot,OP,2,SL,TP,"",0); // error handling
            OP=W-SellStop*Point;
            TP=OP-TakeProfit*Point;
            SL=OP+StopLoss*Point;
            Ticket=OrderSend(Symbol(),5,Lot,OP,2,SL,TP,"",0);
            orderOpened[id]=true;
           
            }
               
                
          
                          
   return(0);
}


Dodano po 3 godzinach 41 minutach:

Hmm już nie wiem jak by to ugryźć aby kasowały się nie otwarte zlecenia oczekujące z wcześniejszej świeczki :roll:
Mam nadzieje że ktoś podpowiedział by mi jak to zrobić i czy kod jaki napisałem trzyma się kupy :lol: działać działa :)

ODPOWIEDZ