tablica wielowymiarowa z obiektami
-
- Bywalec
- Posty: 8
- Rejestracja: 16 paź 2018, 19:37
tablica wielowymiarowa z obiektami
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 ";");
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 ";");
Re: tablica wielowymiarowa z obiektami
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
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
-
- Bywalec
- Posty: 8
- Rejestracja: 16 paź 2018, 19:37
Re: tablica wielowymiarowa z obiektami
"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){
}
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){
}
-
- Bywalec
- Posty: 8
- Rejestracja: 16 paź 2018, 19:37
Re: tablica wielowymiarowa z obiektami
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;
}
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;
}
Re: tablica wielowymiarowa z obiektami
ale to całkiem inna deklaracjawybitnygracz pisze:tak jest w specyfikacji i to działa - https://docs.mql4.com/series/copyrates
jest różnica między:
Kod: Zaznacz cały
MqlRates rates[];
Kod: Zaznacz cały
MqlRates ratesM1[x][];
W MQLu nie ma odwołań do indeksów poprzez klucze.wybitnygracz pisze:string x = "FUS100." ;
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==false){
a Ty wpisujesz tam FUS100.
Ps.
Jak będę miał czas to potem zerknę.
Co Ty chcesz osiągnąć tak dokładnie?
-
- Bywalec
- Posty: 8
- Rejestracja: 16 paź 2018, 19:37
Re: tablica wielowymiarowa z obiektami
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){
"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){
Re: tablica wielowymiarowa z obiektami
Piszesz integer a robisz stringawybitnygracz pisze: string x = "1" ; //Fus100.
if(GlobalVariableCheck(SymbolsTradeAllowedRates1M[x])==false){
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ę
-
- Bywalec
- Posty: 8
- Rejestracja: 16 paź 2018, 19:37
Re: tablica wielowymiarowa z obiektami
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?
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?
Re: tablica wielowymiarowa z obiektami
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.
-
- Bywalec
- Posty: 8
- Rejestracja: 16 paź 2018, 19:37
Re: tablica wielowymiarowa z obiektami
ok, dzięki za pomoc.