Sari la conținut

Metoda Tunel -Implementare


Postări Recomandate

Mai jos am implementat o parte din Metoda Tunel.Teoria metodei

O sa explic si linile de cod pentru a intelege incepatorii si sa fie si ei capabili sa faca experti si indicatori pe viitor.Eu acum m-am apucat de invatat mql :smile:

In prima parte a programului am declarat variabilele programului.

extern string ExpertName   =	 "Tunnel Method"; //Numele Expertului
extern int tu1_period =144; //Perioada Ema-ului care alcatuieste tunelul
extern int tu2_period=169;  //Perioada Ema-ului care alcatuieste tunelul
extern int cu_period=12;	//Perioada Ema-ului care taine sau nu tunelul
extern int StopLoss= 50;	 //Valoarea StopLoss-ului
extern int TakeProfit=0;	//Valoarea TakeProfit-ului
extern double lot=1;		//Marimea lotului
extern int Cu_method=3;	 //0 MODE_SMA Simple moving average, 
extern int Tu1_method=3;	//1 MODE_EMA Exponential moving average, 
extern int Tu2_method=3;	//2 MODE_SMMA Smoothed moving average, 
							//3 MODE_LWMA Linear weighted moving average. 
extern int Sx=0;		   //Sx/Lxpoate fi 0 sau 1 , Cand este 0 Nu exista StopLoss si nici TakeProfit
extern int Lx=0;			//Daca se pune alta valoare pretul o sa scada/creasca proportional cu valoarea aleasa.Nerecomandat!

Mai jos am pus conditile sa se numere barele si sa se vada daca sunt bani in cont.Daca nu erau bani in cont si marginea nu era suficient de mare pentru a cumpara un lot programul intorcea o eroare.

if(Bars<169)
   {									 //Numara barele si daca sunt mai putin decat numarul suficient
	  Print("Bare mai putine de 169" );  //Afiseaza mesajul daca sunt mai putine
	  return(0);
   }
   if(AccountFreeMargin()<(1*lot))									 //Daca marginea disponibila este mai mica decat marimea lui lot
   {									
	  Print("We have no money. Free Margin = ", AccountFreeMargin()); //AccountFreeMargin returneaza marginea disponibila din cont
	  return(0);
   }
Am declarat indicatorii si am definit ticket

int ticket;
   double Tu1=iMA(NULL,0,tu1_period,0,Tu1_method,PRICE_CLOSE,0); 
   double Tu2=iMA(NULL,0,tu2_period,0,Tu2_method,PRICE_CLOSE,0);
   double Cu=iMA(NULL,0,cu_period,0,Cu_method ,PRICE_CLOSE,0);
Mai jos urmeaza deschiderea ordinelor.Sunt 4 variante in care se pot deschide loturi deoarece se pot intersecta intre ele si linile care formeaza tunelul.

La inceput am pus conditia "OrdersTotal<1".Daca nu puneam conditia se deschideu ordine la fiecare miscare a pretului pana cand nu se mai putea.

 

{
	  if((Tu1>Tu2) && (Cu>Tu1))
	  {
		 ticket=OrderSend(Symbol(), OP_BUY,lot,Ask ,3,Sx*(Ask-StopLoss*Point),Lx*(Ask+TakeProfit*Point),ExpertName,0,0,Green);
		 return(0);
	  }
	  if((Tu1<Tu2) && (Cu>Tu2))
	  {
		 ticket=OrderSend(Symbol(), OP_BUY,lot,Ask ,3,Sx*(Ask-StopLoss*Point),Lx*(Ask+TakeProfit*Point),ExpertName,0,0,Green);
		 return(0);
	  }
   
	  //Ordine Short 
	  if((Tu1>Tu2) && (Cu<Tu2))
	  {
		 ticket=OrderSend(Symbol(), OP_SELL,lot,Bid,3,Sx*(Bid+StopLoss*Point),Lx*(Bid-TakeProfit*Point),ExpertName,0,0,Red);
		 return(0);
	  }
	  if((Tu1<Tu2) && (Cu<Tu1))
	  {
		 ticket=OrderSend(Symbol() ,OP_SELL,lot,Bid,3,Sx*(Bid+StopLoss*Point),Lx*(Bid-TakeProfit*Point),ExpertName,0,0,Red);
		 return(0);
	  }
   }
In ultima parte am pus conditia ca daca sunt ordine se verifica care este tipul ordinului si daca se verifica conditile inchide ordinul.

else //daca am deja order	
	{  
	   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false) return(0); //error!
	   int mode=OrderType();  //am selectat orderul, vad daca tre sa il inchid
	   if (mode==OP_BUY && ((Tu1>Tu2) && (Cu<Tu2))|| ((Tu1<Tu2) && (Cu<Tu1)))
	   OrderClose(OrderTicket(),OrderLots(),Bid,3,Aqua);
	   if (mode==OP_SELL && ((Tu1>Tu2)&& (Cu>Tu1))|| (Tu1<Tu2)&&(Cu>Tu2))
	   OrderClose(OrderTicket(),OrderLots(),Ask,3,Orange);
	}

