Sari la conținut

o problema cu indicatorii predefiniti in mql


kaltos

Postări Recomandate

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
Link spre comentariu
Distribuie pe alte site-uri

  • Răspunsuri 10
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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

Link spre comentariu
Distribuie pe alte site-uri

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

Link spre comentariu
Distribuie pe alte site-uri

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

Link spre comentariu
Distribuie pe alte site-uri

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

Link spre comentariu
Distribuie pe alte site-uri

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
Link spre comentariu
Distribuie pe alte site-uri

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

Link spre comentariu
Distribuie pe alte site-uri

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 :))

Link spre comentariu
Distribuie pe alte site-uri

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

Link spre comentariu
Distribuie pe alte site-uri

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

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

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.