Pisanie własnej historii w MQL

O jezykach programowania w platformach i nie tylko.
259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Pisanie własnej historii w MQL

Nieprzeczytany post autor: 259 »

Witam,

Chodzi o zapisywanie własnych słupków do plików hst dla wykresów offline:

Czy jak przychodzi mi nowy tik od brokera co modyfikuje mi bieżący, otwarty słupek to czy muszę to tak samo uaktualniać w pliku hst czy dopisać po prostu dopisać następny rekord?

O co chodzi:
dajmy na to, że mam w swojej historii 100 słupków H1 i otwiera się nowy - tutaj sprawa jest prosta, dopisuję nowe dane.
Ale z następnym tikiem ten nowy słupek się zmienia i jak teraz dopiszę nowe dane to będę miał w historii dwa rekordy odnoszące się do tego samego słupka. Zgadza się?

I teraz nie wiem czy to jest dobrze czy źle. Logicznie jest źle - powinienem zmodyfikować ostatni rekord zamiast dodawać nowy z tą samą sygnaturą czasową.
A tutaj jest problem bo musiałbym za każdym razem skanować końcówkę takiego pliku zanim coś w nim napiszę. Co zabiera niestety trochę czasu i odciska mi się na funkcjonowaniu UI bo indyki cholera chodzą właśnie w tym wątku, a EA co prawda w innym ale za to w drugiej kolejności odśnieżania :-|

Chyba że MT4/MQL ma coś co pozwala na automatyczne ominięcie takich rzeczy?
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Może po prostu zapisywanie tylko na rozpoczęciu nowego słupka?

Kod: Zaznacz cały

bool isNewBar(int period) 
{
   static int prevTimeM1;
   static int prevTimeM5;
   static int prevTimeM15;
   static int prevTimeM30;   
   static int prevTimeH1;
   static int prevTimeH4;
   static int prevTimeD1;
   static int prevTimeW1;
   
   bool newBar_M1  = false;
   bool newBar_M5  = false;
   bool newBarM15  = false;
   bool newBarM30  = false;
   bool newBar_H1  = false;
   bool newBar_H4  = false;
   bool newBar_D1  = false;
   bool newBar_W1  = false;
   
   
   switch(period)
      {
         case PERIOD_M1:
            {
               if(iTime(NULL,period,0)!=prevTimeM1) 
                  {
                     newBar_M1=true;
                     prevTimeM1=iTime(NULL,period,0);
                  }
                return(newBar_M1);
            }
            
         case PERIOD_M5:
            {
               if(iTime(NULL,period,0)!=prevTimeM5) 
                  {
                     newBar_M5=true;
                     prevTimeM5=iTime(NULL,period,0);
                  }
                return(newBar_M5);
            } 
            
         case PERIOD_M15:
            {
               if(iTime(NULL,period,0)!=prevTimeM15) 
                  {
                     newBarM15=true;
                     prevTimeM15=iTime(NULL,period,0);
                  }
                return(newBarM15);
            }   
                   
         case PERIOD_M30:
             {
               if(iTime(NULL,period,0)!=prevTimeM30) 
                  {
                     newBarM30=true;
                     prevTimeM30=iTime(NULL,period,0);
                  }
                return(newBarM30);
            }           
         case PERIOD_H1:
            {
               if(iTime(NULL,period,0)!=prevTimeH1) 
                  {
                     newBar_H1=true;
                     prevTimeH1=iTime(NULL,period,0);
                  }
                return(newBar_H1);
            }        
                
         case PERIOD_H4:
             {
               if(iTime(NULL,period,0)!=prevTimeH4) 
                  {
                     newBar_H4=true;
                     prevTimeH4=iTime(NULL,period,0);
                  }
                return(newBar_H4);
            }           
         case PERIOD_D1:
                  {
               if(iTime(NULL,period,0)!=prevTimeD1) 
                  {
                     newBar_D1=true;
                     prevTimeD1=iTime(NULL,period,0);
                  }
                return(newBar_D1);
            }
         case PERIOD_W1:
                  {
               if(iTime(NULL,period,0)!=prevTimeW1) 
                  {
                     newBar_W1=true;
                     prevTimeW1=iTime(NULL,period,0);
                  }
                return(newBar_W1);
            }            
      }  
    }

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

