Sari la conținut

Loturi, lotule?e ?i loti?oare...


Postări Recomandate

  • Moderators

Well, puţ, de ceva vreme m-am transformat in "instructor online fara voie", ca sa parafrazez celebra piesa de teatru. Sunt cativa forumisti care mă altoiesc cu intrebari despre MQL pe oriunde ma prind. Unii sunt mai insistenti ca altii, dar eu ma bucur ca lumea vrea sa invete si sunt foarte incantat ca intrebarile lor sunt din ce in ce mai elevate. Îmi aduc cu nostalgie aminte cand m-am apucat eu de MQL, ce bâtă eram. Dar curaj, nu se naste nimeni invatat. Totul e sa vreti, sa aveti vointa. Hehe, poate facem si ceva lectii online, ca la renjuclass.com, or else. Adica sa ne intalnim pe chat si sa discutam despre cum se pot face experti, luam un exemplu de strategie simpla (ex: intram pe un EMA daca bara e in directia ei, iesim pe un RSI, etc) si incercam sa o implementam impreuna. Vine fiecare cu cate o idee. Scriem in editor, testam, vedem ce erori apar, de ce, si cum se rezolva, etc. Pe urma analizam daca strategia e jucabila, de ce da, de ce nu, cum poate fi imbunatatita....

 

De exemplu am "teme" cu care am putea sa ne batem capul impreuna. Adică am primit atât pe PM cât şi direct prin mesajele postate, dat mai ales pe e-mail, cereri de a implementa tot felul de strategii, cel putin ciudate, ca sa nu le zic altfel. Nu crec ca voi avea vreodata timp să le implementez asa de amorul artei. Time is money. Pentru a mă apuca de implementat o strategie, trebuie să fie destul de simplă încât să nu imi ia mult timp ŞI să consider ca merită efortul de a o testa. Dacă e prea complicată, ori mie mi se pare că implementarea ei ar fi inutilă, atunci doritorul o poate avea totusi, daca tine mortis, dar contracost. În rest, nu sunt un tip care sa tin cunostintele pentru mine, ci mai degraba imi place să mă laud cu ele :D

 

La urma urmei asta fac pe messenger de vreo saptamana si vad cu mandrie ca unii dintre "discipoli" chiar au inceput chiar sa isi puna noii experti pe aici :D,

 

De exemplu azi am avut o discutie pe mess despre marimea lotului pe care vrem sa il jucam, cu cineva care a facut un expert si a dat marimea lotului ca parametru:

 

extern double Lots = 0.1;

 

pe langa alti parametrii.

 

Comentariul meu a fost acela ca o asemenea practica nu e buna. Marimea lotului pe un bid depinde de cat de multi bani avem in cont si de cat de mult din ei vrem sa riscam. Eu folosesc in expertii pe care ii fac un parametru extern numit factor de risc, care este setat perunit, adica e un numar subunitar.

 

extern double RiscFactor = 0.02;

 

in ideea ca nu risc niciodata mai mult decat 2% din totalul banilor pe care ii am in equity. Exista si posibilitatea de a da factorul de risc procentual, dar eu prefer declararea lui perunit pentru ca simplifica calculele nu mai trebuie sa fac impartirea la 100. Daca ne e maicomod sa folosim un factor de risc intreg, ca fiind un numar intre 0 si 100, atunci putem spune

 

extern int RiscFactor = 2;

 

Ulterior trebuie sa avem grija de el si sa il impartim la 100 acolo unde facem calculele. Totusi, daca ne gandim la risc de 1.5%, sau 2.5%, 7.83%, sau alte mânării de genul asta, un factor de risc dat ca numar real este mult mai avantajos. Deci voi considera mai departe ca folosim un factor de risc perunit, dat ca un numar real, conform cu prima declaratie. In functie de acest factor de risc, de cati bani avem in cont si de cat de mare e StopLoss-ul cu care vrem să jucam, calculam cat de multi bani putem risca. Adică mărimea lotului.

 

Nu am vrut să ii pictez omului meu o formulă. Am vrut ca el să ajungă singur la ea. Chinezii spun că daca îi vei da unui om un peşte, el se va hrăni o singură dată. Dacă îl vei învăţa să pescuiasca, el se va hrăni totdeauna. Şi din intrebare in intrebare, din solutie in solutie, el mai schimba ceva, eu mai veneam cu o remarcă, etc, am ajuns pana la urma foarte aproape de rezultat. Ne mai desparteau cateva zerouri, haha, dar pentru că trebuia să plec acasă, eram incă la job, am pictat formula, urmând ca el să înţeleagă de ce e aşa. Apoi am plecat acasa, dar am promis sa revin cu un excel in care sa explic de ce am facut asa si cum am ajuns la formula respectiva. Nu e simpla! Credeti ca calculul lotului in functie de factorul de risc este simplu? Asa poate parea, dacă vă limitati la niste cazuri particulare. Dar noi vrem să facem un expert care să meargă la orice tip de cont si la orice broker. Daca maine schimb brokerul, ce fac? rescriu expertul?

 

Un calcul de genul

 

Lots=Equity*RiscFactor*10/Stoploss;

 

asa cum ne-ar dicta logica (de unde am luat valorile? de unde am luat 10? de ce zic ca asa e logic?), este ori foarte particular, ori eronat. Incercati pe cateva exemple practice, de exemplu equity=10k, risc=0.02, stoploss=100.

 

Deocamdata, pentru ca e tarziu si imi pica ochii de somn, o sa pictez formula, si o sa va rog sa spuneti VOI cum am ajuns la ea, care sunt avantajele si care sunt lacunele unei asemenea formule si ce ar mai trebui adaugat pentru ca asemenea formula sa mearga in TOATE situatiile. Pentru ca e clar ca mai exista ceva care, deocamdata, intentionat, imi scapă....

 

Asta e formula buna, daca tranzactionati la IBF sau la orice alt broker cu doua zecimale la lot:

 

Lots=MathMax(MathFloor(AccountEquity()*RiskFactor*1000000/

(MarketInfo(Symbol(),MODE_LOTSIZE)*StopLossMax))/100,0.01);

 

De unde am luat milionul? De ce am nevoie de MarketInfo? De ce am nevoie de cele doua functii matematice din faţă?

 

