Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
SceptycznyProgramista
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 02 kwie 2011, 23:51

Nieprzeczytany post autor: SceptycznyProgramista »

Dzięki wielkie:)

Awatar użytkownika
Japco
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 24 lip 2010, 20:42

Nieprzeczytany post autor: Japco »

nie zapomnij przed int start() i funkcjami zadeklarować zmiennej x jako

int x;

Awatar użytkownika
potrzebujący ;)
Bywalec
Bywalec
Posty: 17
Rejestracja: 29 kwie 2012, 23:02

Nieprzeczytany post autor: potrzebujący ;) »

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ę :roll: ) 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 :cry:
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 :P

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

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ę :roll: ) 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 :cry:
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

Awatar użytkownika
Japco
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 24 lip 2010, 20:42

Nieprzeczytany post autor: Japco »

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ę:

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);
 }
A później w int start() przy warunkach otwierania pozycji dodać warunek że otwiera tylko gdy nie ma otwartych pozycji.

Kod: Zaznacz cały

if (OtwartePozycje()==0 && SygnalWskaznika==1)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"EA",8,0,Blue);
.....
}
Adn. 4
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();
.....
}

Awatar użytkownika
potrzebujący ;)
Bywalec
Bywalec
Posty: 17
Rejestracja: 29 kwie 2012, 23:02

Nieprzeczytany post autor: potrzebujący ;) »

wielkie dzięki za pomoc! :D

MkubuxK pisze:Ad 1. Jeśli masz dostęp do kodu znajdź fukncję ObjectCreate() która tworzy strzałkę. Zamiast niej otwórz zlecenie.
z tym będzie problem bo we wskaźnikach nie ma funkcji ObjectCreate()...

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);
}
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ć?
5% z czegoś jest lepsze niż 100% z niczego :P

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

potrzebujący ;) pisze:wielkie dzięki za pomoc! :D

MkubuxK pisze:Ad 1. Jeśli masz dostęp do kodu znajdź fukncję ObjectCreate() która tworzy strzałkę. Zamiast niej otwórz zlecenie.
z tym będzie problem bo we wskaźnikach nie ma funkcji ObjectCreate()...

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);
}
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ć?

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

Awatar użytkownika
Japco
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 24 lip 2010, 20:42

Nieprzeczytany post autor: Japco »

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.

Kod: Zaznacz cały

Value1=iCustom(NULL,0, "TrendMagic",0,0);
Value2=iCustom(NULL,0,"TrendMagic",1,0);
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)

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

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.

Kod: Zaznacz cały

Value1=iCustom(NULL,0, "TrendMagic",0,0);
Value2=iCustom(NULL,0,"TrendMagic",1,0);
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)
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.

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

Awatar użytkownika
potrzebujący ;)
Bywalec
Bywalec
Posty: 17
Rejestracja: 29 kwie 2012, 23:02

Nieprzeczytany post autor: potrzebujący ;) »

chwila, coś chyba mam...

na początku mam:

Kod: Zaznacz cały

extern int SignalGap = 4;
int gi_80 = 24;
double g_ibuf_84[];
double g_ibuf_88[];
a potem w int start jest coś takiego:

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);
}
PS. Wasza pomoc jest nieoceniona :D :D
5% z czegoś jest lepsze niż 100% z niczego :P

ODPOWIEDZ