Problem z poziomami

O jezykach programowania w platformach i nie tylko.
PedroExplorer
Uczestnik
Uczestnik
Posty: 3
Rejestracja: 25 sie 2010, 10:28

Problem z poziomami

Nieprzeczytany post autor: PedroExplorer »

Witam

Dopiero zaczynam zabawę z MQL, ale już co nie co załapałem, jednak napotkałem na pewien problem. Szukałem czegoś podobnego w gotowych EA,
przeglądałem kursy ale nie mogę sobie poradzić z jedną rzeczą. Moja strategia opierać ma się na poziomach fibonacciego. Problem polega na tym, że (dołączam dla ułatwienia rysunek):
- jak zrobić by EA pamiętał, że cena była w poziomie D, następnie w C, B,
ponownie w C oraz ponownie D
- o ile to że cena dobija do pierwszego poziomu D umiem zastosować i na podstawie tego otwierać pozycję, to nie wiem jak zrobić by w pamięci były zapisane dane dotyczącego tego, że cena dotarła do kilku poziomów wczesniej i na podstawie ich zachowania dokonać otwarcia pozycji

Załóżmy, że w tym konkretnym przypadku chciałbym postąpić tak:
- jeśli cena była w poziomie C(1) a następnie dotarła do poziomu B, od którego się odbiła nie docierając do poziomu A i powędrowała w górę z powrotem do poziomu C(2) i dalej do poziomu D to np w tej chwili otwieram pozycję krótką. TP i SL to sąsiednie poziomy, odpowiednio górny i dolny.

Generalnie każda decyzja opierała by się na tych 4 punktach wstecz, nie wiem też jak zrobić by po wykonanym zleceniu (udanym lub też nie - to nie miało by znaczenia) program zmieniałby te parametry, tzn:
- w tym konkretnym przypadku najpierw parametry były by następujące
1 = C
2 = B
3 = C
4 = D
- jeżeli teraz cen powędrowała by w dół do C to parametry były by takie
1 = B
2 = C
3 = D
4 = C

Mam nadzieję, że dosyć jasno to napisałem, w razie problemów oczywiście postaram się to uzupełnić. Ucieszy mnie jakakolwiek pomoc :)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

No po prostu monitorujesz 4 ostatnie stany i aktualny,
jeśli aktualny jest inny niż poprzednie to modyfikujesz wszystkie poprzednie

trochę żonglowania ale się da
gotowego czegoś takiego nie pamiętam żebym widział bo z reguły sam tworze
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

PedroExplorer
Uczestnik
Uczestnik
Posty: 3
Rejestracja: 25 sie 2010, 10:28

Nieprzeczytany post autor: PedroExplorer »

Jak to ma logicznie wyglądać to mniej więcej wiem, ale mam braki techniczne. Zatrzymałem się na tym etapie

Jeżeli cena = poziom C to
parametr 1 = C

i teraz chciałbym zrobić coś takiego, że czekam aż cena dojdzie do któregoś c poziomów sąsiednich, przy czym kiedy do niego dojdzie to, żeby zapisywało, że
parametr 2 = B

Mój problem polega chyba na tym, że gdy cena dojdzie już do sąsiedniego poziomu (np. B), to parametr 1 zmienia się automatycznie na B

Więc jak to zrobić by parametr 1 był cały czas w pamięci, czekał aż zostanie ustalony parametr 2, i analogicznie teraz 1 i 2 były w pamięci i czekały na ustalenie C.

Jak już mówiłem jestem początkujący, takiego przypadku nie znalazłem w kursach, być może jest to banalne, ale obawiam się, że bez podpowiedzi nie uda mi się przez to przejść :)

Generalnie kod wyglądałby w tym fragmencie mniej więcej tak (przykład na poziomach okrągłych np 00.5600) :

if (Bid == Poziom600)
Parametr1 = Bid
if (Bid == Parametr1+100*Point || Bid == Parametr1 - 100*Point)
Parametr2 = Bid


itd. Pewnie coś tu źle robię ale nie wiem co

Dodano po 8 godzinach 20 minutach:

