Wszystkie pytania dozwolone początkujących programistów
- SceptycznyProgramista
- Stały bywalec
- Posty: 37
- Rejestracja: 02 kwie 2011, 23:51
- potrzebujący ;)
- Bywalec
- Posty: 17
- Rejestracja: 29 kwie 2012, 23:02
Witam!
jestem tu nowy i mam nadzieje, że w końcu znajdę odpowiedzi na kilka pytań...
z programowania jestem raczej zielony (choć staram się ile mogę
) więc prosiłbym o łopatologiczne wyjaśnienie,
mam dwa wskaźniki które dają różne sygnały (każdy pokazuje strzałki góra/dół) ale nie bardzo jestem w stanie rozróżnić, które warunki określają poszczególne sygnały
1. czy programując ea mogę odwołać się do tych (własnych) wskaźników a właściwie strzałek? czy można ustawić ea tak aby kupował/sprzedawał gdy pojawią się odpowiednie strzałki?
czy mogę odwołać się do 'SetIndexArrow'?
2. chciałbym też aby ea kupował/sprzedawał tylko jeśli strzałka 2. wskaźnika pojawi się nie później niż 3 świece po strzałce 1.wskaźnika,
3. gdzieś na forum mignęła mi informacja, której teraz już nie umiem znaleźć odnośnie tego, że po int start ea kupuje/sprzedaje co każdy tick, a chodzi o to by kupił/sprzedał tylko raz po spełnieniu się warunków...
4. jak ustawić limit, jedna transakcja dziennie?
za wszelką pomoc serdecznie dziękuję!
Pozdrawiam!
jestem tu nowy i mam nadzieje, że w końcu znajdę odpowiedzi na kilka pytań...
z programowania jestem raczej zielony (choć staram się ile mogę

mam dwa wskaźniki które dają różne sygnały (każdy pokazuje strzałki góra/dół) ale nie bardzo jestem w stanie rozróżnić, które warunki określają poszczególne sygnały

1. czy programując ea mogę odwołać się do tych (własnych) wskaźników a właściwie strzałek? czy można ustawić ea tak aby kupował/sprzedawał gdy pojawią się odpowiednie strzałki?
czy mogę odwołać się do 'SetIndexArrow'?
2. chciałbym też aby ea kupował/sprzedawał tylko jeśli strzałka 2. wskaźnika pojawi się nie później niż 3 świece po strzałce 1.wskaźnika,
3. gdzieś na forum mignęła mi informacja, której teraz już nie umiem znaleźć odnośnie tego, że po int start ea kupuje/sprzedaje co każdy tick, a chodzi o to by kupił/sprzedał tylko raz po spełnieniu się warunków...
4. jak ustawić limit, jedna transakcja dziennie?
za wszelką pomoc serdecznie dziękuję!
Pozdrawiam!
5% z czegoś jest lepsze niż 100% z niczego 

potrzebujący ;) pisze:Witam!
jestem tu nowy i mam nadzieje, że w końcu znajdę odpowiedzi na kilka pytań...
z programowania jestem raczej zielony (choć staram się ile mogę) więc prosiłbym o łopatologiczne wyjaśnienie,
mam dwa wskaźniki które dają różne sygnały (każdy pokazuje strzałki góra/dół) ale nie bardzo jestem w stanie rozróżnić, które warunki określają poszczególne sygnały
1. czy programując ea mogę odwołać się do tych (własnych) wskaźników a właściwie strzałek? czy można ustawić ea tak aby kupował/sprzedawał gdy pojawią się odpowiednie strzałki?
czy mogę odwołać się do 'SetIndexArrow'?
2. chciałbym też aby ea kupował/sprzedawał tylko jeśli strzałka 2. wskaźnika pojawi się nie później niż 3 świece po strzałce 1.wskaźnika,
3. gdzieś na forum mignęła mi informacja, której teraz już nie umiem znaleźć odnośnie tego, że po int start ea kupuje/sprzedaje co każdy tick, a chodzi o to by kupił/sprzedał tylko raz po spełnieniu się warunków...
4. jak ustawić limit, jedna transakcja dziennie?
za wszelką pomoc serdecznie dziękuję!
Pozdrawiam!
Ad3. Ea kupuje/sprzedaje co tick dlatego że przy każdym ticku warunek jest spełniony.
Możesz sobie z tym poradzić używając funkcji isNewBar() - poszukaj na forum. Która będzie odświeżać wskaźnik co świeczkę. Wtedy co nowy Bar ewentualnie Ea kupi/sprzeda.
Dodaj funkcję countOrders() - również poszukaj jej na forum. - i sprawdz przed każdym pojawieniem się strzałki liczbe już otwartych transakcji. Jeśli jest większa od 0 nie pozwalaj otwierać.
Ad 1. Jeśli masz dostęp do kodu znajdź fukncję ObjectCreate() która tworzy strzałkę. Zamiast niej otwórz zlecenie.
Ad 2. Dodaj static int counter. do którego będziesz dodawał wartość co nowy Bar ( isNewBar() funkcja ). Po wystąpieniu strzałki zeruj go. Przed wysłaniem pozycji sprawdzaj warunek czy counter jest już większy niż 3. Jeśli nie jest nie otwieraj pozycji.
fx-forum
Adn. 1
Możesz odwołać się do zewnętrznych wskaźników. Służy do tego iCustom(), poczytaj o tym. Niestety nie posiadam tego wskaźnika więc nie wkleję kodu odwołującego się do niego.
Adn. 2
Można zrobić wszystko co Ci się podoba. Pomocna będzie wspomniana przez kolegę wyżej funkcja sprawdzająca czy pojawiła się nowa świeczka isNewBar(). Wklejałem ją na poprzedniej stronie.
Adn. 3
Żeby ea otwierał tylko jedną pozycję możesz zrobić funkcję sprawdzającą otwarte pozycje. Przed int start() dodajesz funkcję:
A później w int start() przy warunkach otwierania pozycji dodać warunek że otwiera tylko gdy nie ma otwartych pozycji.
Adn. 4
skorzystaj z funkcji sprawdzającej aktualny dzień DayOfWeek() lub innej funkcji daty i czasu i dodaj kolejny warunek.
Możesz odwołać się do zewnętrznych wskaźników. Służy do tego iCustom(), poczytaj o tym. Niestety nie posiadam tego wskaźnika więc nie wkleję kodu odwołującego się do niego.
Adn. 2
Można zrobić wszystko co Ci się podoba. Pomocna będzie wspomniana przez kolegę wyżej funkcja sprawdzająca czy pojawiła się nowa świeczka isNewBar(). Wklejałem ją na poprzedniej stronie.
Adn. 3
Żeby ea otwierał tylko jedną pozycję możesz zrobić funkcję sprawdzającą otwarte pozycje. Przed int start() dodajesz funkcję:
Kod: Zaznacz cały
// deklarujesz zmienne
int a, Kupno, Sprzedaz; //a - zmienna pętli for, Kupno - ilość otwartych pozycji długich, Sprzedaz -ilość otwartych pozycji krótkich
// ########### Funkcja sprawdzająca otwarte pozycje #############
int OtwartePozycje()
{
Kupno=0; Sprzedaz=0;
for(a = OrdersTotal() - 1; a >= 0; a--)
{
OrderSelect(a,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY) Kupno++;
if (OrderType()==OP_SELL) Sprzedaz++;
}
}
return(Kupno+Sprzedaz);
}
Kod: Zaznacz cały
if (OtwartePozycje()==0 && SygnalWskaznika==1)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"EA",8,0,Blue);
.....
}
skorzystaj z funkcji sprawdzającej aktualny dzień DayOfWeek() lub innej funkcji daty i czasu i dodaj kolejny warunek.
Kod: Zaznacz cały
if (OtwartePozycje()==0 && DzienOtwarcia!=DayOfWeek() && SygnalWskaznika==1 )
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"EA",8,0,Blue);
DzienOtwarcia=DayOfWeek();
.....
}
- potrzebujący ;)
- Bywalec
- Posty: 17
- Rejestracja: 29 kwie 2012, 23:02
wielkie dzięki za pomoc!
to wszystko co tu mam... potem już jest kilka linijek int start i to wszystko... czy może w takim razie powienienem dodać ObjectCreate() a później się do niego odwołać?