W sensie, że słupek zapisuję dopiero jak otworzy się nowy? Jak np. Close[0] stanie się Close [1]?
Owszem ma to sens. Ale... będzie spóźnione o jeden słupek.
Widziałeś te moje bazgraniny "co gdzie idzie" plus "jak" ;-)
Ja z tego robię wykresy słupkowe poszczególnych walut w czasie rzeczywistym. I z tym mam problem bo robią mi się dziwne rzeczy na wykresach po przekroczeniu słupka. Dopiero po restarcie pokazują ok.
Może powinienem ponownie przestudiować Period Converter... ale mam do niego jakiś taki niesmak... może bezzasadny ale jednak.
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

259 pisze:Czy jak przychodzi mi nowy tik od brokera co modyfikuje mi bieżący, otwarty słupek to czy muszę to tak samo uaktualniać w pliku hst czy dopisać po prostu dopisać następny rekord?
Aktualizujesz
MT4 minimalnie wykorzystuje TF M1 a więc jak na m1 przychodzi tick to aktualizowana jest bieżąca świeca (same ticki w obrębie świecy na symulatorze są tworzone losowo).

Dodano po 2 minutach:
259 pisze: tutaj jest problem bo musiałbym za każdym razem skanować końcówkę takiego pliku zanim coś w nim napiszę.
Jeśli masz cały czas otwarty dostęp do pliku (init - open, deinit - close) to możesz cofać poruszać po pliku jak chcesz przez FileSeek
nie ma potrzeby otwierać pliku, badać ile ma danych, przesuwać i zamykać
jak masz otwarty to jedynie się przesuwasz i zapisujesz
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

Tig3r pisze: Jeśli masz cały czas otwarty dostęp do pliku (init - open, deinit - close) to możesz cofać poruszać po pliku jak chcesz przez FileSeek
nie ma potrzeby otwierać pliku, badać ile ma danych, przesuwać i zamykać
jak masz otwarty to jedynie się przesuwasz i zapisujesz
Dzięki Tig3r - tak jak myślałem: trzeba aktualizować dane (ze szczególną starannością) zamiast dopisywać śmieci - stara szkoła DB się kłania :-)
Ale niestety trzeba będzie skanować ostatnie dane jak coś nie tak - to o czym piszesz będzie działało świetnie jak wszystko idzie bez żadnych zakłóceń. Ale wystarczy cokolwiek co spowoduje albo dziurę albo uzupełnianie lokalnej historii i trzeba zaczynać od nowa z punktem synchronizacji.
Nie ma lekko - MQL jest straaasznie daleko od rzeczywistości... :-|
Ostatnio zmieniony 07 wrz 2012, 20:55 przez 259, łącznie zmieniany 1 raz.
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

259

A może "bufor" i dołączanie do głównego pliku na końcu świeczki?

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

Esco pisze:259

A może "bufor" i dołączanie do głównego pliku na końcu świeczki?
Problem polega na tym, żeby to co zapiszę do hst odpowiadało bieżacym zmianom rynku nawet jak ostatnia świeczka nie jest jeszcze zakończona.
Ja z tego robię potem coś takiego:
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Re: Pisanie własnej historii w MQL

Nieprzeczytany post autor: crn »

nie do konc arozumiem temat, ale moze przypomnienie, o kontenerze jakim jest mapa cos pomoze ? :)
Rozumiem, ze dane chesz przekazywac poza mql (do c++ pewnie ).
To wysylaj do c++ zestaw ) tick + data i z poziomu c++ uzyj mapy (nawet nie musisz pisac tego dziadostwa - stl je dostarcza )

ODPOWIEDZ