Może mi ktoś pomóc i powiedzieć dlaczego ten kod nie otwiera żadnych pozycji? Jeżeli B=A i C = A to pozycje są otwierane, ale kiedy zmienię ich wartość względem A o pewną ilość pipsów to nic się nie dzieje.


int start()
{
double TP = 50;
double SL = 50;
double Lot = 0.1;
double Poziom0;
double Poziom50;
double Poziom100;
double A;
double B;
double C;

Poziom0 = MathFloor(Bid/(100*Point))*Point*100;
Poziom50 = Poziom0+50*Point;
Poziom100 = Poziom0+100*Point;


if (Bid == Poziom0 || Bid == Poziom50 || Bid == Poziom100)
A = Bid;
B = A + 50*Point;
C = A - 50*Point;

if (Bid == B || Bid == C)
OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-SL*Point,Ask+TP*Point);

//----

//----
return(0);

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

PedroExplorer pisze:ale kiedy zmienię ich wartość względem A o pewną ilość pipsów to nic się nie dzieje.
jaką ilość ? to powyższe ci nie działa ?

Dopisz sobie tolerancję na poziomy w % czyli oscylację wokół poziomów np. X = 5%.

if A> Dmax
buy

If A< Dmin
sell

Dmax =D+X
Dmin = D-X

znajdź fajny okres w testerze dla fibo i test

Buy stop if A >B

Kod: Zaznacz cały

uzywaj znacznika  bo źle się czyta bez
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

PedroExplorer pisze: if (Bid == B || Bid == C)
Kurs musiałby się zgadzać co do pipsa a takie sytuacje są mało prawdopodobne więc sprawdza się:
LONG: jeśli >= od poziomu obecnego i poprzedni poziom (zamknięcie np poprzedniej świecy) <= niż ten poziom następuje wejście
analogicznie short

przecięcia aby zinterpretować potrzeba 4 punktów (albo 3)
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

PedroExplorer
Uczestnik
Uczestnik
Posty: 3
Rejestracja: 25 sie 2010, 10:28

Nieprzeczytany post autor: PedroExplorer »

Dzięki za wskazówki, jednak mam cały czas mały problem. Dołączam fragment przykładowego kodu. Załóżmy, że chcę złożyć zlecenie kupna w momencie kiedy cena najpierw osiągnęła któryś z poziomów okrągłych np. 0.0100 a następnie kurs poszedł w górę o co najmniej 5 pipsów. Czyli składam zlecenie w 0.0105. No i teraz tak - zgodnie z logiką początkującego programisty, jakim jestem, poniższy kod powinien to zadanie spełniać. Niestety tego nie robi. Moja teoria dlaczego tak się dzieje jest następująca: dopóki cena nie dobije do któryś z okrągłych poziomów, EA nadaje sobie sam jakąś wartość parametrowi A (przypuszczam że 0), w związku z tym EA otworzy mi pozycję kupna bez względu na to czy spełniony jest pierwszy warunek, bo Bid >0 + 5 pipsów, czyli dla ceny >0.0005. I tak się właśnie dzieje, że otwiera mi pozycję zaraz na dzień dobry bez względu na to jaka jest aktualna cena. Pomyślałem, żeby może nadać A jakąś dużą wartość początkową np 99999999.0000, dzięki czemu nie otworzy mi tej pozycji dopóki nie zostanie zaliczony któryś z poziomów okrągłych. No i rzeczywiście nie otworzył mi już pozycji zaraz na starcie, ale też nie zrobił tego kiedy spełnione były moje oba warunki. Po prostu kiedy zostanie spełniony warunek 1 z poziomami, EA nadaje wartość A=Bid, leci dalej do kolejnego if-a a tam (skoro cały kod wykonywany jest dla jednego ticku) nie ma takiej możliwości, żeby był spełniony drugi warunek i wraca do początku kodu, cena przy następnym ticku się zmieniła dlatego warunek 1 nie jest spełniony
i znowu EA nadaje A wartość 9999999.000. I tak w kółko.

Moje pytanie jest teraz następujące. Jak zapisać kod by po spełnieniu warunku 1 nadawał wartość A=Bid i nie zmieniał już jej, zapamiętał ją aż do spełnienia warunku 2????