Nu fac asta ca sa ma dau rotund pe aici ce bun programator sunt eu. In spatele formulei se ascunde un calcul elementar al riscului, pe care multi de pe aici nu stiu să il facă. Discutand azi pe mess despre loturi si riscuri, incercand să il fac pe omul meu să rezolve acest calcul (si spre satisfactia mea si a sa proprie, a fost instare să il facă până aproape de final, poticnindu-se doar la cateva detalii care nu tineau de trading ci strict de MQL), am realizat că exercitiul poate fi extraordinar de util oricarui trader. La urma urmei, daca un trader nu stie să faca niste calcule elementare de risc, ce pretentie să mai avem la el sa facă profit? Doar dacă are un noroc chior.

 

Deci cine sparge ghiaţa?

 

Voi reveni cu detalii maine seara.

Link spre comentariu
Distribuie pe alte site-uri

  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Moderators

Well, nobody...

 

Liniste si intunecime, doar zefirul... musafirul....

Cum sunt deja obisnuit sa vorbesc ca televizorul de unul singur, să purcedem la calculul marimii lotului (by the way, Stefan, ar fi foarte util un format de "code" cum e pe alte forumuri, la fel ca quote, dar sa scrie ce e in el cu font courier new, ori altul fara proportional spacing, si eventual sa faca sintax higlight la fel ca metatraderul, nu e greu de pus, codul se gaseste pe phpbb, doar ca fce highlitul pentru C sau Pascal, dar e usor de adaptat, ar fi extrem de util butonistilor ca mine, care pun fragmete de cod spre dezbaterea publica)

 

De ce spuneam ca o formula de tipul

 

Lots=Equity*Risk*10/StopLoss;

 

este logica? In primul rând, numărul de loturi pe care le jucăm trebuie să fie direct proportional cu banii din cont la momentul respectiv (deci contul flotant, equity) şi cu factorul de risc. Cu cât avem mai multi bani si cu cât vrem să riscăm mai mult, cu atât ne permitem să jucăm mai multe loturi. De asemenea, cu cât avem de pus un SL mai larg, cu atât riscul efectiv creşte, vom pierde mai mult dacă lovim un SL mai larg decât daca lovim un SL mai strâns, deci trebuie să jucăm mai putine loturi pentru a rămâne in marja de risc, adică numărul loturilor jucate este invers proportional cu SL-ul. Punem in acest caz SL-ul la numitor. Bun, de unde am luat 10? Tot din ratiuni logice, pentru că dacă jucăm un lot standard, adică 100k USD, atunci o miscare de un pip ne aduce o pierdere de 10 parai. Deci proportia este de 10 ori mai mare si directă, de aici apare 10 la numărător. Avem o formulă logică, pe care fiecare dintre voi o folositi mai mult sau mai putin in această formă, atunci când vă calculati mărimea lotului de tranzacţionat.

 

Si mi se pare foarte corect să spun că numărul de loturi pe care il joc este dat de produsul dintre caştigul per lot per pip, factorul de risc şi suma din cont, totul raportat la marimea stopului.

 

Dar ia să facem o probă. Dacă avem in cont 10000 de dolari si vrem să riscăm 2% maxim pe tranzacţie. Am determinat de pe grafic că un SL convenabil ar trebui să fie plasat la 50 de pipsi distanta de punctul de intrare. Avem:

 

Lots=10000*0.02*10/50=(acuma lansam calculatorul de la windows si clampanim cifrele respective, de la tastatura numerică hihi)=2000/50=40. Bun, ce facem, jucăm 40 de loturi? Dacă vom fi destul de inconstienti să facem asta şi ulterior cursul va lovi SL-ul, tocmai am pierdut 40 de loturi ori 50 de pips ori 10 dolari pe pip pe lot, adica 40*50*10=20000 de parai. Conform cu matematica elementara pe care o stiu eu, asta reprezintă 200% din cei 10 mii existanti in cont, şi nu 2% asa cum ne-am propus. Practic nu vom ajunge niciodată să lovim SL-ul, pentru că vom fi măturaţi afară de pe piaţă cu MARGIN CALL la mai puţin de jumătatea distanţei. De altfel nici nu vom putea juca cele 40 de loturi, decât la un broker care oferă leverage infinit (peste 1600:1), pentru că marginea necesară plasării lor este de 40 de mii de parai, la leverage de 100:1, ori noi avem în cont doar 10 mii.

 

De unde apare eroarea? Staţi cinci minute şi vă gândiţi înainte de a citi mai jos. Uitati-vă bine la formulă şi la exemplul dat. Matematica este corectă, formula este corectă, deci trebuie să fie musai ceva putred cu parametrii luaţi în calcul. Aruncaţi din nou o privire. Măcar un minut, înainte de a întreba "bun, lasă vrajeala si spune cum pun numărul de loturi, că expertul meu zice că "...

 

****

 

Desigur, nu e asa că v-aţi dat seama? Noi dăm SL-ul ca număr întreg. Pe când în realitate, mişcarea este în puncte. De aia există la Metatrader, variabila Point. Ceea ce pentru noi înseamnă o miscare de la zero la minus 50, pentru curs e de fapt o mişcare de la 1.2000 la 1.1950. Atentie, este vorba de cursul USD-ului, in care avem contul, şi nu de cursul perechii valutare pe care vrem să o tranzacţionăm. Aceea poate fi G/J cu doar 2 zecimale la point, ori poate fi Silver sau Oil, cu cantităţi intregi de uncii sau butoaie. Noi avem contul in USD. USD-ul ne aduce (sau ne fură) 10 parai pe fiecare lot tranzactionat, la fiecare miscare de 0.0001. Sunt câteva zerouri care ne scapă. Ar trebui să dăm SL-ul sub forma 0.0050, pentru că cei 10 dolari pe lot pe pip ne sunt furaţi de o miscare de 0.0001, iar nu de o mişcare întreagă, de 1.

 

Dar cum nimeni nu vorbeşte de SL fracţionar, şi nici nu ar avea sens, atunci trebuie să transformăm pipsii de la SL in mişcare pe numere întregi. Adică să înmulţim numărul de pipsi dat ca parametru cu valoarea punctului la dolar, care este 0.0001. Formula noastră devine in acest caz

 

Lots=Equity*Risc*10/(StopLoss*0.0001);

 

sau după efectuarea calculelor: Lots=Equity*Risc*100000/StopLoss;

 

Dacă veţi încerca să faceţi vreun calcul, veţi observa că acum trebuie să jucaţi mii de loturi, ceea ce pare absurd. Ce mai e de făcut? Dacă aţi ajuns pînă aici, aţi descoperit jumătate din greşeală. Cealaltă jumătate se referă la unităţile de măsură. O să scriu din nou formula, adăugând unităţile de măsură în paranteze unghiulare, ca la fizică:

 

Lots = Equity * Risc * 10 * 10000 <1/pip (ca vine de la numitor)> / StopLoss

 

