Sari la conținut
Postat

Am dat peste o buturuga mica in drumul meu spre a descoperi sistemul perfect... :))

 

for(int i=n;i>0;i--)
ema[i]=iMA(NULL,0,EMA_mare,0,MODE_EMA,PRICE_CLOSE,i);

chestia asta nu merge pt orice n. daca n e prea mare (mai mare de 1000), vectorul incepe sa fie incarcat cu 0.

imi ramane un vector cu primele 1000 de valori corect calculate...si apoi...pana la n...000000000000000.....0000000000.

 

aveti vreo idee cum pot sa rezolv problema asta?

Editat de Mangusta
Pus codul intre etichete

  • Răspunsuri 10
  • Citiri 6,1k
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Featured Replies

Postat
  • Management

Salut Kaltos, bine ai venit printre noi si imi cer scuze pentru problemele pe care le-ai avut cu contul.

 

In legatura cu problema ta (de MQL de data asta), sper sa nu spun o prostie mai mare decat mine, dar incearca sa marasti numarul maxim de bare de pe grafic in tools > options > tab-ul charts > max bars in chart si vezi daca merge.

Postat
  • Autor

nu merge...

de la pozitia 3727 nu prea mai stie sa returneze nimic...nici macar un amarat de close.

ma gandesc ca exista un buffer in care baga toate datele primare (o,c,l,h si vol)...daca dimensiunea bufferului este depasita...returneaza 0.

sau ma mai gandesc ca e ceva f f simplu...si nu vad de nas...:))

Postat
  • Moderators

incearca

 

Print("Numarul de bare din chart este:", Bars);

si uita-te in log sa vezi cat este. Charturile nu au un numar nelimitat de bare. De exemplu W1 poate avea pe ultimii 7 ani doar 52*7=364 bare. Nu ai de unde...

 

Ce ti-a spus Stefan e corect, trebuie sa maresti numarul de bare din chart, la 250 de mii de exemplu, dar asta nu e destul, trebuie sa si ADUCI numarul acela de bare de pe server, in cazul in care ele exista. Maritul numarului de bare care se pot memora in chart este doar rezervarea de spatiu (MT4 va functiona cu atat mai lent, mai incet, mai adormit, cu cat ai mai multa memorie rezervata pt barele alea!! deci atentie!). Mai adaugi niste sertare la dulap. Dar sertarele sunt goale, ele trebuie umplute. Pentru asta, ori derulezi chartul inapoi cat de mult se poate, si cand ajungi la limita din stanga continui sa derulezi (barele vor veni mai greu si cu intermitenta, dar odata aduse ele sunt memorate, daca ai spatiu rezervat) or daca nu ai rabdare, folosesti History Center din meniu.

 

iar apoi, cand ai destule bare, problema ta e mai corect sa o scrii folosind

 

for(int i=Bars-EMA_mare/2-1;i>0;i--)
   ema[i]=iMA(NULL,0,EMA_mare,0,MODE_EMA,PRICE_CLOSE,i);

(presupunand ca ema_mare e perioada) pentru ca daca vrei sa calculezi EMA(34) ai nevoie de cel putin 17 bare precedente.

Postat
  • Autor

gata....merge :))

nu ma intereseaza ca-l ingreunez...pt ca am nevoie de un numar mare de date...doar in momentul in care creez fisierele de back-test prima oara...apoi bag in fisier doar ultimele inregistrari...ce nu au fost introduse la creeare...so...nu mai am nevoie de atat de multe date

 

va multumesc mult ca m-ati ajutat....daca mai am nevoie o sa postez tot aici

Postat
  • Autor

Am mai dat peste o chestie...

 

for(int i=nr_lumanari;i>0;i--)
                               {
                           
                        h4time=StrToDouble(DoubleToStr(i/4,0));
                              
                              FileWrite(handle,TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),Close[i],getdispersie
i),
                              iRSI(NULL,0,14,PRICE_CLOSE,i),iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i),
                              iSAR(NULL,0,0.02,0.2,i),iCCI(NULL,0,14,PRICE_CLOSE,i),iRSI(NULL,PERIOD_H4,14,PRI
E_CLOSE,h4time),
                              iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,h4time),iCCI(NULL,PERIOD_H4,1
,PRICE_CLOSE,h4time));
                              
                               }

