Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
investsoft.pl
Stały bywalec
Stały bywalec
Posty: 35
Rejestracja: 30 sie 2013, 11:38

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: investsoft.pl »

Nie doszukałem się w dokumentacji czy faktycznie tak jest, ale wszystko wskazuje na to że obiekt "Spread" to jest to samo co obiekt o nazwie "spread". MT nie zwraca uwagi na małe i duże litery w nazwach obiektów.

W tym przypadku jeden obiekt nadpisywał drugi i przez to wyświetlana była tylko wartość.
Poniżej zamieszczam poprawiony kod. Zrobiłem tak, że tylko jeden obiekt jest tworzony i w nim jest nazwa + wartość.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                   InfoMarket.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+


#property indicator_chart_window
#property link "http://www.investsoft.pl"

extern color     kolor = White;
extern int       FontSize = 10;

extern string    Spreadtekst="Spread =";
extern string    Swaplongtekst="Swap long =";
extern string    Swapshorttekst="Swap short =";
extern string    Tickvaluetekst="Tick value =";


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   RefreshRates();
   
   int spreadmarket=MarketInfo(Symbol(),MODE_SPREAD);
   ObjectCreate("Spread",OBJ_LABEL,0,0,0);
   ObjectSetText("Spread",Spreadtekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Spread",OBJPROP_XDISTANCE,5);     
   ObjectSet("Spread",OBJPROP_YDISTANCE,20);
   
   double swaplongmarket=MarketInfo(Symbol(),MODE_SWAPLONG);
   ObjectCreate("Swaplong",OBJ_LABEL,0,0,0); 
   ObjectSetText("Swaplong",Swaplongtekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Swaplong",OBJPROP_XDISTANCE,5);     
   ObjectSet("Swaplong",OBJPROP_YDISTANCE,35);
   
   double swapshortmarket=MarketInfo(Symbol(),MODE_SWAPSHORT);
   ObjectCreate("Swapshort",OBJ_LABEL,0,0,0);  
   ObjectSetText("Swapshort",Swapshorttekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Swapshort",OBJPROP_XDISTANCE,5);     
   ObjectSet("Swapshort",OBJPROP_YDISTANCE,50);
   
   double tickvaluemarket=MarketInfo(Symbol(),MODE_TICKVALUE);
   ObjectCreate("Tickvalue",OBJ_LABEL,0,0,0);
   ObjectSetText("Tickvalue",Tickvaluetekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Tickvalue",OBJPROP_XDISTANCE,5);     
   ObjectSet("Tickvalue",OBJPROP_YDISTANCE,65);
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() 
   {

   ObjectDelete("Spread");
   ObjectDelete("Swaplong");
   ObjectDelete("Swapshort");
   ObjectDelete("Tickvalue");
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  RefreshRates();
  
  ObjectSetText("Spread", Spreadtekst+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0));
  ObjectSetText("Swaplong",Swaplongtekst+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2));
  ObjectSetText("Swapshort",Swapshorttekst+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2));
  ObjectSetText("Tickvalue",Tickvaluetekst+DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),2));
  
   return(0);
  }
//+------------------------------------------------------------------+

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: forexsowicz91 »

dzięki wielkie. Będę dodawał jeszcze inne elementy do wskaźnika, więc jak coś to będę pytał.

Awatar użytkownika
investsoft.pl
Stały bywalec
Stały bywalec
Posty: 35
Rejestracja: 30 sie 2013, 11:38

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: investsoft.pl »

Nie ma sprawy. W razie czego pisz :)

mateusz1
Stały bywalec
Stały bywalec
Posty: 70
Rejestracja: 09 kwie 2013, 11:55

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: mateusz1 »

Witam

Poszukuje osoby która napisze proste EA w rozsądnej cenie. EA min. Powinno składać się z możliwości otwarcia pozycji jednym klawiszem i oczywiście zamkniecie jej innym klawiszem.

Osoby zainteresowane proszę o kontakt na maccros@wp.pl

pozdrawiam

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: personov »

mateusz1 pisze:Witam

Poszukuje osoby która napisze proste EA w rozsądnej cenie. EA min. Powinno składać się z możliwości otwarcia pozycji jednym klawiszem i oczywiście zamkniecie jej innym klawiszem.

Osoby zainteresowane proszę o kontakt na maccros@wp.pl

pozdrawiam
EA otwiera transakcje samodzielnie , na określonych warunkach. Chcesz mieć automat EA ? Czy chcesz sam otwierać transakcje ręcznie klawiszem ? Bo to jest chyba sprzeczne.
Solą życia jest kasa.

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: forexsowicz91 »

jaka jest różnica pomiędzy tick a point?

Jak mam zmodyfikować kod aby liczyło poprawnie spread, tzn. wg pipsów a nie wg tick'ów? M.in. na instrumentach gdzie pips różni się od najmniejszej zmiany ceny.

Kod: Zaznacz cały

ObjectSetText("Spread", Spreadtekst+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0));

Awatar użytkownika
lolek
Gaduła
Gaduła
Posty: 335
Rejestracja: 26 lut 2008, 00:12

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: lolek »

forexsowicz91 pisze:jaka jest różnica pomiędzy tick a point?

Jak mam zmodyfikować kod aby liczyło poprawnie spread, tzn. wg pipsów a nie wg tick'ów? M.in. na instrumentach gdzie pips różni się od najmniejszej zmiany ceny.
Tick to jest nowe notowanie.
Kliknij ikonkę celownika w mt4 albo wybierz z menu "okno danych" i jak pokaże się nowe okienko to jak będziesz jeździć po wykresie to będziesz tam miał informacje o świeczce i tam będzie pozycja volume która pokazuje ile było ticków na świeczce. Czyli np. na M1 będzie tam informacja ile razy cena się zmieniła podczas tworzenia tej świeczki czyli ile było ticków (nowych notowań) na M1 w ciągu minuty gdy formowała się świeczka. To samo masz na dole mt4 w skrócie.