Atentie: expresia "dolari per pips per lot" este in romaneste la fel ca "kilowati per ora", desemneaza numarul de kilowati consumati intr-o ora, dar unitatea de masura este kw*h, si nu "kw/h"! Cu cat mai multe ore sta calculatorul in priza, cu atat mai multi kilowati se consuma. La fel si aici, unitatea este "dolari*(pips/loturi)", va puteti gandi singuri de ce este asa si NU ori alte combinaţii.

 

Ceea ce obtin simplificand unitatile este (doar un "pips" se poate simplifica):

 

=*/

 

Departe de a fi o formulă corectă de împerechere a unităţilor. Nu pot pune semnul egal între mere şi pere! Eu dau valorile in dolari, dar vreau sa obtin rezultatul in loturi. Pentru asta ar trebui să transform atât equity-ul cât şi profitul/pierderea per lot in loturi. Asta se poate face simplu, pentru că ştiu câţi dolari intră într-un lot. Presupunând că avem un broker care ne oferă loturi standard, de 100k , nu avem decât să facem "împărţeala" si unităţile vor fi

 

={/[]}*{/[]}/

 

sau:

 

=/

 

adica dupa simplificari, = ceea ce este corect. Pus in formula cu variabile, avem:

 

Lots=(Equity/100000)*Risc*10000/StopLoss;

 

Sau formula finala dupa simplificare:

 

Lots=Equity*Risc/(Stoploss*10); (1)

 

Această formulă poate fi folosită la orice broker care oferă loturi standard. Dacă vrem să dăm riscul procentual, adică 2% in loc de 0.02, atunci trebuie să impărţim totul la procent, adica 10 de la numitor se transforma in 1000.

 

