tablica wielowymiarowa z obiektami

O jezykach programowania w platformach i nie tylko.
wybitnygracz
Bywalec
Bywalec
Posty: 8
Rejestracja: 16 paź 2018, 19:37

tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: wybitnygracz »

chciałbym stworzyć tablicę wielowymiarową, gdzie będę przechowywać wynik z "CopyRates" dla różnych instrumentów, aby nie potwarzą pobierania CopyRates za każdym razem gdy jest mi to potrzebne później w skrypcie.

Próbowałem tak
"
MqlRates ratesM1[x][];
ArraySetAsSeries(ratesM1,true);
int copiedM1 = CopyRates(SymbolsTradeAllowed[x], CopyRatesPeriod,0,CopyRatesBars,ratesM1);
"

Dostaję "invalid index value" prrzy piewszej linii "x" jest zadeklarowane i jest to int.

próbowałem też tak:

"

MqlRates ratesM1[];
ArraySetAsSeries(ratesM1,true);

int copiedM1 = CopyRates(SymbolsTradeAllowed[x], CopyRatesPeriod,0,CopyRatesBars,ratesM1);


ArrayResize(SymbolsTradeAllowedRates1M, ArraySize(SymbolsTradeAllowedRates1M)+1);
SymbolsTradeAllowedRates1M[x] = ratesM1;
"

i dostaje "invalid array access" przy ostatniej linii. Nie wiem jak przy tym drugiem sposobie powinno się zadeklarować zmienną SymbolsTradeAllowedRates1M, która będzie tablicą, z wieloma ratesM1 dla każdego z instrumentów.


Dodatkowo mam pytanko. Czy w MQL jest coś takiego jak Eval jak w PHP tzn.
że chce posłużyć się nazwą zmiennej, ale nazwę tej zmiennej chcę stworzyć z innej zmiennej czyli w php wyglądałoby to tak:
eval("SymbolsTradeAllowedRates"+ PERIOD + "[x] = rates" + PERIOD ";");

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: LowcaG »

1. w deklaracji masz na pewno 2 błędy.
Pierwszy, że deklaracja musi być określona a nie dynamiczna.
a potem ArrayResize

Po drugie
dynamiczny może być tylko pierwszy wymiar

2. Przy Twoim resize nie widzę w ogóle abyś zdeklarował tablicę SymbolsTradeAllowedRates1M, ale może patrzę zbyt pobieżnie.

3.nie ma eval (mój stan wiedzy na datę mocno wstczną ;) ), ale osobiście uważam, zę to głupie takie dynamiczne tworzeni etablic, po to są tablice, obiekty i inne aby z tego korzystać a nie generowanie N zmiennych i po nazwie je rozpoznajesz.Widziałem w MQL5 (może i w 4 też jest) że można zaimplemetować HashMap więc też można użyć. Możliwości jest wiele

wybitnygracz
Bywalec
Bywalec
Posty: 8
Rejestracja: 16 paź 2018, 19:37

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: wybitnygracz »

"Przy Twoim resize nie widzę w ogóle abyś zdeklarował tablicę SymbolsTradeAllowedRates1M, ale może patrzę zbyt pobieżnie."

double SymbolsTradeAllowedRates1M [];


"Pierwszy, że deklaracja musi być określona a nie dynamiczna."

tak jest w specyfikacji i to działa - https://docs.mql4.com/series/copyrates



Od rana nie mogę sobie poradzić z tym.

Cały kod chciałbym aby wyglądał tak

x = "EUR/USD"
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==FALSE){

}

wybitnygracz
Bywalec
Bywalec
Posty: 8
Rejestracja: 16 paź 2018, 19:37

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: wybitnygracz »

Od rana męczę się z tym kawałkiem kodu, mógłby ktoś pomóc przerobić mi go tak, aby zadziałał:

double SymbolsTradeAllowedRates1M[];
string x = "FUS100." ;
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==false){

MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied = CopyRates(SymbolsTradeAllowed[x], CopyRatesPeriod,0,CopyRatesBarsMax,rates);
ArrayResize(SymbolsTradeAllowedRates1M, ArraySize(SymbolsTradeAllowedRates1M)+1);
SymbolsTradeAllowedRates1M[x] = rates;
}

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: LowcaG »

