Tworzenie i usuwanie obiektów

O jezykach programowania w platformach i nie tylko.
rzemyk
Bywalec
Bywalec
Posty: 10
Rejestracja: 16 maja 2011, 16:21

Tworzenie i usuwanie obiektów

Nieprzeczytany post autor: rzemyk »

Witam

Mam mały problem z napisaniem działającego kodu. Nie znam się za bardzo na językach programowania, ale trochę poczytałem i mniej więcej wiem o co chodzi.
Chciałbym na początek stworzyć coś takiego, że gdy cena dojdzie do linii poziomej EA tworzyłby nową linię przesuniętą np. o 50 pipsów w górę i jednocześnie usuwał starą. Wyrzeźbiłem coś takiego:

Kod: Zaznacz cały

int start()
  {
//----
   if (Bid < ObjectFind("linia1"))
     ObjectCreate("linia2",OBJ_HLINE,0,iTime(0,0,0),100,0,0,0,0);
     ObjectDelete("linia1");

//----
   return(0);
  }
W tym wypadku druga linia miałaby zostać stworzona na poziomie 100.
Linie1 tworzę ręcznie na wykresie. Niestety to nie działa i nie wiem czemu. Wydaje mi się, że logicznie jest to dobrze napisane. Nie wiem też jak zapisać by druga linia była tworzona w odstępie tych przykładowych 50 pipsów wyżej od drugiej. Byłbym wdzięczny za pomoc w rozwiązaniu tego problemu.

bialy
Stały bywalec
Stały bywalec
Posty: 54
Rejestracja: 16 maja 2011, 20:41

obiekty

Nieprzeczytany post autor: bialy »

1. funkcja int ObjectFind( string name) zwraca numer okna w ktorym znajduje sie linia czyli nijak ma sie do ceny Bid z ktora porownujesz
int ObjectFind( string name)
Search for an object having the specified name. The function returns index of the windows that contains the object to be found.
wersja 1 kodu:

Kod: Zaznacz cały

if(Bid < ObjectGet("linia1",OBJPROP_PRICE1)) {
   if(ObjectCreate("linia2",OBJ_HLINE,0,TimeCurrent(),ObjectGet("linia1",OBJPROP_PRICE1)+50*Point))
      ObjectSet("linia2",OBJPROP_STYLE,ObjectGet("linia1",OBJPROP_STYLE));               //ta 
      ObjectSet("linia2",OBJPROP_COLOR,ObjectGet("linia1",OBJPROP_COLOR));            // i ta linijka ustawia taki sam styl i kolor nowo tworzonej linii
      ObjectDelete("linia1");
}
wersja 2: /wg mnie lepsza/

Kod: Zaznacz cały

if(Bid < ObjectGet("linia1",OBJPROP_PRICE1)) {
   ObjectMove("linia1",0,TimeCurrent(),ObjectGet("linia1",OBJPROP_PRICE1)+50*Point);
}
pierwszy post /bo troche sie nudze/ wiec nie wiem czy wyswietlony kod bedzie ok. calosc sprawdzana skryptem i jest OK

PS. OSZCZEDZAJMY CYKLE PROCESORA :)

rzemyk
Bywalec
Bywalec
Posty: 10
Rejestracja: 16 maja 2011, 16:21

Nieprzeczytany post autor: rzemyk »

Dzięki za pomoc, ale niestety podane wyżej kody również nie działają. Niby taka banalna rzecz a nie mogę sobie z nią poradzić, trochę to irytujące...


Edycja:

Jednak wszystko jest ok, to mój błąd. Włączałem strategię w pasku zadań, a nie zauważyłem, że nie jest do niej przypisany żaden EA i nic się nie uruchamia. Dzięki jeszcze raz za pomoc.
Ostatnio zmieniony 17 maja 2011, 10:03 przez rzemyk, łącznie zmieniany 1 raz.

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

Nieprzeczytany post autor: Tig3r »

rzemyk
najpierw kasuj potem rysuj a nie odwrotnie - bo to co narysujesz to od razu usuwasz.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