Lots=Equity*Risc/(Stoploss*1000); (1')

 

Bun, ia sa facem proba formulei (1):

 

Am 10000 parai in cont, riscul este 0.02 şi am determinat SL la 50 de puncte. Atunci joc 10000*0.02/500=0.4 loturi. Dacă SL-ul este atins, am pierdut 50*10*0.4=200 dolari, ceea ce reprezintă 2% din contul de 10k, exact cât ne-am propus să riscăm.

 

Bun, ce facem dacă jucăm la un broker care nu oferă loturi standard? Rescriem expertul pentru fiecare broker? Exemple sunt destule. Dacă aveţi un minicont la IBFX stiti deja că marimea lotului este de 10k, şi nu de 100k. Fiecare broker este liber să ofere loturi cât de mari vrea el şi este liber să facă impărţirea în fracţiuni de lot aşa cum vrea el pentru a atrage clienţii cu bani puţini - loserii care să aducă bani pe piaţă şi profit brokerului. Dacă aveţi destui bani să faceţi direct tranzacţii interbancare, o să descoperiţi că băncile nu se complică cu "mărunţiş" de 10 mii de dolari. Brokerii pot tranzacţiona cu bancile lor doar loturi de un milion de dolari, numite FULL LOTS. Pentru a nu se face confuzie cu loturile standard de 100k, acestea din urmă sunt numite in jargonul interbancar "turrets" (turele, ca turela de la tanc, adică o piesă mică de obicei in formă de calotă sferică care face parte dintr-o structură mult mai mare). Băncile centrale schimbă între ele loturi de O MIE DE MILIOANE minim, care sunt numite yarzi (de la europeanul "milliard", deoarece la americani este uşor să confunzi prin telefon milionul cu bilionul, adică miliardul pe americăneşte, drept urmare, pentru a nu se trezi că tranzacţionează bilioane în loc de milioane când sună la bancă, americanul inventiv a adoptat jargonul european, numind lotul de 1.000.000.000 de dolari "yard"). Unele banci permit tranzacţionarea pe tureţi, dar cele mai multe nu permit decât tranzacţii de full lots, milioane adică. Pentru a putea tranzacţiona, brokerul vostru adună toate bidurile de la voi intr-un bid mai mare pe care il plaseaza la banca o singura data. De aceea daca nu are destui clienti pentru a aduna lotul intreg, brokerul este nevoit să faca tranzacţii "in house". TOŢI brokerii fac tranzacţii in house, atât pentru imbunataţirea vitezei de execuţie, cât şi pentru profit (sper să fiu instare să scriu mai multe despre asta la treadul de hedging, deşi nu prea vreau sa ma bag acolo, e o discuţie fără sfârşit). Unii brokeri, cum ar fi Forex Club (care aţi văzut filmuleţele puse de mine pe serverul lui Ener ştiţi deja) nici macar nu se complică cu loturile standard, ei oferind de la inceput full lots, de un milion de parai. Totuşi, pentru a atrage clienţii mici (ca de la ăştia fac ei bani, nu de la traderii mari!) brokerii sunt nevoiţi să ofere fracţiuni de lot, miniloturi (la prima zecimala), microloturi (la a doua zecimala) şi chiar "nanoloturi" sau kilodolari (ca FXCM) sau simplu, marunţiş de 1, 10, 100 de dolari (ca Marketiva).

 

De asemenea, dacă tranzacţionaţi Gold sau Silver sau Oil sau alte nebunii oferite de brokerii voştrii (Oanda oferă Gold şi Silver de exemplu) ştiţi deja ca mărimea unui lot de Gold este dată în uncii şi nu este 100 de mii de uncii in nici un caz. Aş vrea eu sa am bani sa pot cumpăra atatea, chiar şi cu leverage de o mie la unu, dar nu am ataţia bani şi nici nu o sa am vreodată. Dacă folosiţi această formulă in calculul loturilor de Gold pe care vreţi să le tranzacţionaţi, s-ar putea să luaţi nişte ţepe groaznice...

 

Formula (1) nu mai este in acest caz valabilă. Pentru că în stabilirea ei am folosit informaţia adiţională cum că mărimea lotului standard este de 100K dolari. Pentru a face formula valabilă oricare ar fi mărimea lotului, ar trebui să transform formula (1) in dolari, şi apoi să împartim la marimea lotului, pentru a afla câte loturi trebuie efectiv să joc dacă vreau sa risc suma respectivă de dolari.

 

Lots=(formula (1)) * (mărimea lotului standard considerat in calcularea formulei) / (mărimea lotului real oferit de broker);

 

Mărimea lotului standard o ştim, este 100k. Dacă brokerul nostru are platformă MT, atunci putem afla mărimea lotului pe care acesta o oferă ca standard, folosind funcţia MarketInfo(...). Această funcţie intoarce informaţii despre un anumit instrument financiar aflat pe piaţă. Funcţia are doi parametri, primul specifică denumirea (simbolul) instrumentului pe care dorim să il tranzacţionam (o pereche valutară, bunuri, acţiuni, etc., acestea se numesc instrumente in limbajul financiar) iar al doilea parametru specifică proprietatea care ne intereseaza despre instrumentul respectiv. Pe noi ne interesează mărimea lotului, şi conform helpului de la MT4, pe care vă recomnad cu căldură să îl citiţi MĂCAR pentru cultura generală (deschideţi editorul dând click pe rombul galben, ori din meniu, ori apasaţi F4, apoi deschideţi fereastra navigatorului, daca nu e deschisa deja, din meniu ul editorului, sau apasand CTRL+D, apoi in partea de jos o sa vedeţi "Dictionary", daţi click pe el, lectură plăcută!) vom găsi că acest parametru este MODE_LOTSIZE. Deci formula (1) devine:

 

Lots=Equity*Risk*100000/(StopLoss*10*MarketInfo(Symbol(),MODE_LOTSIZE));

 

Ori după efectuarea calculelor (simplificarea cu 10):

 

Lots=Equity*Risk*10000/(StopLoss*MarketInfo(Symbol(),MODE_LOTSIZE)); (2)

 

Acuma toate sunt bune şi frumoase. Formula (2) ne salveaza de multe belele. Dar nu scapă fără să îi facem o probă:

 

Cazul 1: jucăm la IBFX pe cont normal. Avem 10k in cont şi am descoperit o oportunitate fantastică de a pune un bid, cu stop la 50 de puncte. Expertul va calcula numărul loturilor pe care trebuie sa le jucăm:

 

Lots = 10000*0.02*10000/(50*100000) = 0.02*100/5 (am omorât toate zerourile in plus de sus şi de jos) = 2/5 = 0.4

 

Vom juca 0.4 loturi, ceea ce ştiam dinnainte, adică 40 de mii de parai, iar riscul aferent dacă lovim stopul este 0.4*50*10=200 de parai, sau 2% din cont.

 

Cazul 2: in aceleaşi condiţii, dar avem minicont la IBFX. Remember, minicontul la IBFX foloseşte loturi nestandard, de 10k parai per lot. In aceste condiţii 0.1 loturi inseamnă 1000$ iar 0.01 loturi inseamna 100$ tranzactionati. Pentru a face distincţie intre cele doua tipuri de instrumente, IBFX numeşte perechile de la miniconturi - miniperechi, şi le adaugă un "m" la coadă. Avem în cazul de faţă EURUSDm, GBPJPYm, etc, care sunt alte instrumente. Dacă tranzacţionăm cu un minicont, funcţia MarketInfo aplicată pe instrumentele minicontului (ar trebui să le zic "miniinstrumente" ha ha ha ce fain sună!) va întoarce valoarea de 10000, iar nu 100000.

 

Lots = 10000*0.02*10000/(50*10000) = 0.02*1000/5 = 20/5 = 4

 

Exact! Pentru a risca 2% din cont la stop de 50 de pipsi, trebuie să jucăm 4 loturi !! Nu 0.4 loturi.

 

ATENŢIE! Această afirmaţie este confuză pentru cei care nu sunt obişnuiţi cu minicontul şi au in cap doar loturi de tureţi. NU TOTI BROKERII OFERĂ TURETUL CA LOT STANDARD! Mai mult, unii au diferite standarde in funcţie de tipul de cont deschis la ei (cazul IBFX). Alţii oferă acelaşi lot indiferent de tipul contului, dar au număr diferit de zecimale care fac distincţia între conturi. Spre exemplu brokerul X are tot loturi de 100K atat la conturile normale, cât şi la miniconturi, doar că la conturile standard poţi tranzacţiona doar loturi intregi, pe când la miniconturi ai voie sa tranzacţionezi 0.1 loturi, sau chiar 0.01 loturi. Dar lotul este tot de 100K. Acesta este cazul cel mai frecvent, de aceea traderii sunt băgaţi în ceaţă când dau peste o situaţie necunoscuta, ca cea de faţă. Revenind, dacă jucăm un bid de 4 loturi pe un minicont la IBFX, am jucat de fapt 4*10000 de dolari, profitul sau pierderea pe pip este de 4 dolari. La cei 50 de pipsi, putem pierde maxim 200 de dolari, adică 2% din cont. Pentru că 4 loturi in cazul acesta înseamnă tot 40000 de dolari, ca în cazul 1.

 

Cazul 3: Avem cont la Forex Club, presupunând că fac ăia pe dracu în patru să implementeze metatrader, că platforma lor e de tot rahatul. Dacă lotul lor e de un milion, atunci:

 

Lots = 10000*0.02*10000/(50*1000000) = 0.02*10/5 = 0.2/5 = 0.04

 

Corect din nou, trebuie să punem bid de 0.04 loturi de un milion, ca sa avem jucaţi tot cei 40 de mii de dolari de care am vorbit, care ne limitează riscul la 2%.

 

*******

 

Bun, formula merge. Să fie sănătoasă. Ne oprim aici? Cazurile exemplificate mai sus sunt cazuri fericite în care am putut să facem împărţirea exact. Daca avem un SL de 130 de puncte, ce facem? (voi considera mai departe că avem doar loturi standard, cont normal la IBFX, cazul 1, ca sa nu mai dau toate exemplele, cine vrea să le facă de capul lui, să pună mâna pe creion! Aşa se bagă la cap. Dacă vi se par prea simple chestiile astea, treceţi la alt tread, eu prefer să imi stimulez cei doi neuroni in fiecare zi cu cateva chestii simple, la o anumită vârstă face bine la digestie..)

 

Deci SL=130. Calculam:

 

Lots = 10000*0.02*10000/(130*100000) = 0.02*100/13 = 2/13 = 0.153846153846153846...

 

Hoooo hoooo, hopa! gata! O să sară metatraderul in sus, neştiind ce vrem de la el. El poate pune biduri doar cu loturi care au doua zecimal cel mult. Nu ştie numere periodice... ce 153846-153846-153846? Eşti bomboroc? Zi-mi dacă vrei 0.15 loturi sau 0.16 loturi şi mai stăm de vorbă. Metatraderul nu face rotunjiri când e vorba de milioane de dolari. O rotunjire la a treia zecimală poate taxa clientul de câteva mii bune de dolari... Metatrader nu e făcut doar pentru ăştia ca noi care tranzacţionează 10 cenţi şi când îi pierd mai cheltuiesc încă 20 de dolari pe bere ca să îşi înece amarul... Metatrader e făcut pentru meta-traderi! (haha, iar am scornicit-o!) Drept pentru care el nu îşi poate permite să facă rotunjiri de... milioane! Trebuie să îi spunem exact ce vrem, pentru a accepta orderul. Altfel o sa ne dea cu el in cap. Aici avem două posibilităţi:

 

1) Folosim funcţia de "rotunjire", normalizare a numerelor reale, despre care am mai vorbit. NormalizeDouble(Lots,x) ne va intoarce numărul de loturi rotunjit prin tăiere la x zecimale şi aliniat frumos în memorie la formatul normalizat. Am putea scrie formula (2) în consecinţă:

 

