Naprawianie błędu tablicy poza zakresem w MT4 EA
Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki od 1 do 10 z 13

Wątek: Naprawianie błędu tablicy poza zakresem w MT4 EA

  1. #1
    Zrobiłem EA z następującymi...

    zewn. wewn IntIndTF1 = 4;
    wewn zewn IntInd1S1 = 2;
    wewn zewn IntInd1S2 = 14;

    zewn. wewn IntIndTF2 = 1;
    wewn. zewn IntInd2S1 = 3;
    wewn. zewn IntInd2S2 = 9;
    Wstawiony kod PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,IntInd1S1)#93;; PerL1 = Niski#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,cyfry); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,IntInd2S1)#93;; PerL2 = Niski#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW ,IntInd2S2,IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,cyfry);
    Działało świetnie, dopóki nie zacząłem testować z nim innych symboli, a potem pojawił się przerażający błąd Array poza zasięgiem, więc zmieniłem go na ten ...
    Wstawiony kod int BarCount = Bars; if (BarCount lt; 1) BarCount = 1; for (int i=0; igt;Bars; i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,i IntInd1S1)#93;; PerL1 = Niski#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,i IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,cyfry); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,i IntInd2S1)#93;; PerL2 = Niski#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW ,IntInd2S2,i IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,cyfry); } Wygląda na to, że liczba błędów tablicy poza zakresem uległa zmniejszeniu. JEDNAK teraz nie mogę go zmusić do symulacji poprzednich ustawień, które spisywały się dobrze...

    zewn. wewn IntIndTF1 = 4;
    wewn zewn IntInd1S1 = 2;
    wewn zewn IntInd1S2 = 14;

    zewn. wewn IntIndTF2 = 1;
    wewn. zewn IntInd2S1 = 3;
    wewn. zewn IntInd2S2 = 9;

    Testowałem zakresy 1 i -1, ale EA nie powraca teraz do tych samych obliczonych wartości dla tych samych słupków. Jak zmienić kod, aby wyeliminować błędy, zachowując poprzednio przetestowane wartości i wyniki.

    To jest w EA, które nie używają wskaźnika. Wartości HHLL znajdują się w samym EA. Chcę, aby był w stanie odczytać i uzyskać te same wyniki dla zmiennej extern na pasku, który wyzwala sygnał.

  2. #2
    Dodałem -1 do liczby słupków limitu i wydaje się, że działa bez wpływu na jakiekolwiek zmiany w wynikach, więc jest w porządku. Aby upewnić się, że iLowest/iHigheset nie zwraca -1, zrobiłem to, jestem pewien, że nie jest to właściwy sposób b/c wyniki są okropne... Wstawiony kod int BarsCounted1 = TFBars1-MathMax(IntInd1S2,IntInd1S1 1); if (BarsCounted1 lt; 0) {return;} int LimitBars1 = TFBars1-BarsCounted1; for (LiczbaPasek1 = LimitBars1-1;LiczbaBarów1 gt;= 0;LiczbaBarów1--) { if ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntI nd1S2,BarCount1 IntInd1S1) lt; 0) || (iLowest(SymbolToManage,Int_IndTF1,MODE) ,IntInd1S2,BarCount1 IntInd1S1) lt; 0)) powrót; if ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntI nd1S2,BarCount1 IntInd1S1) gt; -1) (iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1 S2,BarCount1 IntInd1S1) gt; -1)) PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,BarCount1 IntInd1S1)#93;; PerL1 = Niski#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,BarCount1 IntInd1S1)#93;;/OZ1 = NormalizujDouble((OZ1 OZ1)/2,Cyfry); }

  3. #3

    Cytat Zamieszczone przez ;
    Tak, to był błąd kopiowania i wklejania powyżej. Nie jestem pewien, czy rozumiem koncepcję biegu po 17. takcie i jak to wdrożyć lub dlaczego to działa. W międzyczasie załatwiłem to ... powtórzyłem po raz drugi z drugim zestawem zmiennych dla drugiego wskaźnika w ramach ea. Wspomniane przez słupki z przesunięciem czasowym sprawiły, że testowanie było bardziej kontrolowane i mniej podatne na kaprysy kompilatora MT4, ponieważ testuje on pod kątem dowolnego TF, ale umieszcza na wykresie 4-godzinnym. Ostatecznie chcę, aby ea działał tak samo z tymi samymi wynikami, niezależnie od wykresu TF, to...
    Nie zapomnij o (-1), aby przekonwertować z rozmiaru na pozycję BarCount1=LimitBars1-1 i upewnij się, że iLowest/iHighest nie zwraca -1

  4. #4
    Tak, to był błąd kopiowania i wklejania powyżej. Nie jestem pewien, czy rozumiem koncepcję biegu po 17. takcie i jak to wdrożyć lub dlaczego to działa. W międzyczasie załatwiłem to ... powtórzyłem po raz drugi z drugim zestawem zmiennych dla drugiego wskaźnika w ramach ea. Słupki z przesunięciem czasowym wspomniane przez Beerrun sprawiły, że testowanie było bardziej kontrolowane i mniej do kaprysu kompilatora MT4, ponieważ testuje on dowolny TF, ale umieszcza na wykresie 4-godzinnym. Ostatecznie chcę, aby ea działał tak samo z tymi samymi wynikami, niezależnie od wykresu TF, na którym się znajduje. Myślę, że czytanie TF z Bars() jest częścią rozwiązania. Błąd tablicy poza zakresem, nadal jest problemem, jakie jest znaczenie 17. słupka i jak sprawić, by ea działała po 17 słupku? Wstawiony kod int BarCount1; int TFBars1 = Bars(SymbolToManage,IntIndTF1); int BarsCounted1 = TFBars1-MathMax(IntInd1S2,IntInd1S1 1); if (BarsCounted1 lt; 0) {return;} int LimitBars1 = TFBars1-BarsCounted1; for (LicznikBarów1 = LimitBars1; LicznikBarów1 gt;= 0; LicznikBarów1--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,BarCount1 IntInd1S1)#93;; itd... }

  5. #5

    Cytat Zamieszczone przez ;
    Udało mi się uzyskać zmienne, aby przejść i symulować poprzednie wyniki bardzo ściśle za pomocą tego... int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntIn d1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High[iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd 1S2,i IntInd1S1)]; PerL1 = Niski[iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S 2,i IntInd1S1)]; PerM1 = NormalizeDouble((PerH1 PerL1)/2,cyfry); PerH2 = High[iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd 2S2,i IntInd2S1)]; PerL2 = Niski[iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S 2,i IntInd2S1)];...
    Czy na pewno otrzymujesz błąd z powyższego? Ponieważ nie wypełnia to żadnych tablic, po prostu przypisuje wartość ostatniego i do podwojeń i wykonuje niepotrzebne cykle. Cześć! ofc może uderzyć w wysokie lub niskie wartości poza zasięgiem. W tym celu po prostu ustaw ea na bieg po 17. takcie.

  6. #6

    Cytat Zamieszczone przez ;
    Cóż, nadal otrzymuję błędy tablicy poza zakresem na innych symbolach podczas testów z tym. Umieszczenie go poza zaznaczeniem przez zaznaczenie, aby przyspieszyć, jest plusem, ale nie rozwiązuje oryginalnego problemu. Powrót do zapasów.
    Być może użyj funkcji Bars(), która przyjmuje symbol i przedział czasowy jako parametry, zamiast zmiennej Bars, która jest ograniczona do bieżącego symbolu wykresu i przedziału czasowego. Dodatkową rzeczą do rozważenia jest to, że jeśli iLowest/Highest zwróci błąd,#8217;będziesz robił Low[-1]

  7. #7
    Udało mi się uzyskać zmienne, aby przejść i symulować poprzednie wyniki bardzo ściśle z tym... Wstawiony kod int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntIn d1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,i IntInd1S1)#93;; PerL1 = Niski#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,i IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,cyfry); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,i IntInd2S1)#93;; PerL2 = Niski#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW ,IntInd2S2,i IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,cyfry); IntInd1S2,i IntInd1S1 były wcześniej ustawione na 2 i 14, a teraz działają na 1 i 13, co ma sens. Jednak wciąż pojawiają się błędy tablicy poza zakresem.

  8. #8
    Cóż, nadal otrzymuję błędy tablicy poza zakresem na innych symbolach podczas testów z tym. Umieszczenie go poza zaznaczeniem przez zaznaczenie, aby przyspieszyć, jest plusem, ale nie rozwiązuje oryginalnego problemu. Powrót do zapasów. Wstawiony kod int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,IntInd1S1)#93;; PerL1 = Niski#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,cyfry); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,IntInd2S1)#93;; PerL2 = Niski#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW ,IntInd2S2,IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,cyfry); }

  9. #9

    Cytat Zamieszczone przez ;
    {cytat} Tak, powinno działać. Jeśli nie, utwórz zmienną, aby zachować bieżącą liczbę. W przeciwnym razie będzie uruchamiać pętlę dla każdego taktu przy każdym tiku.
    Oto co zrobiłem... Wstawiony kod int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { itd. itd. itd. } Wygląda na to, że mógł zająć się tablicą poza zakresem, muszę sprawdzić inne symbole do przetestowania . Jednak test przez kleszcza trwał wiecznie. Sprawdziłem więc, kiedy i gdzie ten kod jest wywoływany i wyjąłem go z górnej sekcji void OnInit i umieściłem po wstawionym kodzie static datetime prevtime = Time#91;0#93;; if (prevtime == Czas#91;0#93 return; prevtime = Czas#91;0#93;; które mam u dołu OnInit Nie trzeba było go sprawdzać tik po tiku, tylko takt, podczas gdy inne części strategii wyjścia wymagają monitorowania tik po tiku. Myślę, że teraz powinno działać. Muszę to sprawdzić z innymi symbolami, które sprawiały mi problem, ale usunięcie kodu z kleszcza przez sprawdzanie kleszcza sprawia, że ​​działa on oczywiście znacznie szybciej.

  10. #10

    Cytat Zamieszczone przez ;
    {quote} Kod znajduje się tylko wewnątrz EA, a nie wskaźnik, czy IndicatorCounted() nadal będzie działać wewnątrz EA?
    Tak, powinno działać. Jeśli nie, utwórz zmienną, aby zachować bieżącą liczbę. W przeciwnym razie będzie uruchamiać pętlę dla każdego taktu przy każdym tiku.

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Używamy cookies
Używamy cookies, aby jak najlepiej dostosować witrynę do Twoich potrzeb. Kontynuowanie przeglądania tej strony, oznacza zgodę na używanie plików cookies. Aby uzyskać więcej informacji zapoznaj się z naszą Polityką Prywatności.