Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
lxi
Stały bywalec
Stały bywalec
Posty: 40
Rejestracja: 28 sty 2014, 14:04

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: lxi »

ninjaproject pisze:
28 paź 2020, 12:41
Poza tym zmienna Start będzie miała wartość 1 i if() się nie wykona.
Pozwolę się z Tobą nie zgodzić. Nie wiem skąd wywnioskowałeś, że zmienna Start będzie miała wartość 1 skoro wartość ta jest nadawana dopiero po wykonaniu instrukcji "if".

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 1812
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

lxi pisze:
29 paź 2020, 00:13
ninjaproject pisze:
28 paź 2020, 12:41
Poza tym zmienna Start będzie miała wartość 1 i if() się nie wykona.
Pozwolę się z Tobą nie zgodzić. Nie wiem skąd wywnioskowałeś, że zmienna Start będzie miała wartość 1 skoro wartość ta jest nadawana dopiero po wykonaniu instrukcji "if".
O tym pisałem.
Jak się wykona, to już zostanie 1 dopóki nie zrestartujesz kodu w opisany sposób.
OnInit() nie jest wykonywana przy każdym ticku.
Nie do końca rozumiem twojej logiki kodu.
EA się wrzuca na wykres raz, i ono powinno wykonywać swoje zadania.
Skoro musisz wrzucać EA na wykres, żeby go wykonać, to nie ma sensu.
Wystarczyłby Script.
Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

lxi
Stały bywalec
Stały bywalec
Posty: 40
Rejestracja: 28 sty 2014, 14:04

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: lxi »

Kod, który wkleiłem to tylko część EA odpowiedzialna za odczytanie poziomów High i Low ze świecy godzinowej o indeksie 1. Następnie robot pracuje na tych poziomach aż do osiągnięcia targetu, lub innej sytuacji, która usunie go z wykresu.
Problem mam jednak z odczytaniem poprawnych poziomów z ostatniej świecy H1.
Nie wiem dlaczego, ale odczyty są brane z zupełnie innej świecy niż powinny być wzięte.

Przykład:
Chcę aby robot zaczął pracę o godzinie 10:00. Wtedy ma odczytać poziomy High i Low z godziny 09:00 i je zapisać do zmiennych do późniejszego użycia. Niestety do pracy idę na godz. 08:00, więc wrzucam robota na wykres o 07:30.

Z pierwszym tickiem godziny 10:00 powinien pobrać dane z ostatnio zamkniętej godzinówki, a tego nie robi tak jak powinien.

Gdybyś miał taką sytuację, jak byś ją rozwiązał?
Może podsuniesz jakiś pomysł?

Dzięki

rookie2
Stały bywalec
Stały bywalec
Posty: 83
Rejestracja: 29 wrz 2020, 00:10

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: rookie2 »

Dobrze to masz, tylko zmienne Lo i Hi aktualizuj bez warunku, a dopiero logika odpowiedzialna za wyświetlanie danych albo wysyłanie zlecenia wewnątrz warunku który sprawdza godzinę. Inicjalizujesz zmienne Hi oraz Lo dopiero po warunku if, więc dlatego możesz dostawać śmieciowe dane, to się dziw skoro tak robisz. :| Zrób w ten sposób.

Kod: Zaznacz cały

onTick() {
	// zmienne Lo oraz Hi aktualizuj przy każdym obrocie pętli (onTick to pętla która się wykonuje w kółko btw)
	// za każdy powtórzeniem pod adresami gdzie jest Lo i Hi zostaje przypisana aktualna wartość pobrana 
	// z funkcji które tutaj użyłeś.
	Lo = Normalize....
	Hi = Normal....
	
	// Warunek daj do wyświetlania, zamiast do inicjalizacji Lo i Hi
	if (Hour() >= Start_Time && Hour() < End_Time) {
		Print(Lo + " " + Hi);
		// tutaj reszta logiki odpowiedzialna za wysyłanie zlecenia
		// ...
	}
}

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 1812
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

W parametrach EA dałbym godzinę, z której należy brać dane:

Kod: Zaznacz cały