Lots=NormalizeDouble(Equity*Risk*10000/(StopLoss*MarketInfo(Symbol(),MODE_LOTSIZE)),2);

 

ca sa avem 0.15 in loc de zecimalelele alea multe.

 

2) Eu sunt reticent la a folosi NormalizeDouble. Este o funcţie foarte lentă, care face o grămadă de teste, pierzând milisecunde preţioase. Cine ştie despre formatarea numereleor reale in computer, cu mantisă şi exponent, despre normalizarea lor, etc. ştie despre ce vorbesc. Daca este apelata intr-un ciclu şi dacă ai destule bare in chart, atunci milisecundele se transformă in secunde pe fiecare ciclu care apelează funcţia de nenumărate ori. Şi atunci folosesc un trick: pentru a extrage doua zecimale dintr-un număr, trebuie să inmulţim acel număr cu 100, luam partea intreagă a rezultatului, apoi o impărţim iar la 100. Am obţinut acelaşi număr din care zecimalele de la a treia incolo au fost înlăturate.

 

X = int(100*X)/100.

 

Exemplu: 0.153846*100=15.3846, luam partea intreaga, 15, pe care o impartim la 100, obţinem 0.15 şi gata.

 

Partea întreagă a unui număr real în MQL se poate afla folosind funcţia MathFloor(). Lectură plăcută la dictionar! Este echivalentul funcţiei int() în basic, C, ori a funcţiei trunc() in Pascal. MQL pune la dispoziţie şi o funcţie de aflare a parţii întregi superioare (cel mai mic intreg mai mare ca numărul), MathCeil(), care insă nu este necesară, putem face intotdeauna un articifiu de genul MathCeil(x)=MathFloor(x+0.99999) sau aşa ceva (nu putem folosi MathFloor+1, pentru că in acest caz daca numarul era intreg anterior, el va fi crescut cu 1, dar un compromis există intotdeauna). Deci revenind:

 

Lots = MathFloor((formula (2))*100)/100;

 

ne va rezolva problema. Şi aşa am ajuns la milionul despre care am povestit in primul post. Avem:

 

Lots=MathFloor(

Equity*Risk*10000*100/(StopLoss*MarketInfo(Symbol(),MODE_LOTSIZE))

)/100;

 

Sau:

Lots=MathFloor(Equity*Risk*1000000/

(StopLoss*MarketInfo(Symbol(),MODE_LOTSIZE)))/100; (3)

 

Şi ca să facem lucrurile mai clare :D vom încerca să evităm situaţia în care avem foarte putini bani in cont şi nu putem tranzacţiona in riscul de 2%. Dacă aţi ajuns la aşa ceva, sfatul meu e să vă lăsaţi de forex ori să căutaţi un broker care vă lasă să tranzacţionaţi dolarii unul câte unul, gen Marketiva, până mai învăţaţi.

 

Deci dacă avem doar 200 de parai intr-un cont standard, riscul de 2% ne dictează că putem risca cel mult 4 dolari. Cantitatea minimă pe care o putem juca este de 0.01 loturi, ceea ce ne aduce 10 cenţi pe pip. Sub nici o formă nu putem, in acest caz, să intrăm într-o tranzacţie care implică un SL mai mare de 40 de pipsi. Dar tranzacţionarea la 40 de pipsi este sortită eşecului din start. Piaţa se poate mişca 40 de pipşi contra noastră chiar şi atunci când doarme, vorba lui Elder. Ori nu mai tranzacţionăm, ori mărim stopul, riscând mai mult. Dacă am găsit o oportunitate foarte bună de a tranzacţiona, dar care necesită plasarea stopului la 77 de pipsi, ce facem? Pentru că formulele 2 si 3 intorc in acest caz:

 

Lots = 200*0.02*10000/100000*77 = 20*0.02/77 = 4/770 = 0.0051948 loturi. (din formula (2))

 

Truncherea va elimina toate cifrele semnificative, iar formula (3) va intoarce zero la numărul de loturi. Expertul nostru va sta degeaba şi nu va tranzacţiona, tot înghiontindu-ne cu eroarea aia cu "invalid lots". Ar trebui ori să scadem stopul, adică să aşteptăm altă oportunitate cu stop mai mic mâine, săptămâna viitoare, etc, ori să dăm manual un factor de risc mai mare, de exemplu acum avem nevoie de 3.9%, adica RiscFactor=0.039, care poate înghiţi un stoploss de maximum 78 de puncte la cele 200 de parai din cont. Dar cum noi vrem un expert care să nu ne frece la fiecare tranzacţie ori de cate ori equitzul scade, preferăm să ii dam un pic mai multă libertate în cazul in care am rămas pe jantă. Adică dacă nu ne putem încadra în factorul de risc, să crească implicit factorul de risc, jucand măcar un microlot. Asta se poate intâmpla nu numai cand avem puţini bani, dar şi daca avem destui bani şi am găsit o oportunitate cu un stoploss foarte mare. La trading pe termen lung (luni de zile) la G/J sau G/CHF, sau la carry trading, sunt comune stopuri de 500, 800, 1000, 2000 de pipsi. Atunci mărimea lotului trebuie să fie infimă. Chiar şi cu 10000 de dolari in cont, un stop de 2000 de puncte nu ne dă voie să riscăm mai mult de 2% din cont, adică 200 de parai, in acest caz 200/2000 este suma pe care o putem pierde pe pip, adică 10 cenţi, ceea ce ne forţează să tranzacţionăm CEL MULT de 0.01 loturi. La 9000 de dolari in cont, daca vrem să facem carry trading, atunci 0.009 este lotul maxim pe care ni-l putem permite. Dar cum asa ceva nu se poate, putem juca doar 0.01 cel mai puţin, atunci creştem implicit riscul jucând 0.01 loturi. Dacă dăm în stop la 2000 de pipsi, am pierdut 200 de dolari, ceea ce reprezintă 2.22% din contul de 9000. Atât am riscat. Dar creşterea este meritată, pentru că dacă carry-orderul stă deschis două luni până să atingă stopul, am încasat dobanda (rolloverul) aferentă celor două luni de carry, care acoperă cu surplus pierderea suplimentară de 0.22%. Dacă însă cursul se duce in favoarea noastră la sfârşitul celor două luni, atunci la profitul făcut se adaugă rolloverul, stăm pe o căruţă de bani... Cât se poate mişca G/J in două luni? Mii de pipsi.

 

