Sari la conținut

Intrbari care nu merita topic separat.


Mangusta

Postări Recomandate

Salut

 

Am si eu niste intrebari la care nu le-am gasit raspunsul pana acum.

 

1.Ce face if (conditie) { return(0) }?

2.Care este diferenta dintre "Library" si "Include (*.MQH)?

3.Care sunt eventimentele care genereaza automat mesaje in log in cazul unui EA?

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

  • Răspunsuri 22
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Moderators

Salut

 

Am si eu niste intrebari la care nu le-am gasit raspunsul pana acum.

 

1.Ce face if (conditie) { return(0) }?

2.Care este diferenta dintre "Library" si "Include (*.MQH)?

3.Care sunt eventimentele care genereaza automat mesaje in log in cazul unui EA?

 

Am primit aproximativ aceeasi chestie pe PM, de la un alt user, eu credeam ca sunteti persoane diferite :)

 

Deci la 3:

-Toate erorile de runtime si toate warningurile care nu sunt disabled (vezi help la Metaeditor, in "MQL4 Reference/Program Run/Runtime Errors")

-Toate mesajele la si de la server (tradinguri, requote, plasari de ordere, mutari de stopuri, etc si rezultatele lor, adica raspunsul serverului)

-in cazul unui expert sau indicator, numele expertului sau indicatorului este deasemenera logat

-functia Print()

-in cazul metaeditorului, toate compilarile, cu rezultatele lor (aici e o polologhie intreaga) se baga tot in log

-in cazul strategy-testerului exista un log separat care se poate sterge dand rightclick pe el in ST si care nu se amesteca cu logul terminalului (ele de altfel sunt si salvate in foldere diferite)

 

La 2: "include" iti aduce un fisier sursa in fisierul tau pe care il editezi, adica o pune efectiv acolo in timpul compilarii, ca si cum ar fi fost scrisa acolo, pe cand "library" incarca un executabil (deci nu sursa!) la momentul executiei (poate fi un dll sau un ex4). Toate linkurile se fac la momentul executiei (runtime). Vezi helpul de la ME, in "MQL4 Reference/Program Run/Imported functions call"

 

La 1: instructiunea "return(x)" PARASESTE procedura in care se afla, si intoarce (returneaza) valoarea x, PROCEDURII APELANTE. Scuze pentru capslock, cel care mi-a scris pe PM stie de ce am tzipat :)

 

O sa dau un exemplu si pun numere la instructiuni.

 

int functie1(int n)
   { 
1.   n=n+2;
2.   if (n==4) 
3.	  return (2);
4.   n=n+1;
5.   return (n-1);
   }

   int functie2(int n)
   { 
6.   if (n<10) 
7.   {  n=(functie1(5)+functie1(2));
8.	  return (n);
	 }   
9.   return(5+n);
   }

   int init()
   {  
10.   Print(functie2(3)+functie2(12));
11.   return(4);
12.   Print("e timpul sa cumperi");
   }

cand se porneste programul, ordinea in care se executa instructiunile (pas cu pas) este data mai jos. Pe prima linie este numarul instructiunii care se executa, iar pe linia a doua este valoarea variebilei n INAINTE de executia instructiunii curente. In paranteza este efectul lateral (side efect) al instructiunii care se executa (deci DUPA ea), adica ea poate sa intoarca o valoare, sa printeze ceva, sau chiar sa modifice n-ul respectiv (codificarea este standard in algoritmi, nu imi apartine):

 

10,6,7,1,2,4,5,  7,1,2,3,   7*,8,   10,6, 9,	 10**,   11
 #,3,3,5,7,7,8(7),3,2,4,4(2),3*,9(9),#, 12,12(17),#(26)**,#(4)

