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".ninjaproject pisze: ↑28 paź 2020, 12:41Poza tym zmienna Start będzie miała wartość 1 i if() się nie wykona.
Wszystkie pytania dozwolone początkujących programistów
Re: Wszystkie pytania dozwolone początkujących programistów
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
O tym pisałem.lxi pisze: ↑29 paź 2020, 00:13Pozwolę 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".ninjaproject pisze: ↑28 paź 2020, 12:41Poza tym zmienna Start będzie miała wartość 1 i if() się nie wykona.
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.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.
Programuję wskaźniki i EA do MetaTrader 4/5.
Re: Wszystkie pytania dozwolone początkujących programistów
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
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
Re: Wszystkie pytania dozwolone początkujących programistów
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
// ...
}
}
https://www.myfxbook.com/members/rookie_t/pycha-kroczy-przed-upadkiem/7931743
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
W parametrach EA dałbym godzinę, z której należy brać dane:
W OnTick() pobrałbym obecny czas i czas badanej świecy:
Potem bym napisał warunek, kiedy mają być dane pobierane, na przykład:
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.
Kod: Zaznacz cały
input string Hourdata = "10:00";
Kod: Zaznacz cały
datetime dt=CurTime();
datetime dtTime1=StrToTime(TimeToStr(dt,TIME_DATE)+" "+Hourdata);
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
}
Oczywiście, szczegóły potrzebujesz sam rozwiązać, albo możesz mi zlecić napisanie EA.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.
Programuję wskaźniki i EA do MetaTrader 4/5.
Re: Wszystkie pytania dozwolone początkujących programistów
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:)
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:)
Re: Wszystkie pytania dozwolone początkujących programistów
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.
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.
Re: Wszystkie pytania dozwolone początkujących programistów
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
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
Re: Wszystkie pytania dozwolone początkujących programistów
Ja stosuję zapis: int ticket = OrderSend (Symbol(),........ Sprawdź jaki masz zapis w dzienniku.
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
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)
_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)
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.
Programuję wskaźniki i EA do MetaTrader 4/5.