Well, ideea era ca in anumite situaţii putem da voie expertului nostru să crească factorul de risc cu de la sine putere, dar cu valori infime, nu de la 2% la 55%, dar la 3%, 4%, 5%, de nevoie (nu avem destui bani să tranzacţionăm lotul minim la stopul propus) ori din raţiuni obiective (carry trading, etc). Altfel el nu ar tranzacţiona deloc, mai ales în prima situaţie descrisă. Creşterea factorului de risc ne poate duce la un profit mai mare - şi implicit la redresarea contului, intrarea lui în marja normală de risc - ori ne poate duce la pierderea mai rapidă a celor câţiva dolari rămaşi, depinde de cât de bine am dat cu capul. Alegerea apartine fiecăruia, dar odată ce tranzacţionăm subcapitalizat, ne cunoaştem riscurile. De aceea nu vrem să umblăm de fiecare dată la factorul de risc, dar vrem totuşi să tranzacţionăm, nu să tot aşteptăm oportunităţi cu stop mic (=risc mic).

 

Şi atunci facem aşa: dacă lotul calculat este mai mic decat lotul minim permis, vom juca lotul minim permis. Putem face asta cu o instrucţiune "if", dar ar necesita o subrutină separată de program, deoarece MQL nu ştie încă să întoarcă valori dintr-un if, cum ar fi in C operatorul " _?_:_ ", aşa că vom folosi pur şi simplu funcţia Max():

 

Lots = MathMax(formula(3), 0.01);

 

Adică dacă lotul calculat este mai mic de 0.01, vom juca totuşi minimul permis de 0.01, crescând ocazional factorul de risc cu cantităţi infime.

 

Şi aşa inlocuind formula (3) în ultimul calcul, am ajuns la formula postată în primul post. O voi mai scrie odată, pentru a fi foarte clară, considerând in plus că equity poate fi aflată în MQL apelând funcţia AccountEquity(). Incă odată, lectură plăcută la help!

 

Deci:

 

Lots=MathMax(

MathFloor(AccountEquity()*RiskFactor*1000000/

(StopLoss*MarketInfo(Symbol(),MODE_LOTSIZE)) (3)

)/100, 0.01);

 

Lecţia viitoare, despre avantajele şi lacunele acestei formule şi cum poate fi făcută mai bună. De exemplu, ce se întâmplă dacă contul vostru nu este în USD ci în JPY? Ce se poate intâmpla dacă brokerul oferă doar o zecimală la lot şi nu două, sau dacă oferă trei? Sau nici una? Adică puteţi tranzacţiona 0.001 loturi. Cum modific formula ca să meargă corect în toate situaţiile? Ar trebui să nu apară nici o constantă în ea, toate zerourile alea multe să fie înlocuite de parametrii citiţi de la broker, folosind MarketInfo(), AccountInfo() şi/sau alte funcţii de genul ăsta, plus conversii şi funcţii care execută calcule matematice. Atunci putem zice că am făcut o treabă bună, corectă şi completă.

 

Dar asta lecţia viitoare. Şi numai dacă sunt amatori. Că vorbitul ca televizorul, de unu singur, este plictisitor şi nu foarte motivant. S-ar putea să nu vă intereseze subiectul, calculul lotului nu pare a fi mare scofală şi poate fi făcut cu creionul pe un petec de hârtie, mult mai repede (de catre unii, care ştiu să facă calcule şi înţeleg cu ce se mănâncă forexul, nu de către cei care cred că poţi deveni bogat în trei zile, ori de catre cei care zic "adică ai pierdut trei luni ca să câştigi 20 de dolari? îţi dau eu 20 de dolari, hai să bem o bere"), iar mulţi nu au nevoie (acum/încă) de experţi. Dar ar trebui să vă gândiţi că este o oportunitate foarte bună de a descoperi funcţiile MQL care sunt introduse pe rând, una câte una, de a descoperi frumuseţea limbajului, forţa şi utilitatea lui. Şi nu ştiu cât o să mă ţină entuziasmul.....

 

Calculul lotului e doar un exemplu, aş fi putut discuta despre cu totul altceva. Dar am ales aşa, pentru că e un calcul pe care orice trader, fie el cât de amator, cu sau fără metatrader, trebuie să ştie a-l face bine, intuitiv, fără a avea nevoie să pună mâna pe creion, dacă vrea să supravieţuiască pe piaţă. Pe româneşte se zice că numai cine nu riscă nu câştigă. Nu ştiu cât de adevărat o fi, dar în forex eu ştiu una şi bună: cu cât rişti mai mult, cu atât eşti out mai iute...

Link spre comentariu
Distribuie pe alte site-uri

  • Management

(by the way, Stefan, ar fi foarte util un format de "code" cum e pe alte forumuri, la fel ca quote, dar sa scrie ce e in el cu font courier new, ori altul fara proportional spacing, si eventual sa faca sintax higlight la fel ca metatraderul, nu e greu de pus, codul se gaseste pe phpbb, doar ca fce highlitul pentru C sau Pascal, dar e usor de adaptat, ar fi extrem de util butonistilor ca mine, care pun fragmete de cod spre dezbaterea publica)

Tagul pentru cod sursa exista deja. Pentru a fi formatat, trebuie sa folosesti

 

function HelloFromMyBB()
{
  echo "Hello, Code!" //stupid exemplu, stiu :)
}

O sa incerc sa adaug si sintaxa de MT. Cu chestiile de programare atingi o coarda sensibila pentru ca si eu sunt in domeniu si nu pot sa te refuz :D.

Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

Sarutmanaaaaa! Acuma fac si mofturi, se poate fara sa scrie mare Code la inceput, care impinge totul prea jos? hihi. Fa-ti pomana pana la capat :D

 

Daca mai bagi si sintaxa, esti omu meu!

 

Inca odata sarutmana!

Link spre comentariu
Distribuie pe alte site-uri

  • 7 luni mai târziu...

buna, cred ca trebuie sa dezvoltam subiectul asta, nu de alta dar fara money management nu devenim traderi.

deci, formula 3 am invatat-o, am testat-o, e OK pana la un punct, inca ii mai lipseste ceva :

 

O alta observatie e ca calculul lotului este exact doar atunci cand joci perechi cu USD la coada (care au un dolar pe pip la minilot sau 10 dolari pe pip la standard). Altfel, calculul lotului este aproximativ. De exemplu la G/J, cu 8 parai si ceva pe pip pe lot standard, riscul va fi mai mic, adica tu ii dai 0.03 risc, dar el va juca E/U cu risc de 3%, dar va juca G/J sau E/F cu un risc de 2.4%, in schimb va juca E/G cu un risc dublu !! Pentru a avea calculul lotului foarte exact pe toate perechile, ar trebui introdus in calcule si valoarea pipului (care se poate afla cu marketinfo).

pana nu vezi nu crezi :) , am depistat anomalia in timpul testelor :)

 

Eu nu am mai continuat treadul ala cu calculele, pentru ca am vazut ca nu interesa pe nimeni, dar mai erau multe chestii de discutat.....

in aprilie eram deja navetist cu saptamana ,asta e, imi si place munca pe care o fac, iar sfarsitul de saptamana era dedicat in exclusivitate familiei, acum gata sunt din nou acasa si am la dispozitie cafeaua de dimineata si o ora doua seara (ore deloc potrivite cu cele din Tai, asa ca eu te prind numai aici).

 

bun, revenim formula 3 e buna cand jucam perechi cu usd la coada si SL stabilit de noi, pentru partea cu perechi fara usd am mai avea de introdus si

(MarketInfo(Symbol(),MODE_TICKVALUE) , daca gresesc sa ma corecteze cineva, pentru partea cand SL nu mai e dictat de noi ci de altceva incepe dansul.

 

sa zicem ca SL il stabilim cu Bolliger bands, care ar fi rezolvarea corecta

 

//+------------------------------------------------------------------+
//| Calculeaza marimea stopului buy									|
//+------------------------------------------------------------------+
double StopLossbuy()
  {
   double StLb;
   double Stopbuy;
   Stopbuy=iBands(NULL,0,BPeriod,2,0,PRICE_LOW,MODE_LOWER,1);
   
//---- 
   StLb=MathAbs(Stopbuy-Bid);
//----
   return(StLb);
  }
//+------------------------------------------------------------------+
//| Calculeaza marimea stopului sell									 |
//+------------------------------------------------------------------+
double StopLosssell()
  {
   double StLs;
   double Stopsell;
   Stopsell=iBands(NULL,0,BPeriod,2,0,PRICE_LOW,MODE_UPPER,1);
   
//---- 
   StLs=MathAbs(Stopsell-Bid);
//----
   return(StLs);
  }
//+------------------------------------------------------------------+
//| Calculeaza marimea lotului									   |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lotbuy,lotsell;
//---- 
   lotbuy=MathMax(MathFloor(AccountEquity()*RiscFactor*1000000/(MarketInfo(Symbol(),MODE_LOTSIZE)*(StopLossbuy()/ Point)))/100,0.01);
  lotsell=MathMax(MathFloor(AccountEquity()*RiscFactor*1000000/(MarketInfo(Symbol(),MODE_LOTSIZE)*(StopLosssell()/ Point)))/100,0.01);
//---- 
   return(lotbuy); 
   return(lotsell);
  }

pentru ca asa cum l-am scris eu nu e bine, in principiu merge cand deschide pozitie o deschide bine, numai ca uneori il apuca si imi scoate niste enormitati de loturi

19:17:09 2007.01.16 16:00 myexpert v1'3 GBPUSDm,M30: We have no money. Free Margin = 10000- lot=20.73

19:17:09 2007.01.18 13:00 myexpert v1'3 GBPUSDm,M30: We have no money. Free Margin = 10000- lot=345.97

19:17:09 2007.01.18 13:30 myexpert v1'3 GBPUSDm,M30: We have no money. Free Margin = 10000- lot=10.03

19:17:09 2007.01.18 15:30 myexpert v1'3 GBPUSDm,M30: open #1 buy 0.95 GBPUSDm at 1.9726 sl: 1.9652 ok

 

si daca return(0) inseamna intoarcete si de la capat am ratat semnalul din cauza unei conditii care e buna si ea acolo asa sa fie :)

if(AccountFreeMargin()<(1000*LotsOptimized()))
		{
		Print("We have no money. Free Margin = ", AccountFreeMargin(), "-  lot=",LotsOptimized());
		 return(0);  
		}
Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

buna, cred ca trebuie sa dezvoltam subiectul asta, nu de alta dar fara money management nu devenim traderi.

corect :)

 

una din legile lui Murphy zice ca erorile sunt mai ingenioase decat noi, pentru ca ele se strecoara acolo unde te astepti mai putin :)

 

In cazul tau, eroarea vine de la... reprezentarea in format binar a numerelor reale :). Care face ca diferenta iBands-Bid sa fie foarte mica, minuscula, atunci cand cursul se afla pe banda bolinger de jos. Care la randul ei mai departe cauzeaza un overflow in functia care calculeaza loturile. Destul de greu de depistat pentru un neprofesionist. Concret:

 

lotbuy=MathMax(MathFloor( xxx / (yyy* (StopLossbuy()/Point) ))/....);

 

Cand cursul se afla foarte aproape de banda bolinger de jos, atunci functia StopLossbuy() intoarce un numar foarte apropiat de zero. De fapt, daca iBands ar fi calculat foarte exact la rezolutie de pips, atunci jurnalul tau s-ar umple de mesaje "division by zero". Pentru ca iBands provine din calcule matematice complicate (un average, o sigma, etc, cine il intereseaza, sa se uite cum se calculeaza BB), valoarea lui nu este aproape niciodata exacta in pipsi. Adica daca pui

 

int start()