Adica ce inseamna asta? Prima data functia init() este apelata DE CATRE METATRADER. Metatraderul este locul de unde s-a apelat functia. Prietenul meu de pe PM stie de ce accentuez asta %%-. Bun, instructiunea respectiva este un print, care face doua apeluri ale functiei2. Normal ca le face pe rand, si este la latitudinea compilatorului sa decida pe care il face primul, deoarece functia este intreaga (intoarge valoare intreaga) si apelurile sunt conectate cu "plus", care este comutativ. NU EXISTA o regula care sa imi spuna daca functie2(3) sau functie2(12) se apeleaza prima data. La chestii de astea trebuie atentie, in cazul in care apelul functiei modifica variabile globale, ori are alte efecte laterale, pentru ca s-ar putea ca acolo ordinea sa conteze, si sa avem erori greu de depistat dupa aia. Dar asta e alta poveste. Deci presupunem ca apelurile se fac in ordine. Prima data cand pornesc expertul sunt la instructiunea 10, iar valoarea lui n este NECUNOSCUTA (fapt notat cu # in tabel). Pentru ca n este variabila locala in cele doua functii. Print-ul apeleaza functie2 cu parametrul 3. Deci se sare la instructiunea 6 (in corpul functie2) si acolo, inainte de executia instructiunii, n este 3, adica parametrul de apel. El este mai mic ca 10, deci se intra in if. si avem in executie instructiunea 7, n-ul este incontinuare 3.

 

Instructiunea 7 (aceeasi discutie ca la Print de mai sus) face doua apeluri ale functiei1. Primul este cu parametrul 5, deci intru in fucntia 1, unde, la instructiunea 1, parametrul n este egal cu 5. El devine 7 dupa instructiunea 1, si cu aceasta valoare se "ataca" instructiunea 2. Nu este 4, deci se sare peste if, se executa instructiunea 4, unde n este in continuare 7. Instructiunea 4 il face pe n egal cu 8, deci la executia instructiunii 5 valoarea lui este 8. Aici am ajuns la "disputatul" return(). El intoarce functiei apelante valoarea dintre paranteze, care este n-1, adica 7. Deci instructiunea 5 intoarce functiei2 (la locul apelului, ca de acolo a fost apelata functia1!!!!) valoarea 7. Adica programul revine in functia 2, unde - remember? - n-ul era 3. Acest n este local fiecarei functii, n-ul dintr-o functie nu are legatura cu n-ul din cealalta. Si executia continua cu instructiunea 7, unde n-ul este in continuare 3, ca nu l-a modificat nimeni, dar instructiunea 7 si-a "rezolvat" prima parte (primul apel la functie1) si si-a memorat rezultatul intors (scris in sir intre paranteze) undeva intr-un sertar al ei, care acum nu ne intereseaza pe noi. Se continua cu a doua parte a instructiunii 7, deci, care este un nou apel la functie1, de data asta cu parametrul 2. Si se executa deci instructiunea 1, unde n este 2, de data asta este n-ul din functia 1, si este parametrul de apel al functie, adica valoarea reala cu care a fost apelata functia1. Deci n devine 4 prin bunavointa instructiunii 1, si atunci se intra in interiorul if-ului de la instructiunea 2.

 

Acesta este cazul "intrebat" de Mangusta si de prietenu' meu de pe PM. Deci ATENTIE, instructiunea return() de la 3 va intoarce FUNCTIEI APELANTE valoarea dintre paranteze (adica 2). Functia apelanta este functia 2, mai exact instructiunea 7, ACEEA a apelat functie1. Deci se revine la 7, cu valoarea de return 2, n-ul functiei 1 se pierde, odata ce am iesit din functie1, si avem noul (adica vechiul) "n" al functiei2, care - remember? - avea valoarea 3. Este locul marcat de mine in sir cu cate o steluta (asterisk, "*").

 

Abia acum instructiunea 7 si-a rezolvat toate apelurile si se poate executa, deci efectul ei este ca aduna cele doua valori intoarse de cele doua apeluri, si dupa executie ei, n devine 7+2=9. Remember, prima valoare (salvata in sertar) era 7.

 

Instructiunea urmatoare (8), este tot un return, care intoarce acel n calculat anterior, adica 9. Urmariti in sir, dupa stelutza. Acest return(n) deci PARASESTE!!!! functie2 si sare inapoi la locul de unde a fost apelata functie2, returnand ACELEI functii apelante (in cazul nostru functia init) valaorea dintre paranteze, care este 9.

 

Si asa ne-am reintors la instructiunea 10, dar acum print-ul si-a rezolvat primul apel. Mai departe el isi rezolv al doilea apel, pe acelasi principiu, apeland iar functia 2, cu parametrul 12. De data asta parametrul este mai mare ca 10, deci dupa executia instructiunii 6 nu se mai intra in if-ul din functie2, ci se executa direct instructiunea 9. Acolo n-ul NU SE MODIFICA, el este incontinuare 12, el doar este folosit pentru a calcula expresia 5+n (adica 17), care este intoarsa instructiunii print de la 10.

 

Acum print-ul si-a rezolvat toate apelurile si el poate sa faca calculul si sa tipareasca (in LOG! asta apropo de cealalta intrebare cu logul) valoarea calculului, adica 9+17=26, care apare in log. Pe sir am marcat momentul respectiv cu doua stelute (**).

 

Dupa care se executa instr. 11, care - mama doamne! - este tot un return. Ea va "returna" valoarea 4... cui? Cinci bile albe cui ghiceste!

 

Desigur, functiei care a apelat functia init. Aceasta este o componenta a metatraderului, care nu este accesibila programatorului, noi stim doar ca exista "un trick" in interiorul metatrederului care are grija sa cheme (sa execute) functia init() atunci cand trebuie. Deci cei care ati spun "Metatraderului", ati ghicit. Cel care a apelat functia init este metatraderul, nimeni altcineva. El va testa daca valoarea intoarsa de functia init este zero, si daca nu, va genera o eroare. Dar asta e alta poveste. La randul lui, metatraderul este apelat de windows, deci atunci cand inchideti metatraderul, el are o functie in interiorul lui, care va intoarce windowsului motivul pentru care a fost inchis metatraderul, sub forma unui numar intreg, de exemplu 1 inseamna ca useru a apasat butonul close, 2 inseamna ca au crapat lumanarile si curge ceara, 3 inseamna ca memoria e asa de multa incat a dat pe dinafara, si asa mai departe.

 

Din cauza exprimata mai sus (iesirea cu return la instructiunea 11), instructiunea 12 nu va fi executata niciodata, indiferent ce va face programul in rest. Nu exista nici o cale (ortodoxa) de a executa instructiunea 12.

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

Multumesc tradelover pentru raspuns.

Poate un broker sa iti dezactiveze expertul?

 

Cand l-am pus prima oara pe chart avea o fata trista dupa nume.Am activat "Allow live trading" ai aparea o fata vesele si acum are un "x".Ma uit in log si vad "loaded successfuly" ceea ce ma face sa cred ca problema nu ar fi de la mine.

Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

nu, un broker nu poate sa iti dezactiveze expertul, el poate in schimb sa vada daca traiduiesti manual sau cu un expert, pentru ca orderele plasate cu expert contin o cheie de identificare a expertului. De asemenea el poate sa vada daca mai multi traderi traiduiesc cu acelasi expert, si in cazul in care el e profitabil si devine "prea public" te trezesti cu slipage mare si requoturi dese.

 

totusi, in cazul tau x-ul apare pentru ca ai dezactivat expertii. Exista o optiune generala care dezactiveaza toti expertii, si atunci apare x-ul la toti, indiferent ca le-ai dat allow trrading (fatza vesela) sau disallow trading (fatza trista). Ca sa rezolvi problema, cauta un buton prin bara de meniuri, pe care scrie "Expert Advisors" si are pălărie %%- Este de fapt un checkbox, dar arata ca un buton, cand il checkuiesti sta apasat.

 

cauza dezactivarii poate fi manuala (ai dat click pe el din greseala) sau automata. Dezactivarea se face automat atunci cand de exemplu esti logat pe demo, ai un expert pe care il testezi, apoi te loghezi pe real fara sa inchizi intai expertul. Computerul (sau brokerul) nu are de unde sa stie ca tu vrei sa tranzactionezi pe noul cont cu expertul de pe vechiul cont, poate era doar o versiune de test, si ca sa evite tranzactii "nedorite", in acest caz expertii sunt automat dezactivati, si apare x-ul imbarligacios.

 

Deci nu e de la broker, ci de la tine.

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

  • 1 lună mai târziu...

Datele pe platforma demo difera de real?[Cand spun "date" ma refer la preturile bid si ask si volumul]

 

Investitorul are posibilitatea de a vedea graficele in timp real si sa puna indicator care preia pretul pe grafic?

 

Iti poate ingheta brokerul pratforma ca faci trafic de date?

Link spre comentariu
Distribuie pe alte site-uri

@msjohntm

Nu se poate sa mearga EA-ul cand ai calculatorul inchis.

Am observat ca incep brokerii sa dea conturi unde poti sa iti gazduiesti EA-ul la ei, forex[/acronym].com/metatrader/land-hosting.html?src=mlq4728x90ros_eameta-200903&utm_source=aboutccy&utm_medium=banner&utm_content=mlq4728x90ros_eameta&utm_campaign=200903"]asta de exemplu ,dar trebuie sa iti deschizi cont.

O alta solutie ar fi sa inchiriezi un VPS cu windows si te costa de la 18$ pe luna.

Link spre comentariu
Distribuie pe alte site-uri

Mersi de raspunsuri. Banuiam eu ca e asa, dar acum sunt sigur. Tocmai ce am vandut PC-ul ca nu mai lucram numai pe laptop. Acum trebuie sa-mi iau altul si sa-l las sa traduiasca. Dar manca la bani Forexul asta, nu numai timp. Pana ajung sa castig si eu ceva cred ca trece criza. :tongue: Numai forexul sa mai reziste ca vad ca nimic in lumea asta nu mai e stabil. Mie mi frica ca voi castiga vre-un milion de $ (de ce tii frica nu scapi :) ) si brokerul imi va bloca contul din oaresce motive sau va da faliment. Voi nu aveti astfel de scenarii?

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.