chestia asta intra pe un grafic H!. Problema ar fi ca nu pot determina corect indexul indicatorilor calculati pe h4 astfel incat sa fie corespondentul celor calculati pe h1. Mi-ar trebui ceva de genul iIndex(Null,PERIOD_H4,Time). Am tot cautat si nu am gasit asa ceva.

Aveti vreo sugestie?

Multumesc mult!

Editat de Mangusta
Pus codul intre etichete

Postat
  • Moderators

		   h4time=StrToDouble(DoubleToStr(i/4,0));

haa ha ha, faina incercarea! din pacate nu va fi adevarata niciodata, pentru ca la inceputul/sfarsitul de saptamana lipsesc intotdeauna candele, piata nu are un numar de bare H1 de 4 ori mai mare ca numarul de bare H4.

 

mi-a placut si tentativa de rotunjire, folosind stringuri :))

 

Dar era mai simplu si mai rapid (functiile pe siruri de caractere sunt foarte lente):

int h4time=i/4

sau daca voiai neaparat float, dar fara zecimale, atunci

double h4time=NormalizeDouble (i/4,0);

Well, nici solutia ta si nici cele date de mine nu rezolva problema ta cu indexul, dar asta e alta poveste. Din cauza ca nu intotdeauna o bara H4 are 4 bare H1, ci ea poate avea doar 3, ori 2, ori numai una. Daca de exemplu piata se inchide la ora 5 dupa amiaza, ai ultima bara H4 formata dintr-o singura bara H1.

 

Ca sa rezolvi problema, tie iti trebuie sa gasesti bara H4 care are acelasi "time" (rotunjit la 4 ore) de deschidere cu bara H1 cu care vrei sa sincronizezi, "indexul" lor nu are nici o legatura, si nu se poate rezolva prin calcul matematic, din motivul exprimat mai sus. Trebuie sa cauti acest "index" efectiv. Poti sa faci tu o functie de cautare, daca vrei, ori sa o folosesti pe cea disponibila. De gasit nu ai gasit-o, pentru ca probabil ai cautat ceva cu un nume gresit, ceea ce la programarea matriciala se numeste "index", in forex se numeste "shift".

 

Incearca iBarShift(). Este ceea ce cauti. Vezi ca am pe blog un indicator care expandeaza barele mai mari in grupuri de bare mai mititele, se cheama DetailView, cred ca am folosit iBarShift in interior.

Postat
  • Autor

m-am luat de curand de mql...si mi se pare super prost

bine...cel mai mult am lucrat in c# pana acum...si mi-am gasit si eu cu ce sa fac comparatie...

nu stiu toate functiile ..iar specificatiile pe unde le-am mai gasit ..sunt destul de sarace.

 

ai fost finutz in legatura cu incercarea aia de conversie de la double la int. Am vazut ca are ceva metode de conversie...nici prin cap nu mi-a trecut ca ar merge "cast-ul" ala. :P

anyway...multam...o sa te mai sacai cand anjung la arbore :))

Postat
  • Moderators

MQL4 are multe lipsuri, dar nu e chiar "super prost" :))

 

Este scula cea mai buna care se gaseste free. Daca ti se pare prea putin, foloseste serverul de DDI care este inclus, si exporti toate cotatiile in afara, le citesti direct din C# si iti faci toata programarea in C#. Exista pe web biblioteci de indicatori economici programati pentru toate limbajele (ori usor de transalatat) si poti folosi facilitati ale Excel-ului sa iti afisezi graficele direct intr-o interfata scrisa in C, fara sa scrii nici o linie de cod, iti iei doar namespace-ul lui Excel care se gaseste in C#, si apelezi obiectul chart cu parametri de rigoare. De asemenea iti poti face dll-uri cu functiile pe care le vrei, calcule complicate si alte chestii, pe care le scrii in C# si le apelezi din MQL, cu un expert simplu. Daca zici ca programezi C#, nu ar fi nici o problema pt tine. MQL nu a fost gandit sa sparga piata in materie de calcule, dar are facilitati foarte puternice de trading efectiv, pe care le poti apela din alte limbaje.

 