z tym będzie problem bo we wskaźnikach nie ma funkcji ObjectCreate()...MkubuxK pisze:Ad 1. Jeśli masz dostęp do kodu znajdź fukncję ObjectCreate() która tworzy strzałkę. Zamiast niej otwórz zlecenie.
Kod: Zaznacz cały
int init() {
SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1);
SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1);
SetIndexArrow(1, 233);
SetIndexArrow(0, 234);
SetIndexBuffer(0, g_ibuf_84);
SetIndexBuffer(1, g_ibuf_88);
return (0);
}
5% z czegoś jest lepsze niż 100% z niczego 

potrzebujący ;) pisze:wielkie dzięki za pomoc!![]()
z tym będzie problem bo we wskaźnikach nie ma funkcji ObjectCreate()...MkubuxK pisze:Ad 1. Jeśli masz dostęp do kodu znajdź fukncję ObjectCreate() która tworzy strzałkę. Zamiast niej otwórz zlecenie.to wszystko co tu mam... potem już jest kilka linijek int start i to wszystko... czy może w takim razie powienienem dodać ObjectCreate() a później się do niego odwołać?Kod: Zaznacz cały
int init() { SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1); SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1); SetIndexArrow(1, 233); SetIndexArrow(0, 234); SetIndexBuffer(0, g_ibuf_84); SetIndexBuffer(1, g_ibuf_88); return (0); }
Co to podałeś tutaj określa wygląd strzałki wzrostowej i spadkowej. To co powinno cię interesować w kodzie to gdzie jest wpisywana wartość do buforów.
czyli dynamicznych tablic g_ibuf_84 oraz g_ibuf_88. One reprezentują to gdzie będą pojawiać się strzałki. Znajdując warunek wpisywania do nich wartości odnajdziesz właściwe miejsce wystąpienia warunku. Musisz wyłuskać to jak liczony jest warunek i przepisać go do EA ( wskaźnik liczy przeszłość w buforze a Ty będziesz musiał liczyć aktualną świeczkę )
W kodzie są one wpisywane w pętli tak więc mają jeszcze swój numer:
g_ibuf[84]=1.3456, g_ibuf[40], g_ibuf[a] oznaczać to będzie pojawienie się strzałki na tym poziomie 84 oraz 40 oraz "a" ( jakaś zmienna ) świeczek do tyłu.
fx-forum
ja bym raczej nie grzebał w kodzie wskaźnika tylko wyciągnął jego dane wspomnianą przeze mnie funkcją iCustom(). Dodaj jako załącznik swój wskaźnik to może pomogę. Tu mogę dać przykład wyciągania danych ze wskaźnika TrendMagic.
Zmieniasz sobie tylko nazwę zmiennych, nazwę wskaźnika i przedostatnią cyfrę. Jak wejdziesz na właściwości wskaźnika na platformie i klikniesz na kolory to ich numer (kolumna #) mówi który parametr wyciągasz funkcją iCustom (jest to przedostatnia cyfra w funkcji iCustom w Value1 jest to 0 a w Value2 jest to 1)
Kod: Zaznacz cały
Value1=iCustom(NULL,0, "TrendMagic",0,0);
Value2=iCustom(NULL,0,"TrendMagic",1,0);
Rysowanie obiektów jest jednym z elementów , który najbardziej spowalnia pracę Mt4. W przypadku optymalizacji będzie miało kluczowe znaczenie i może wielokrotnie wydłużyć ten proces. Dodatkowo funkcja może być źle napisana i co tick mielić sporo obliczeń. Sugerowałbym mimo wszystko spróbować chociaż wyłuskać element odpowiedzialny za obliczenia. Jak nie da rady pozostaje ICustom.Japco pisze:ja bym raczej nie grzebał w kodzie wskaźnika tylko wyciągnął jego dane wspomnianą przeze mnie funkcją iCustom(). Dodaj jako załącznik swój wskaźnik to może pomogę. Tu mogę dać przykład wyciągania danych ze wskaźnika TrendMagic.
Zmieniasz sobie tylko nazwę zmiennych, nazwę wskaźnika i przedostatnią cyfrę. Jak wejdziesz na właściwości wskaźnika na platformie i klikniesz na kolory to ich numer (kolumna #) mówi który parametr wyciągasz funkcją iCustom (jest to przedostatnia cyfra w funkcji iCustom w Value1 jest to 0 a w Value2 jest to 1)Kod: Zaznacz cały
Value1=iCustom(NULL,0, "TrendMagic",0,0); Value2=iCustom(NULL,0,"TrendMagic",1,0);
Możliwe że wskaźnik do bufora wspisuje albo 0 albo wartość double po której rysuje strzałkę i trzeba będzie sprawdzać wartość przed wysłaniem zlecenia i sprawdzić czy nie jest zerem. Jeśli nie jest wysyła odpowiednie zlecenie.
Kod: Zaznacz cały
if(iCustom(NULL,0, "TrendMagic",0,0)!=0)OrderSend((...),OP_BUY);
if(iCustom(NULL,0, "TrendMagic",1,0)!=0)OrderSend((...),OP_SELL);
fx-forum
- potrzebujący ;)
- Bywalec
- Posty: 17
- Rejestracja: 29 kwie 2012, 23:02
chwila, coś chyba mam...
na początku mam:
a potem w int start jest coś takiego:
PS. Wasza pomoc jest nieoceniona

na początku mam:
Kod: Zaznacz cały
extern int SignalGap = 4;
int gi_80 = 24;
double g_ibuf_84[];
double g_ibuf_88[];
Kod: Zaznacz cały
for (int li_8 = li_16; li_8 >= 0; li_8--) {
l_highest_20 = iHighest(NULL, 0, MODE_HIGH, gi_80, li_8 - gi_80 / 2);
l_lowest_24 = iLowest(NULL, 0, MODE_LOW, gi_80, li_8 - gi_80 / 2);
if (li_8 == l_highest_20) g_ibuf_84[li_8] = High[l_highest_20] + SignalGap * Point;
if (li_8 == l_lowest_24) g_ibuf_88[li_8] = Low[l_lowest_24] - SignalGap * Point;
}
return (0);
}


5% z czegoś jest lepsze niż 100% z niczego 