Kod: Zaznacz cały

if (Bid == Poziom0 || Bid == Poziom50 || Bid == Poziom100)
A = Bid;
   
if (Bid > A + 5*Point && OrdersTotal()<1)
OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-SL*Point,Ask+TP*Point);


Dodano po 15 minutach:

Mam jeszcze jedno pytanie. Czy można zrobić tak, by po spełnieniu jednego warunku if, program w kolejnych iteracjach wykonywał tylko operacje znajdujące się poniżej niego. Tzn żeby EA wracał nie do początku kodu, ale do pewnego miejsca w środku. Może jest jakaś komenda, która by to umożliwiała.

Dakhr
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 14 lis 2009, 11:05

Nieprzeczytany post autor: Dakhr »

Najlepiej robic to na obiektach np po stawiamy obiekt horizontal line na poziomie jaki nas interesuje ,nastenie po osiagnieciu nastepnego poziomu wstawiamy nowy horizontal itd .Nastepnie obiekty mozna kasowac przesowac zgodnie z zyczeniem nadawac nazwy ,zmieniac nazwy np przebity ponownie przebity itd
Rozwiazanie to ma dwie zalety:
1. Natychmiast widzimy czy kod robi to co chcemy czy nie
2.Jak nam sie mt4 zwiesi, pradu zabraknie itd .Obiekty beda dalej na wykresie, natomiast zmienne przepadna.
Przykladowy kod nie jest to o co Ci konkretnie chodzi, ale ma pokazac obsluge obiektow.

Kod: Zaznacz cały

int MAX=50,MIN=100;

void start()
  {

 double SL=Ask-MIN*Point;
  double TP=Ask+MAX*Point;
if(ObjectFind("TB"==-1) && ObjectFind("TS"==-1))
ObjectSets("TB","TS",SL,TP,TimeCurrent(),Green,Red);    

//kasujemy stare poziomy gdy pojawie sie nowe poziomy TB,TS
 if(ObjectFind("TBDone")!=-1 && ObjectFind("TSS")!=-1 && ObjectFind("TS")!=-1){ObjectDelete("TBDone");ObjectDelete("TSS");}
       if(ObjectFind("TSDone")!=-1 && ObjectFind("TBB")!=-1 && ObjectFind("TB")!=-1){ObjectDelete("TSDone");ObjectDelete("TBB");}

// przykladowa obsluga "poziomow "
  if(ObjectFind("TB")!=-1){
       if(Close[1]>ObjectGet("TB",1) && Close[2]<ObjectGet("TB",1) )
        {
       
ObjectSets("TSS","TBDone",ObjectGet("TS",1),ObjectGet("TB",1),Time[0],Green,Gray);  
   ObjectDelete("TB");
   ObjectDelete("TS");
         }
                                              }
       
       if(ObjectFind("TBB")!=-1){
       if( Close[1]<ObjectGet("TBB",1) && Close[2]>ObjectGet("TBB",1)){


ObjectDelete("TBB");
ObjectDelete("TSDone");
       
       }
        if(ObjectFind("TS")!=-1){
              if(Close[1]<ObjectGet("TS",1) && Close[2]<ObjectGet("TS",1)){
      ObjectSets("TBB","TSDone",ObjectGet("TB",1),ObjectGet("TS",1),Time[0],LightGreen,LightGray);  

   ObjectDelete("TB");
   ObjectDelete("TS");

       }
}
  if(ObjectFind("TSS")!=-1){
              if(Close[1]<ObjectGet("TSS",1) && Close[2]>ObjectGet("TSS",1) ){



   ObjectDelete("TSS");
   ObjectDelete("TBDone");

       }
}
}
   void  ObjectSets(string Name1 ,string Name2,double Val1,double Val2,datetime T,int color1,int color2){
     ObjectCreate(Name1, OBJ_HLINE,0,T, Val1);
   ObjectSet(Name1,OBJPROP_COLOR,color1); 
  ObjectCreate(Name2, OBJ_HLINE,0,T, Val2);
   ObjectSet(Name2,OBJPROP_COLOR,color2); 
}

ODPOWIEDZ