Eu am inceput cu MQL2, care semana foarte mult cu limbajul Basic (cand am inceput sa programez indicatori era in voga MT3.x, abia aparuse MT3.8, care ambele foloseau MQL2, si se vorbea de MT4 si MQL4cam cum se vorbeste acum de MQL5). Daca o sa citesti posturile mele foarte vechi de pe vamist, o sa vezi ca am facut trecerea la MT4 acum vreo 2 ani, destul de greu, si la insistentele forexistilor incepatori, care voiau indicatori in MT4, hihi...

 

Trecerea la MT4 a fost o revelatie, in primul rand pentru ca nu mai este Basic-style, ci este C-style, iar eu sunt programator de C de 15 ani (si programator in general de vreo 25, am inceput in liceu cu Fortran, Cobol, Basic, si am continuat in facultate cu altele), dar flebetea mea dintotdeauna va ramane TurboPascal-ul si Assembler-ul, la ora actuala imi castig painea ca designer de dispozitive electronice, majoritatea implicand programare in C standard si assembler. Si am o boala sa mut cate un bit de colo pana colo prin cine stie ce microcontroller, sa fac un LED sa palpaie, ori sa pictez un buton hoţ pe ecran... deh...

 

Cu C++ ma joc foarte rar, cand tre sa fac vreo interfatza pt Windows in Visual Studio, la vreuna dintre jucariile pe care le producem, iar in C# nu am scris niciodata un program de la cap la coada, nici nu stiu cum se face (am scris totusi sumedenie de functii pentru altii din birou, ei imi zic ce date de intrare si de iesire au, eu le fac functia, ei o baga in proiect, in general partea mea se reduce la functiile care lucreaza cu hardware-ul, cum ar fi BIOS-ul de la computer, de exemplu la Windows CE, ele se numesc OEM-layer).

 

MT4 este destul de puternic, daca stii sa il folosesti si intelegi cum functioneaza, este diferit de ceea ce stii tu de la C, in special behavior-ul, chestia cu deplasatul barelor, etc (cauta postul meu cu sertarele de la dulap, nu mai stiu pe unde e). Are si multe lipsuri, ca de exemplu: nu poti rula functii intre ticksi, doar cand vine tick-ul, nu poti accesa mouse/kbd events, nu poti lansa threaduri (altele decat cele default, adica unul singur pentru expert, si cate unul pt fiecare indicator atasat pe chart), etc. Dar fiecare dintre aceste dezavantaje pot fi "ocolite", prin faptul ca poti folosi biblioteci de functii standard si dll-uri, care la randul lor pot include windows API-uri.

 

Si, well... MQ ne promite cat de curand MQL5 care o sa fie obiectual (cam ca trecerea de la C la C++) si o sa contina event-programming, adica functii de genul OnMouseMoved(), OnKeyPressed(), etc, pe langa functiile default, init(), start(), deinit(), deci o sa poata contine chestii care se executa si "intre" tickuri, cand tu clickuiesti cu mouseul pe ecran, ori cand apesi taste, o sa poti face un program care cumpara cand apesi tasta B si vinde cand apesi S, de exemplui, ceea ce acum nu se poate face fara un dll cu WinAPI in el.

 

'Om trai ş'om vedea..

  • 4 săptămâni mai târziu...
Postat
  • Autor

nu-mi vine sa cred ca cer ajutor pt atata lucru dar nu reusesc sa declar o matrice pe baza unui parametru global

as vrea ceva de genul

 

int dimensiune=50

 

init()

{

double matrice[dimensiune,dimensiune];

}

 

din cate vad nu vrea sa evalueze nimic din ceea ce e in paranteze. nici macar o chestie de genul : double matrice[10*10,10*10] nu vrea.

la vectori am reusit sa-l pacalesc la modul

 

double v[];

int dim=50;

init()

{

ArrayResize(v,dim);

}

 

in consecinta am incercat pt matrice si varianta asta

 

double m[,];

int dim=50;

 

init()

{

ArrayResize(m,dim);

for(int i=0;i<dim;i++)

ArrayResize(m,dim);

}

 

need help!!!

Postat
  • Moderators

Nu poti asa de simplu. E mult mai complicat, pentru ca nu se permite alocare dinamica de nici un fel (well, exista un fel de simulcru, dar nu prea folositor aici).

 

