Linie poziome w MQL
Linie poziome w MQL
Witam, mam problem z narysowaniem linii poziomych w MQL
napisałem coś takiego i wydawałoby się że powinno zadziałać ale nie działa. Jedną linie rysuję bez problemu ale wiele lini oddalonych od siebie o równą wartość nie potrafię:
int OnInit()
{ double poziom=118000.0;
for (double i=0; i<300; i=i+25)
{Print (poziom+i);
double poziomLini=poziom+i;
string Linia = DoubleToString(poziomLini,1);
ObjectCreate(0, Linia, OBJ_HLINE,0,0,poziomLini);
}
return(INIT_SUCCEEDED);
}
napisałem coś takiego i wydawałoby się że powinno zadziałać ale nie działa. Jedną linie rysuję bez problemu ale wiele lini oddalonych od siebie o równą wartość nie potrafię:
int OnInit()
{ double poziom=118000.0;
for (double i=0; i<300; i=i+25)
{Print (poziom+i);
double poziomLini=poziom+i;
string Linia = DoubleToString(poziomLini,1);
ObjectCreate(0, Linia, OBJ_HLINE,0,0,poziomLini);
}
return(INIT_SUCCEEDED);
}
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Linie poziome w MQL
Ponieważ tym kawałkiem kodu skracasz nazwę linii do 1 znaku
zobacz tak
Kod: Zaznacz cały
string Linia = DoubleToString(poziomLini,1);
Kod: Zaznacz cały
string Linia = DoubleToString(poziomLini,Digits);
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Linie poziome w MQL
w sumie czy "1" czy "Digits"to ma tylko wpływa na nazwę ... i dalej nie rysuje linii
początkowo napisałem kod w ogóle bez: string Linia = DoubleToString(poziomLini,1);
ale pomyślałem że może problem jest w tym że kolejne linie mają tę samą nazwę więc użyłem DoubleToString w pętli
no ale dalej nie działa
początkowo napisałem kod w ogóle bez: string Linia = DoubleToString(poziomLini,1);
ale pomyślałem że może problem jest w tym że kolejne linie mają tę samą nazwę więc użyłem DoubleToString w pętli
no ale dalej nie działa
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Linie poziome w MQL
dokładnie o tej samej nazwie może być tylko jeden obiekt na wykresie wiec jeżeli np masz poziomy 1.1234 i 1.1235 a dasz DoubleToString (x.xxxx,1) to oba będą nazywać się "1".
zmieniłem jeszcze ten kawałek kodu
u mnie ten kod rysuje ;-)
zmieniłem jeszcze ten kawałek kodu
Kod: Zaznacz cały
double poziomLini=poziom;
Kod: Zaznacz cały
double poziom = Bid;
for (int i=0;i<300;i=i+25)
{
Print (poziom+i);
double poziomLini=poziom+i*Point;
string Linia = DoubleToString(poziomLini,Digits);
ObjectCreate(0, Linia, OBJ_HLINE,0,0,poziomLini);
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Linie poziome w MQL
ooo u mnie też teraz narysowało
w sumie jeszcze nie wiem co się stało, co miało na to wpływ że teraz zaskoczyło, będę musiał to przeanalizować
ale Andrzeju dzięki serdeczne
teraz dalej ... (piszę w tym wątku żeby była jakaś ciągłość)
prostą rzeczą jest napisanie kodu który będzie wypuszczał zlecenie po przekroczeniu krzywej jakiegoś indykatora np. MACD bo w jednej chwili mamy jedną wartość MACD i tylko jedną (pionowa prosta tylko w jednym miejscu przetnie się z MACD)
ale co zrobić w tym przypadku kiedy to powiedzmy nasz indykator ma w jednej chwili wiele wartość (każda linia pozioma oddalona od siebie o stałą odległość) ... co zrobić by kod wypuszczał zlecenie w reakcji na przecięcie się z pierwszą napotkaną linią poziomą lub na konkretną linie poziomą np. 4 z kolei.
w sumie jeszcze nie wiem co się stało, co miało na to wpływ że teraz zaskoczyło, będę musiał to przeanalizować
ale Andrzeju dzięki serdeczne
teraz dalej ... (piszę w tym wątku żeby była jakaś ciągłość)
prostą rzeczą jest napisanie kodu który będzie wypuszczał zlecenie po przekroczeniu krzywej jakiegoś indykatora np. MACD bo w jednej chwili mamy jedną wartość MACD i tylko jedną (pionowa prosta tylko w jednym miejscu przetnie się z MACD)
ale co zrobić w tym przypadku kiedy to powiedzmy nasz indykator ma w jednej chwili wiele wartość (każda linia pozioma oddalona od siebie o stałą odległość) ... co zrobić by kod wypuszczał zlecenie w reakcji na przecięcie się z pierwszą napotkaną linią poziomą lub na konkretną linie poziomą np. 4 z kolei.
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Linie poziome w MQL
Nie wiem czy dobrze zrozumiałem ale cza by to zrobić mniej więcej tak :
1 - sprawdzenie aktualnej wartości wskaźnika
2 - wyszukanie najbliższych linii pod i nad wartością wskaźnika wykorzystując np funkcję NormalizeDouble
3a - sprawdzenie czy wartość wskaźnika przesunięta o x świec wstecz jest mniejsza od linii dolnej jeżeli tak doszło do przecięcia w górę
3b - sprawdzenie czy wartość wskaźnika przesunięta o x świec wstecz jest większa od linii górnej jeżeli tak doszło do przecięcia w dół
1 - sprawdzenie aktualnej wartości wskaźnika
2 - wyszukanie najbliższych linii pod i nad wartością wskaźnika wykorzystując np funkcję NormalizeDouble
3a - sprawdzenie czy wartość wskaźnika przesunięta o x świec wstecz jest mniejsza od linii dolnej jeżeli tak doszło do przecięcia w górę
3b - sprawdzenie czy wartość wskaźnika przesunięta o x świec wstecz jest większa od linii górnej jeżeli tak doszło do przecięcia w dół
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Linie poziome w MQL
chyba jednak źle mnie zrozumiałeś
żeby było jaśniej skorzystam z rysunków.
Na zielono po lewej stronie przykład jakieś średniej i dla jednej świecy mamy tylko jedną wartość tej średniej.
W przypadku poziomych linii dla jeden świecy mamy wiele wartości (czerwone kropki).
1.Problem w tym jak zrobić by automat wypuszczał zlecenie kiedy cena napotka daną linię i zamykał zlecenie na SL - TYLKO WTEDY kiedy cena dotknie linii równej SL lub niższej. Czyli otwarcie nowego dnia luką poniżej naszego SL nie uruchamia go tylko automat czeka no dotknięcie jakieś linii.
Na rysunku czarna kropka pokazuje przykładowe otwarcie w nowym dniu. Otwarcie jest pomiędzy liniami np. o wartościach (dolna linia 600 a górna linia 700).
Nie wiem czy można to zrobić za pomocą tablicy z wszystkimi wartościami linii poziomych ..... a potem gdy cena znajduję się pomiędzy jakimiś dwoma poziomami (czyli pomiędzy dwoma wartościami z tablicy) szuka najbliższych dwóch- jednego z góry drugiego z dołu ???
żeby było jaśniej skorzystam z rysunków.
Na zielono po lewej stronie przykład jakieś średniej i dla jednej świecy mamy tylko jedną wartość tej średniej.
W przypadku poziomych linii dla jeden świecy mamy wiele wartości (czerwone kropki).
1.Problem w tym jak zrobić by automat wypuszczał zlecenie kiedy cena napotka daną linię i zamykał zlecenie na SL - TYLKO WTEDY kiedy cena dotknie linii równej SL lub niższej. Czyli otwarcie nowego dnia luką poniżej naszego SL nie uruchamia go tylko automat czeka no dotknięcie jakieś linii.
Na rysunku czarna kropka pokazuje przykładowe otwarcie w nowym dniu. Otwarcie jest pomiędzy liniami np. o wartościach (dolna linia 600 a górna linia 700).
Nie wiem czy można to zrobić za pomocą tablicy z wszystkimi wartościami linii poziomych ..... a potem gdy cena znajduję się pomiędzy jakimiś dwoma poziomami (czyli pomiędzy dwoma wartościami z tablicy) szuka najbliższych dwóch- jednego z góry drugiego z dołu ???
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Linie poziome w MQL
No to podobnie jak napisałem tylko zamiast wartości wskaźnika podstawić cza wartość Close
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Linie poziome w MQL
w sumie to nie rozumiem, mógłbyś troszeczkę mi to rozjaśnić
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Linie poziome w MQL
podrzucę Ci przykład funkcji która wyszukuje dwie najbliższe linie
Kod: Zaznacz cały
double step = 100;
void search_level(int shift,double &up,double &dn)
{
string test = DoubleToString(step,0);
int count = StringLen(test);
double price = NormalizeDouble(Close[shift],Digits - count);
for (int i = 0;i <= 10;i++)
{
if (Close[shift] > price)
{
if (Close[shift] <= price + i * step * Point())
{
up = price + i * step * Point();
dn = price + (i - 1) * step * Point();
break;
}
}
if (Close[shift] < price)
{
if (Close[shift] <= price - i * step * Point())
{
dn = price - i * step * Point();
up = price - (i - 1) * step * Point();
break;
}
}
if (Close[shift] == price)
{
dn = price;
up = price;
break;
}
}
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE