Linie poziome w MQL

O jezykach programowania w platformach i nie tylko.
mla
Stały bywalec
Stały bywalec
Posty: 38
Rejestracja: 28 gru 2010, 23:03

Linie poziome w MQL

Nieprzeczytany post autor: mla »

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

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Linie poziome w MQL

Nieprzeczytany post autor: Pierz Andrzej »

Ponieważ tym kawałkiem kodu skracasz nazwę linii do 1 znaku

Kod: Zaznacz cały

string Linia = DoubleToString(poziomLini,1);
zobacz tak

Kod: Zaznacz cały

string Linia = DoubleToString(poziomLini,Digits);
z poważaniem
Andrzej Pierz
FOREX-SERVICE

mla
Stały bywalec
Stały bywalec
Posty: 38
Rejestracja: 28 gru 2010, 23:03

Re: Linie poziome w MQL

Nieprzeczytany post autor: mla »

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

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Linie poziome w MQL

Nieprzeczytany post autor: Pierz Andrzej »

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

Kod: Zaznacz cały

double poziomLini=poziom;
u mnie ten kod rysuje ;-)

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

mla
Stały bywalec
Stały bywalec
Posty: 38
Rejestracja: 28 gru 2010, 23:03

Re: Linie poziome w MQL

Nieprzeczytany post autor: mla »

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.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Linie poziome w MQL

Nieprzeczytany post autor: Pierz Andrzej »

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ół
z poważaniem
Andrzej Pierz
FOREX-SERVICE

mla
Stały bywalec
Stały bywalec
Posty: 38
Rejestracja: 28 gru 2010, 23:03

Re: Linie poziome w MQL

Nieprzeczytany post autor: mla »

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 ???
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Linie poziome w MQL

Nieprzeczytany post autor: Pierz Andrzej »

No to podobnie jak napisałem tylko zamiast wartości wskaźnika podstawić cza wartość Close
z poważaniem
Andrzej Pierz
FOREX-SERVICE

mla
Stały bywalec
Stały bywalec
Posty: 38
Rejestracja: 28 gru 2010, 23:03

Re: Linie poziome w MQL

Nieprzeczytany post autor: mla »

w sumie to nie rozumiem, mógłbyś troszeczkę mi to rozjaśnić

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Linie poziome w MQL

Nieprzeczytany post autor: Pierz Andrzej »

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

ODPOWIEDZ