rzemyk
Bywalec
Bywalec
Posty: 10
Rejestracja: 16 maja 2011, 16:21

Nieprzeczytany post autor: rzemyk »

Już sobie poradziłem z tym.

Tig3r]

Wydaje mi się, że jeżeli najpierw usunę obiekt linia1, to wtedy EA nie stworzy mi obiektu linia2 przesuniętego o 50 pipsów względem obiektu linia 1. Po prostu usunę wartość do której ma dodać te 50 pipsów. Mówię tu o przypadku kiedy operować będę na dwóch liniach o różnych nazwach, niż jednej ale przesuwanej. W tym drugim wypadku rzeczywiście może tak być, że kasuję to co tworzę.
W każdym razie wszystko działa tak jak chciałem. Wracam do dalszej pracy nad kodem.

rzemyk
Bywalec
Bywalec
Posty: 10
Rejestracja: 16 maja 2011, 16:21

Nieprzeczytany post autor: rzemyk »

Dalsze pisanie kodu szło mi całkiem dobrze, aż do pewnego momentu. Przy próbie kompilacji wywaliło mi błąd:

internal stack overflow-simplify the program, please

Mój EA ma wykonywać zlecenia w zależności od tego który z 200 różnych obiektów liniowych aktualnie istnieje na wykresie. Dlatego w kodzie musiałem napisać 200 warunków dotyczących tych obiektów . Kod dla każdego ticku sprawdza czy istnieje obiekt 1, obiekt 2, ..., obiekt 200. Jeżeli znajdzie już jakiś obiekt to dla niego wykonuje już odrębne polecenie. Ważne jest, że dla każdego obiektu to polecenie jest inne więc te warunki muszą być gdzieś zapisane. No i tu jest lipa, bo przy 996 linii kodu EA twierdzi, że program jest za skomplikowany. Myślałem nad uproszczeniem, ale niestety wydaje mi się, że już prościej się nie da. Chyba jedynym sposobem, było by stworzenie 200 osobnych EA odpowiednio między sobą połączonych.

Moje pytanie jest takie: czy istnieje możliwość, że EA po spełnieniu jakiegoś warunku otwiera inne EA, a samo następnie się zamyka? I jak to ewentualnie zapisać w kodzie?

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

Nieprzeczytany post autor: Tig3r »

rzemyk pisze:Dlatego w kodzie musiałem napisać 200 warunków dotyczących tych obiektów .
Wystarczy jeden z odpowiednią pętlą i case do wyboru działania.
Albo jeden obiekt przyjmujący rożnie stany - opis czy parametr.
Zamiast obiektów chyba lepsze by były zmienne globalne.
rzemyk pisze:Moje pytanie jest takie: czy istnieje możliwość, że EA po spełnieniu jakiegoś warunku otwiera inne EA, a samo następnie się zamyka? I jak to ewentualnie zapisać w kodzie?
internal stack overflow-simplify the program, please
Nie spotkałem się jeszcze z tym a już trochę na trzaskałem kodów..
Ostatnio zmieniony 20 maja 2011, 15:08 przez Tig3r, łącznie zmieniany 1 raz.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

internal stack overflow-simplify the program, please
na pewno da się to uprościć ale powinno również pomóc rozbicie tej funkcji, w której masz tą kolosalną ilość warunków na kilka mniejszych.

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

Nieprzeczytany post autor: LowcaG »

rzemyk pisze:internal stack overflow-simplify the program, please
Dobrze radza ;)

moze jeszcze pomoc
#property stacksize

Ale raczej dazyl bym w ingerencje kodu, na 98% jest zle "skomponowany".

rzemyk
Bywalec
Bywalec
Posty: 10
Rejestracja: 16 maja 2011, 16:21

Nieprzeczytany post autor: rzemyk »

Z której strony się za to nie zabiorę to wychodzi na to, że pierwszy pomysł był najprostszy. Pozostaje mi poczekać na nową generację MQL z większą mocą obliczeniową :) Zanim to nastąpi, przejdę do planu B, czyli kupna telefonu z obsługą MT4.

ODPOWIEDZ