Testat pe la 1 ianuarie 2008 pana in prezent strategia da un randament de ~70-90% fara sa fie optimizata.

Am atasat mai jos codul sursei.

In versiunea a 2a a indicatorului o sa contina optimizarea lotului.[Cea de sus tranzactioneaza cu loturi standart [1 lot]

O sa incerc sa reduc din semnalele false.Strategia da semnale false cand piata merge in range. deoarece linile care formeaza tunelui ajung aproape paralele la axa timpului.

Daca pun StopLoss cand se atinge se deschide alt ordin.

Primul ordin se deschide cand este atasat EA-ul deoarece conditile sunt indeplinite.Ar fi normal sa intre dupa ce media mobila trece deasupra sau dedesuptul tunelului.

Pentru a mari profitul o sa se inchida ordinele pe limitele fibo.

 

P.S: Acesta este numai un exemplu pentru a deprinde abilitati in mql cei care au nevoie.

Tunnel_build1.mq4

Editat de Mangusta
Link spre comentariu
Distribuie pe alte site-uri

  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

  • Moderators

Un frumos start in MQL :smile: Eu iti doresc mult succes si sa fii capabil in cateva luni sa iti implementezi expertii si indicatorii asa cum ii vrei tu!

 

Nu ma pot abtine insa sa comentez ca implementarea metodei este "un pic" gresita. Metoda teoretica tranzactioneza doar la cross-uri. Metoda ta (cea implementata) tranzactioneaza ori de cate ori linia aia de taiere (cut) este deasupra (buy) sau dedesupt (sell). In acest fel tu esti tot timpul in tranzactie, long sau short, departe de ceea ce urmareste metoda teoretica. De asta si iti lua tranzactii gramada si a fost nevoie sa testezi OrdersTotal(). Ca sa faci implementarea sa reflecte strategia teoretica, trebuie sa testezi atat bara curenta, cat si bara precedenta. Si deschizi long numai daca cut-ul a fost dedesupt pe bara precednta, si este deasupra pe bara curenta (s-a produs cross). De asemenea deschizi short... invers. In acest fel nu esti tot timpul in tranzactie.

 

Asa cum este implementata acum, sa presupunem ca ai luat un long si ala a atins TP sau SL inainte ca tunelul sa fie intersectat, in acest caz orderul e inchis, OrdersTotal() o sa intoarca zero, drept urmare, vei deschide un alt long (ca cut-ul e tot deasupra) imediat, practic ai pierdut un spread degeaba, ca sa nu mai zic ca acest al doilea long este aproape intotdeauna perdant, in special dupa ce ai dat in TP cu primul (si in consecinta ai deschis al doilea exact in punctul de maxim al cursului). De aia iti si apar dintii aia de fierastrau pe equity chart, multe tranzactii "bune" sunt urmate fiecare de cele mai multe ori de cate o tranzactie proasta.

 

ar trebui sa faci ceva de genul

 

double Tu11=iMA(NULL,0,tu1_period,0,Tu1_method,PRICE_CLOSE,0);

double Tu21=iMA(NULL,0,tu2_period,0,Tu2_method,PRICE_CLOSE,0);

double Cu1=iMA(NULL,0,cu_period,0,Cu_method ,PRICE_CLOSE,0);

 

double Tu12=iMA(NULL,0,tu1_period,0,Tu1_method,PRICE_CLOSE,1);

double Tu22=iMA(NULL,0,tu2_period,0,Tu2_method,PRICE_CLOSE,1);

double Cu2=iMA(NULL,0,cu_period,0,Cu_method ,PRICE_CLOSE,1);

 

iar la teste:

 

if ((Tu11>Tu21) && (Cu1>Tu11) && (Tu12>Tu22) && (Cu2<Tu12)) {.... etc...

 

nu stiu daca am pus exact testul, ca nu mi-am batut capul sa vad ce faci cu variabilele (voi reveni daca am timp azi, sunt f bizi la job, profit de pauza de masa acum), dar ai prins ideea, cut-ul pe bara precedenta e dedesupt, cel pe bara curenta e deasupra. Asta inseamna ca s-a produs un cross, si atunci intri long.

 

Spor!

Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

Sper ca ironia nu a fost intentionata.

 

Ma rog, nu are a face... Tu trebuie sa tranzactionezi cand linia de Cut intersecteaza una din liniile de canal. Nu intram in detalii care si cum. Deci cand face cross. Deci cum testezi cross-ul???

 

Prin analogie cu semnalele electronice (este vreun electronist pe aici?) tu tranzactionezi "level triggered", pe cand metoda teoretica este "edge triggered". Tu tre sa gasesti edge-ul. Cum?

 

Cum stii ca s-a produs un cross?

 

Ceea ce faci tu acum, sa zicem la entry long: testezi daca linia de cut este desupra liniei de canal. Si daca da, intri long. Dar linia de cut continua sa fie deasupra liniei de canal, si dupa ce s-a inchis tranzactia, daca spre exemplu a dat in SL sau in TP.

 

post-1272-1215506703_thumb.jpg

 

Spre exemplu ai deschis un buy in punctul a, pentru ca linia de cut (rosie) e deasupra liniei de canal (albastra), si ai pus un target oarecare. Cursul e negru, am figurat tranzactia ta, care da in target in punctul b. Dupa ce a dat in target, se inchide, si orderstotal() este zero. Drept urmare tu vei deschide o noua tranzactie, tot buy, pentru ca conditia pe care o teztezi tu (daca linia de cut este deasupra liniei de canal) este inca indeplinita. Acest al doilea buy este aproape intotdeauna perdant. Daca vei observa equity-graph-ul in urma rularii ST, vei vedea ca are pe el "dinti de fierastrau", aproape toate tranzactiile castigatoare sunt urmate de una perdanta. Se vede foarte bine daca setezi un target oarecare la expertul tau.

 

De remarcat ca nu conteaza daca folosesti TP sau nu, cu TP se vede mai bine, dar problema exista si cand nu folosesti TP, deoarece orderele se pot inchide si la intersectia liniei de cut cu cursul. O modificare mica a desenului de mai sus:

 

post-1272-1215507448_thumb.jpg

 

Acum intelegi? Prima intrare e buna, iese castigatoare. A doua nu mai trebuie sa o iei, pana nu se produce cross-ul urmator. I acest fel, respecti "time to rest". Nu esti mereu in tranzactie.

 

Tu deschizi ordere atat timp cat nu ai nici un order deschis, daca linia de canal e sub linia de cut. Ceea ce nu corespunde cu metoda teoretica. De aia iti deschide primul order cand pui expertul pe chart (tu insuti ai comentat ca "conditia e indeplinita", ceea ce e fals). Tu trebuie sa deschizi ordere doar cand linia de cut TAIE linia de canal. Daca un order se inchide (la SL, TP, ori intersectia liniei de canal cu cursul) tu NU MAI TREBUIE sa deschizi alt order, pana nu esti iar la canal cross. Time to rest! There is a time to buy, there is a time to sell, and there is a time to rest. In acest fel, cand vei adauga expertul pe chart, el nu va deschide un order imediat, pana nu se produce primul cross. Abia ATUNCI stii directia in care vrei sa mergi.

 

Cu conditia sa poti detecta cross-ul. Deci cum detectezi cross-ul? In mintea mea, CROSS inseamna ca linia de cut INCRUCISEAZA linia de canal. Adica in momentul actual linia de cut este PESTE linia de canal (ceea ce testezi tu) DAR SI faptul ca in momentul anterior linia de cut s-a aflat DEDESUPTUL liniei de canal. Altfel nu s-a produs nici un cross. Adica asa:

 

post-1272-1215507948_thumb.jpg

 

Adica in timpul prezent (verde, cut1 in expertul tau) linia de cut (rosie) este deasupra liniei de canal, dar in momentul de timp anterior (mov, cut2 in expertul tau, adica in modificarea mea, asta este cea de a doua serie de variabile) linia de cut a fost dedesuptul liniei de canal. Doar asa pot testa ca s-a produs cross. Daca cut-ul pe bara curenta este deasupra canalului pe bara curenta, dar cut-ul pe bara precedenta este dedesuptul canalului pe bara precedenta. Si atunci intru long, pana dau in stop, pana dau in target, ori pana vrea muschii mei. Dar nu tranzactionez long pe partea a doua a curbei (pe cadere) chiar daca conditia (in implementarea ta) continua sa fie indeplinita (adica cut-ul este tot deaupra liniei de canal, dar tre sa stau cuminte pana la urmatorul cross).

 

Intelegi ce vreau sa zic? Ai nevoie de valorile liniei de canal si a liniei de cut, atat pe bara curenta, cat si pe bara precedenta. Ca sa poti testa ca s-a produs un cross. In afara de situatia in care stochezi totul in variabile de memorie de la un tick la altul (procedeu mult mai complicat) si testezi acele variabile. Solutia cea mai simpla e sa iei o serie pe shift 0, si una pe shift 1, cum am scris in primul meu exemplu.

 

Later edit: citat din metoda, inrosirea imi apartine:

 

 

Pasul 3

Asteapta ca marketul sa revina in zona de tunel. Cand sparge DEASUPRA tunelului, mergi lung. Cand sparge SUB , mergi Short.

deci nu "mergi long ori de cate ori cut-ul e desupra". Ci doar "cand sparge". Gata, i-am spart pe toti.. hihi

Editat de tradelover
Link spre comentariu
Distribuie pe alte site-uri

@Tradelover.

Multumesc inca o data pentru raspuns.

Am inteles cu greu deoarece din primul tau post , #2 , mi-a scapat de la al 2lea set de indicatori cifra "1" din coada si nu intelegeam rolul celui de al 2lea set de indicatori , cifra care reprezinta:

shift - Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).

Link spre comentariu
Distribuie pe alte site-uri

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.

Vizitator
Răspunde la acest subiect...

×   Alipit ca text avansat.   Alipește ca text simplu

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.

×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.