{ print(doubletostr(ibands(....),10);

}

 

vei obtine un sir de numere de forma

1.2345678904

1.2345323731

... etc

 

De aceea diferenta iBands-Bid nu este niciodata zero. Dar uneori este foarte apropiata de zero. Prin urmare, calculul lui lotbuy de mai sus face, uneori (atunci cand cursul sta pe banda bolinger de jos) o impartire la un numar (intors de StopLossbuy(), adica) care este foarte apropiat de zero. De aici rezultatele imens de mari, cauzate de impartirea float pe 4 bytes. Erorile sunt umflate si de faptul ca numere reale in MT4 nu sunt normalizate, dar ideea care vreau a se retine este ca (matematic!) impartirea la numere foarte mici, apropiate de zero, da rezultate foarte mari, apropiate de infinit, care (tehnic!) nu pot fi memorate fara eroare pe cei 4 sau 8 bytes alocati pt numerele reale in MT4.

 

De ce m-am referit doar la StopLossBuy? Pentru ca pe StopLossSell() nu o folosesti la nimic, o calculezi pur si simplu degeaba. Desigur, o folosesti la calcului lui lotsell, in functia cu loturile, dar acea valoare (lotsell) nu este niciodata intoarsa de functie. Ea se pierde la revenirea din functie cand se curata stiva, pentru ca linia "return (lotsell);" nu este niciodata atinsa. Functia revine cand intalneste primul return, deci functia ta va intoarce intotdeauna doar valoarea de buy, indiferent daca tu vrei sa vinzi sau sa cumperi.

 

Eu as face asa:

1) in primul rand as introduce in calcule valoarea stoploss-ului minim acceptat de broker, pentru ca daca benzile sunt foarte apropiate, s-ar putea ca brokeru sa nu te lase sa pui stop asa "intim" langa curs. Asta ajuta si la calcule, pt ca SL-ul creste valoric, deci nu mai da valori apropiate de zero.

2) as incerca sa evit plasarea stopurilor in directie gresita. De exemplu daca vreau sa vand si cursul e deja peste banda de sus, nu pot sa pun stop pe banda, ea e deja dedesupt, iar stopul la sell trebuie pus deasupra. In acest caz as intoarce o valoare negativa. De exemplu "-1". Aceasta valoare poate fi ulterior testata in program, sa stim cum stam, ori poate fi lasata pe seama functiei lotsOpti(), deoarece valoarea fiind negativa, MathMax(MathFloor...) va intoarce 0.01 loturi. Acum vedeti si utilitatea combinatiei de max(floor(...),0.01). Daca totusi vreau sa o testez, pot face in functia de loturi ceva de genul

 

if (StopLossSell>0) { fac ce am de facut};

else {alert eroare, curs prea apropiat de BB};

 

3.De asemenea as elimina variabilele in plus de prin functii, as introduce Points'urile in interiorul functiilor, ca sa nu am grija lor la fiecare apel, as alinia un pic mai bine calculul loturilor punand parantezele una sub alta ca sa se inteleaga ce vreau... eventual alte mici cosmetizari...

 

Well, so far so good, dar cum facem ca functia de loturi sa intoarca stopul la sell ori la buy, dupa cum vrem noi, si nu dupa cum vrea ea? Simplu, ii punem un parametru. Daca e 0, intoarce buy, daca e 1, intoarce sell. E si mai simplu de tinut minte, daca ne gandim ca OP_SELL si OP_BUY sunt definite in MT4 ca constante intregi. Cand vrem sa vindem, apelam calculul de loturi cu OP_SELL, cand vrem sa cumparam, il apelam cu OP_BUY. Simplu si clar...

 

extern int BPeriod =20;
extern double RiscFactor=0.02;

//+------------------------------------------------------------------+
//| expert start function											|
//+------------------------------------------------------------------+
int start()
  {Print(" >>>>>>>>>> Buy SL at: ",LotsOptimized(OP_BUY),
				  ", Sell SL at: ",LotsOptimized(OP_SELL));
   return(0);
  }

//#########################################################################

//+------------------------------------------------------------------+
//| Calculeaza marimea stopului buy								  |
//+------------------------------------------------------------------+
double StopLossbuy()
{   double stop;
	stop=iBands(NULL,0,BPeriod,2,0,PRICE_CLOSE,MODE_LOWER,1);
	if (stop<Ask-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) // !!!!!
		 //testul asta e valabil cand tranzactionezi in interiorul benzilor. 
		 //Daca intentia ta a fost sa tranzactionezi in afara benzilor, 
		 //atunci trebuie sa il re-gandesti
	  return ((Ask-stop)/Point);
	else 
	  return (-1); //eroare, pretul este deja sub banda BB de jos
				   //ori prea aproape de ea
}

//+------------------------------------------------------------------+
//| Calculeaza marimea stopului sell								 |
//+------------------------------------------------------------------+
double StopLosssell()
{   double stop;
	stop=iBands(NULL,0,BPeriod,2,0,PRICE_CLOSE,MODE_UPPER,1);
	if (stop>Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) // !!!!!
		 //testul asta e valabil cand tranzactionezi in interiorul benzilor. 
		 //Daca intentia ta a fost sa tranzactionezi in afara benzilor, 
		 //atunci trebuie sa il re-gandesti
	  return ((stop-Bid)/Point);
	else 
	  return (-1); //eroare, pretul este deja peste banda BB de sus
				   //ori prea aproape de ea
}

//+------------------------------------------------------------------+
//| Calculeaza marimea lotului									   |
//+------------------------------------------------------------------+
double LotsOptimized(int direction)
{  if (direction==OP_BUY)  //return buy lots
	 return (MathMax(MathFloor(AccountEquity()*RiscFactor*1000000/
					   (MarketInfo(Symbol(),MODE_LOTSIZE)*StopLossbuy()
					   )	  )/100,
				0.01)
			 );
   else if (direction==OP_SELL)  //OP_SELL, return sell lots
	 return (MathMax(MathFloor(AccountEquity()*RiscFactor*1000000/
					   (MarketInfo(Symbol(),MODE_LOTSIZE)*StopLosssell()
					   )	  )/100,
				0.01)
			 );
  }

si asta e rezultatul:

 

2007.11.19 11:01:54 2007.01.03 08:00 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 1.5, Sell SL at: 1.06

2007.11.19 11:01:54 2007.01.03 07:30 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 0.97, Sell SL at: 1.88

2007.11.19 11:01:53 2007.01.03 07:00 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 0.01, Sell SL at: 0.78

2007.11.19 11:01:53 2007.01.03 06:30 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 0.01, Sell SL at: 0.77

2007.11.19 11:01:53 2007.01.03 06:00 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 1.97, Sell SL at: 1.67

2007.11.19 11:01:53 2007.01.03 05:30 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 2.03, Sell SL at: 1.61

2007.11.19 11:01:52 2007.01.03 05:00 test nicu GBPJPY,M30: >>>>>>>>>> Buy SL at: 1.67, Sell SL at: 2.03

 

valorile de 0.01 care apar din cand in cand sunt cazuri in care cursul a iesit in afara benzilor si stopul a trebuit sa fie "negativ", ori "in sens invers", adica ar fi trebuit sa pun un sell cu stop dedesupt, ori un buy cu stop deasupra. In acest caz, StopLosXXX() vor intoarce -1, iar MathMax dintre un numar negativ si 0.01 este desigur 0.01, de aceea testele nu mai sunt necesare.

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.