input string                               Hourdata                  = "10:00"; 
W OnTick() pobrałbym obecny czas i czas badanej świecy:

Kod: Zaznacz cały

datetime dt=CurTime();
         datetime dtTime1=StrToTime(TimeToStr(dt,TIME_DATE)+" "+Hourdata);
Potem bym napisał warunek, kiedy mają być dane pobierane, na przykład:

Kod: Zaznacz cały

                  if(Time[0]>StrToTime(TimeToStr(dt,TIME_DATE)+" "+Hourdata))
                   {
                  double dblPrice1,dblPrice2;
                  int b1=iBarShift(NULL,PERIOD_H1,dtTime1,false);
                  dblPrice1=iLow(Symbol(),PERIOD_H1,b1);
                  dblPrice2=iHigh(Symbol(),PERIOD_H1,b1);
                  // Dalej inne polecenia kontrolne i wykonawcze
                   }
                  
Na koniec jeszcze bym dodał funkcję zabezpieczającą przed weekendem.

Oczywiście, szczegóły potrzebujesz sam rozwiązać, albo możesz mi zlecić napisanie EA.
Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

lxi
Stały bywalec
Stały bywalec
Posty: 40
Rejestracja: 28 sty 2014, 14:04

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: lxi »

Dzięki za pomoc.
Użyłeś tutaj wielu funkcji, których nigdy nie używałem i nie wiem jak działają, więc muszę to przestudiować.
Muszę zgłębić StrToTime, TimeToStr czy iBarShift, żeby wiedzieć co się dzieje w tym kodzie:)

pawloice
Bywalec
Bywalec
Posty: 5
Rejestracja: 16 paź 2016, 12:30

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: pawloice »

Witam wszystkich.
Czy ktoś mi pomoże w napisaniu prostego kodu na zamknięcie pozycji BUY / Sell na wykresie range bars po pojawieniu się pierwszej przeciwnej świecy do otwartej pozycji.
Mój EA otwiera i zamyka pozycje na podstawie sygnałów ze wskaźnika i otwarcie mi pasuje lecz zamknięcie jest zbyt za puźno i chciałem dopisać ten że warunek do zamknięcia pozycji.

blashka
Bywalec
Bywalec
Posty: 13
Rejestracja: 27 lis 2020, 18:12

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: blashka »

Witam.
Jestem początkujący i mam pewien problem. Chcę aby mój automat otwierał mi pozycję jeżeli aktualna cena będzie równa maksimum(kupno) lub minimum(sprzedaż) z ostatnich 10 dni. Do obliczenia maksimum używam takiego skryptu: int najwyzszaCena = iHighest(_Symbol,_Period, MODE_HIGH, 10, 0); , a do minimum takiego: int najnizszaCena = iLowest(_Symbol, _Period, MODE_LOW, 10, 0); . Problem pojawia się gdy chce te ceny przyrównać do ceny aktualnej. Dla kupna robię to w ten sposób : if(Ask==najwyzszaCena) i pod warunkiem dodaję: OrderSend (_Symbol, OP_BUY, 0.10, Ask, 3, Ask-600*_Point, Ask+1200*_Point, NULL, 0, 0, Green); . Dla sprzedaży analogicznie Tylko zamiast Ask używam Bid. Niestety pozycje nie otwierają się. Czy ktoś mógłby powiedzieć co robię źle? Dodam że jest to mój pierwszy program :)

grzegrzyw
Gaduła
Gaduła
Posty: 133
Rejestracja: 11 mar 2012, 19:43
Lokalizacja: Świebodzice

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: grzegrzyw »

Ja stosuję zapis: int ticket = OrderSend (Symbol(),........ Sprawdź jaki masz zapis w dzienniku.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 1812
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

1. Jak ma być z 10 dni, to PERIOD_D1.
_Period to jest bieżący interwał, czyli ten, na który patrzysz.

2. Cena bieżąca może nie być równa (==). Raczej ciężko będzie trafić w kwotowania dokładnie równe.

3. NormalizeDouble(Ask-600*_Point,Digits), NormalizeDouble(Ask+1200*_Point,Digits)
Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

ODPOWIEDZ