ArrayResize() este o functie prostutza care modifica doar dimensiunea principala a masivului de date, si doar in cazul in care exista memorie libera "in spate" in asa fel incat alocarea sa poata fi extinsa (dealocarea merge intotdeauna, adica modificarea dimensiunii la o valoare mai mica). Nu pot fi modificate celelalte dimensiuni, dintr-un motiv foarte simplu: alocarea de memorie nu este interclasata (in nici un limbaj! de aia exista "garbage colector"-ul, ca concept ma refer, nu implementarea lui in diferite OS-uri ori limbaje). Adica daca tu ai o adunatura de articole (care pot fi ori numere, si atunci ai vector, ori linii, si atunci ai matriece, ori structuri foarte complexe de date), poti sa mai adaugi un articol la adunatura ta, ori sa dai afara un articol, dar nu poti modifica lungimea articolului, ci doar structura lui. Adica daca ai un vector, poti sa ii adaugi componente. O matrice este un vector in care fiecare componenta este o linie. Un masiv tridimensional este un vector in care fiecare componenta este o matrice. Un fisier secvential (nume prenume varsta blabla, un milion de articole) este un vector in care fiecare componenta este un articol, sau un struct. Repetand adaugarea/stergerea unei componente de 100 de ori, obtii modificarea respectiva (resize-ul).

 

Adica ai un vector, poti sa ii adaugi/stergi componente. Ai o matrice, adica vector de linii (sau de coloane), poti sa ii adaugi linii (sau coloane). Ai un masiv 3D, adica vector de matrici, atunci poti sa adaugi/stergi matrici.

 

Dar daca spre exemplu ai o matrice de 10 linii si 5 coloane, liniile sunt memorate in memorie una dupa alta. Fara spatii intre ele. Pot adauga sau sterge linii la/de la coada. Dar nu pot face ca fiecare linie sa aiba 6 coloane, pentru ca nu ai de unde sa iei memorie pentru a 6-a componenta (componentele intermediare, alocate in interiorul masivului, alea interclasate). Adica dupa componenta (1,5), in memorie urmeaza imediat componenta (2,1). Nu poti sa "interclasezi" pe noua adaugata - (1,6) - intre ele, nu exista memorie fizica.

 

Soluriile ar trebui sa se incadreze in una dintre categoriile:

 

1. Ori construiesc matricea in alta parte, rezervand 10 linii de cate 6 coloane fiecare, apoi sa copiez datele

2. ori aloc dinamic spatiul necesar, cu pointeri (fiecare celula contine si un pointer spre adresa celulei urmatoare, si atunci le pot pune unde vreau eu in memorie)

3. ori imi bag picioarele in ea de matrice si o suprascriu de la un cap la altul, adica suprascriu celula (1,6) peste celula (2,1), apoi (2,1) peste (2,2), etc, fosta (2,5) o sa vina peste fosta (3,1), apoi noua adaugata (2,6) peste (3.2) si asa mai departe. Iese o harababura si toate datele se pierd. Daca tin la date, fac toate calculele inainte, si incep mutarea de la sfarsit spre inceput (ca la memcopy, cand zona destinatie se suprapune cu zona sursa si tre sa specific directia de copiere). Am totusi nevoie de alocare dinamica la sfarsitul acestei matrici, cand ultimele componente vor "iesi in afara" spatiului alocat anterior. Iar la stergere de coloane e si mai nasol, raman gauri, acolo imi trebuie garbage collector. Nici unul dintre aceste concepte nu sunt implementate in MQL.

 

Solutia babeasca e sa iti iei de la inceput o matrice cat de mare vrei tu, in limita memoriei. Faci tema pentru acasa dinainte (adica calculele necesare) si iti rezervi o matrice cat mai mare, dar nu prea mare sa omori memoria de tot, ca apoi merge lent jucaria. Si nu ai nevoie sa ii modifici dimensiunea. Eu asa fac :P. Pentru ca solutia "eleganta" e mult mai complexa.

 

Anyhow, de multe ori nu ai nevoie de matrici de astea, pentru ca in MT4 ai serii. Daca vrei chestii de pret, timp, volume, calcule, etc care se refera la istorie, le poti implementa cu serii.

 

Cand chiar nu se poate, ar trebui ori sa recurgi la DLL-uri, ori sa regandesti problema :D (sa incerci un alt algoritm, o alta implementare, etc). Intotdeauna se poate, cumva.

Editat de tradelover

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...

Navigare recentă 0

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.