wybitnygracz pisze:tak jest w specyfikacji i to działa - https://docs.mql4.com/series/copyrates
ale to całkiem inna deklaracja :)

jest różnica między:

Kod: Zaznacz cały

 MqlRates rates[];
a

Kod: Zaznacz cały

MqlRates ratesM1[x][];
wybitnygracz pisze:string x = "FUS100." ;
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==false){
W MQLu nie ma odwołań do indeksów poprzez klucze.
a Ty wpisujesz tam FUS100.


Ps.
Jak będę miał czas to potem zerknę.

Co Ty chcesz osiągnąć tak dokładnie?

wybitnygracz
Bywalec
Bywalec
Posty: 8
Rejestracja: 16 paź 2018, 19:37

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: wybitnygracz »

to co chcę osiągnąć - chcę pobrać CopyRates dla 20 instrumentów, zapisać je w wielowymiarowej tablicy. Bo w skrypcie kilka razy później muszę się do tego odwoływać i nie chcę aby skrypt za każdym razem pobierał z CopyRates bo to jest za mocno obciążające.

"W MQLu nie ma odwołań do indeksów poprzez klucze.
a Ty wpisujesz tam FUS100."

Tak, wiem to pomyłka. Indeksem będzie intreger.

string x = "1" ; //Fus100.
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==false){

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: LowcaG »

wybitnygracz pisze: string x = "1" ; //Fus100.
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==false){
Piszesz integer a robisz stringa :)

mql jest silnie typowanym językiem (PHP z tego co się orientuję nie)

1. Z prostych rozwiązań, (bo lepsze by było jak by użyć hashmap) to wtworzysz tablicę obiektów a w obiekcie masz MqlRates.

2. skoro i tak masz ograniczoną liczbę "kluczy" robisz funkcję konwerstującą ten klucz na inta która Ci da indeks danego obiektu

3. I potem tylko używasz funkcji z pkt 2. jak chcesz się odwoływać,
w klasie odpalasz funkcję która zaktualizuje Ci te Ratesy, a druga funkcja możę być do pobierania lub inne ciekawe funkcje.

Minimalny nakład a wszystko masz :)
Sorry, że tak trochę chaotycznie ale z doskoku piszę

wybitnygracz
Bywalec
Bywalec
Posty: 8
Rejestracja: 16 paź 2018, 19:37

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: wybitnygracz »

tak to kwestia przyzwyczajenia. W php
można zrobić coś takiego
tablica = tablica

a MQL dopiero teraz widzę ze trzeba to zrobić przez ArrayCopy i stąd błedy o których pisałem powyżej. Poczytam o tym "HashMap" , a mam inne pytanie.

Tworze wskaźnik, który chcę nałożyć na 10 wykresów. Przy wyliczeniu danych do wskaźnika tworzonych jest wiele operacji wspólnych dla wszystkich wskaźników.
Czy mogę w jakiś sposób stworzyć sobie tablice w jednym wskaźniku a w kopii tego wskaźnika dla innego wykresu mieć dostęp do tych danych, aby nie potrzebie nie powielać tych samych operacji dla każdego ticka dla 10 wykresów?

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: LowcaG »

wybitnygracz pisze: Tworze wskaźnik, który chcę nałożyć na 10 wykresów. Przy wyliczeniu danych do wskaźnika tworzonych jest wiele operacji wspólnych dla wszystkich wskaźników.
Czy mogę w jakiś sposób stworzyć sobie tablice w jednym wskaźniku a w kopii tego wskaźnika dla innego wykresu mieć dostęp do tych danych, aby nie potrzebie nie powielać tych samych operacji dla każdego ticka dla 10 wykresów?

hm...powiem tak, na tym etapie, nie idź w tę stronę stracisz się.
Ogólnie każda instancja jest właśnie osobną instancją z własną pamięciom itd. jest parę sposób na komunikację między nimi. Ale radził bym Ci po prostu zrobić wskaźnik zoptymalizować go jak najlepiej bo coś czuję, że tu jest głównie problem. A jak będzie dalej coś nie teges z wydajnością to wtedy myślał o komunikacji między indykatorami.

wybitnygracz
Bywalec
Bywalec
Posty: 8
Rejestracja: 16 paź 2018, 19:37

Re: tablica wielowymiarowa z obiektami

Nieprzeczytany post autor: wybitnygracz »

ok, dzięki za pomoc.

ODPOWIEDZ