Point to jest wartość zależna od tego ile cena ma miejsc po przecinku.
EUR/USD ma 4 miejsca czyli np. 1.3533 i wtedy point wynosi 0.0001
USD/JPY ma 2 miejsca czyli np. 99.46 i wtedy point wynosi 0.01

I teraz jak piszesz kod dla BUY i chcesz ustawić SL = 20 to odejmujesz od ceny 20 punktów point czyli Ask-20*point
Dzięki temu kod działa niezależnie od tego ile jest miejsc po przecinku na danym instrumencie a tak to działałby w jednym miejscu a nie działałby w innym i byś się głowił co jest grane raz działa a raz nie :)
Bo w jednym miejscu musisz odjąć 0.0020 a w drugim musisz odjąć 0.20 a dzięki point rozwiązujesz ten problem.
Zobacz tutaj jak się nie powinno robić.
http://forex-nawigator.biz/forum/prosty ... ml#p605686
W tym temacie kolega wpisał na sztywno wartości i to mu nie zadziała np. jak odpali EA na USD/JPY
Jeśli chodzi o liczenie spread to wystarczy proste Ask-Bid
Dla innych par można użyć spread=MarketInfo("EURUSD",MODE_SPREAD); powinno podać aktualny spread.
Piszę powinno bo mt4 nie zawsze działa tak jakby to podpowiadał rozsądek dlatego najlepiej wszystko potwierdzać testami.

Kod: Zaznacz cały

ObjectSetText("Spread", Spreadtekst+DoubleToStr(Ask-Bid,0));
Spread zawsze liczy według pipsów i nie ma innej możliwości.

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: forexsowicz91 »

ok, dzięki za wyjaśnienie różnicy między tick a point. Już kumam.

Ale właśnie z tym spreadem jest problem. Bo Stała MODE_SPREAD dla funcji MarketInfo liczy spread wg formuły (Ask-Bid)/Point. I to zwraca różnicę w Point'ach pomiedzy ask i bid, nie zaś w pipsach. Dlatego przy kwotowaniach gdzie Point róźni się od pips (np. przy kwotowaniach z 5cioma miejscami po przecinku) wylicza np. że spread=15 zamiast 1,5

Pewnie można by to rozwiązać z if() {}, Tylko że to trochę łopatologiczne rozwiązanie. No ale jeżeli nie będzie innego sposobu to tak zrobię.

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: z6yszko »

forexsowicz91 pisze: Pewnie można by to rozwiązać z if() {}, Tylko że to trochę łopatologiczne rozwiązanie. No ale jeżeli nie będzie innego sposobu to tak zrobię.
Właśnie tak się to robi. Zwyczajowo pips jest ustalony dla każdego instrumentu, natomiast point oznacza najmniejszą możliwą różnicę w notowaniach u danego broka. Zazwyczaj będziesz miał do ustalenia dwa warunki, np.:

Kod: Zaznacz cały

tp=10;
sl=10;
if (Digits == 5 || Digits == 3) {tp = tp*10; sl = sl*10;}
To powinno wystarczyć w większości przypadków.

Awatar użytkownika
lolek
Gaduła
Gaduła
Posty: 335
Rejestracja: 26 lut 2008, 00:12

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: lolek »

forexsowicz91 pisze:Ale właśnie z tym spreadem jest problem. Bo Stała MODE_SPREAD dla funcji MarketInfo liczy spread wg formuły (Ask-Bid)/Point. I to zwraca różnicę w Point'ach pomiedzy ask i bid, nie zaś w pipsach. Dlatego przy kwotowaniach gdzie Point róźni się od pips (np. przy kwotowaniach z 5cioma miejscami po przecinku) wylicza np. że spread=15 zamiast 1,5

Pewnie można by to rozwiązać z if() {}, Tylko że to trochę łopatologiczne rozwiązanie. No ale jeżeli nie będzie innego sposobu to tak zrobię.
No właśnie w pipsach zwraca wartość to co napisałeś.
Ask-Bid = wartość w pointach
(Ask-Bid)/Point = wartość w pipsach
Przykład USD/CAD:
Ask=1.0286
Bid=1.0283

Czyli widzimy że spread = 3 pips.
Jeśli zrobimy Ask-Bid to wyjdzie 0.0003 i to będzie point
A jeśli zrobimy (Ask-Bid)/Point czyli podzielimy ten wynik dodatkowo przez 0.0001 to wyjdzie 3 i będzie 3 pips.
0.0003 / 0.0001 = 3 (sprawdź kalkulatorem)
Więc to co napisałeś podaje w pipsach tak jak chciałeś.
Właśnie po to dzieli przez point żebyś miał w pipsach a nie w pointach.
Nie wiem po co Ci ify w tym przypadku ale jeśli będzie Ci wszędzie prawidłowo działać to rób w ifach.
W programowaniu czasami trzeba robić okrężną drogą byleby wszystko dobrze działało.
A po kilku latach jak już będziesz miał to w jednym palcu będziesz czytał swoje stare kody z uśmiechem.

ps. To wyjaśnienie jest trochę nieścisłe, bo chciałem żeby było łatwe w zrozumieniu.
Nie ma tak naprawdę ceny w pointach :)
Cena jest podawana jako liczba zmiennoprzecinkowa i ponieważ ta liczba po przecinku może być różna istnieje zmienna point którą wykorzystujemy do stworzenia konstrukcji odpornej na różnice w ilości cyfr po przecinku.
Gdybyśmy dalej mówili że cena jest w pointach to utrwalałbyś niewłaściwe rozumowanie.

ODPOWIEDZ