Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Oczywiście, że działa. Wielkie dzięki.
Solą życia jest kasa.

none
Stały bywalec
Stały bywalec
Posty: 23
Rejestracja: 09 sty 2012, 12:16

Nieprzeczytany post autor: none »

Witam mam problem z wyswietlaniem informacji na wykresie, mam funkcje

Kod: Zaznacz cały

/////////////////////////////FUNKCJA WYSWIETLANIA TEKSTU///////////////////////////
void PrintText(string sText, string sObjId, int iXPos, int iYPos,int iCorner, color cTxtColor=LightBlue) 
{ 
  // Create Text Object
  if (ObjectFind(sObjId)<0 ) {
    ObjectCreate(sObjId, OBJ_LABEL, 0, 0, 0, 0, 0);
    ObjectSet(sObjId, OBJPROP_CORNER, iCorner);
    ObjectSet(sObjId, OBJPROP_XDISTANCE, iXPos);
    ObjectSet(sObjId, OBJPROP_YDISTANCE, iYPos);
    ObjectSet(sObjId, OBJPROP_BACK, false);
  }
  // Move and write text
  ObjectMove(sObjId, 0, iXPos, iYPos); 
  ObjectSetText(sObjId, sText, 10, "Courier New", cTxtColor);
} 

/////////////////////////////FUNKCJA WYSWIETLANIA TEKSTU///////////////////////////
Wywołuje ją w ten sposób

Kod: Zaznacz cały

PrintText(TimeToStr(time)+"BossaAPI zainicjalizowane poprawnie", "MyIndicator_Range1", 5, 25, 0, Green);
i jak dodam wywołanie tej funkcji do sekcji init to działa wszystko ładnie
ale potrzebuje też wyświetlać informacje w czasie działania strategi czyli w sekcji start i tam juz nie działa ? !

mam jeszcze w kodzie

Kod: Zaznacz cały


int init ()
 {
 

// Clear graphical objects
  for(int i=ObjectsTotal()-1; i>-1; i--)
  
   if (StringFind(ObjectName(i),"MyIndicator")>=0) ObjectDelete(ObjectName(i));

i w

Kod: Zaznacz cały

int deinit()
{

for(int i=ObjectsTotal()-1; i>-1; i--)
   if (StringFind(ObjectName(i),"MyIndicator")>=0) ObjectDelete(ObjectName(i));
 

   return(0);
}
Objaw numer dwa to mocne obciążenie procesora strategia

lasek
Stały bywalec
Stały bywalec
Posty: 23
Rejestracja: 27 lut 2011, 08:23

Nieprzeczytany post autor: lasek »

Czy mógłbym prosić o wskazówki dotyczące stworzenia alertu do stochastica tak żeby przy przebiciu od dołu linii 40 był alert oraz przy przebiciu od góry linii 60 był alert?


pozdrawiam

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

Nieprzeczytany post autor: MkubuxK »

double iStochastic( string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method, int price_field, int mode, int shift)

Zwraca Ci wartość double

int mode - ustawiasz którą linię stochastica ma Ci zwrócić licząc od 0.

Musisz sprawdzić jaką wartość miał stochastic świeczkę do tyłu a następnie wartość aktualną.

Jeśli ma dawać alert przy przebiciu 40 od dołu stoch z poprzedniej świeczki powinien mieć wartość mniejszą od 40 natomiast stoch aktualny większa lub równą 40.

Analogicznie z 60.

warunek będzie np taki

Kod: Zaznacz cały

 double stochAktualny= iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
 double stochPrzeszly = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1);

if((stochAktualny>=40&&stochPrzeszly<40)||(stochPrzeszly>60&&stochAktualny<=60))Alert("Twoja Wiadomość");
fx-forum

Awatar użytkownika
sonixh
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 13 sty 2011, 19:26

Nieprzeczytany post autor: sonixh »

Witam,
mam maly problem z dwiema sprawami:
pierwsza to chcę aby automat zamykał mi wszystkie zlecenia bez względu na wynik jeśli pojawia się świeca w kierunku przeciwnym do otwartych zleceń i o wielkości ustawianej np. parametrem ReverseBar. napisałem sobie takie coś:

Kod: Zaznacz cały

double stopB = Open[0]-Close[0];
double stopS = Close[0]-Open[0];

if( b==0  && ( stopS > ReverseBar )) 
   { 
   CloseAll();
   }
   
if( s==0  && ( stopB > ReverseBar )) 
   { 
   CloseAll();
   }
Niestety żadnej reakcji nie ma. czegoś nie dopisałem? O czym zapomniałem?
Sprawa druga to problem z przełaczaniem pary walutowej.
W kodzie mam : extern bool EURUSD = true; ( i kilka innych par) a nastepnie mam taki fragment kodu:

Kod: Zaznacz cały

string  Currency = AccountCurrency() ;  
 bool result = false; 
 switch(Currency)
 {
 case  EURUSD==true : buf = 0;buf2 =6; waluta1 = "USD"; waluta2 = "EUR"; break;
.
.
.
} 
No i tu zaczynają się schody bo kompilator wyrzuca mi błedy : EURUSD integer number expected i tak przy każdej parze. Niech mi ktoś wyjaśni jak to prawidłowo należy zapisać bo tu akurat nie mam zielonego pojecia jak to powinno wyglądać.

Dzieki za pomoc. :P
Obrazek

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

Nieprzeczytany post autor: Tig3r »

sonixh pisze:Niestety żadnej reakcji nie ma. czegoś nie dopisałem? O czym zapomniałem?
Nie wiem co chciałeś zrobić ale twój kod nic nie przedstawia
1. stopB i stopS są jak mniejmam liczonecały czas a nie na zamknięciu świecy (pamiętaj że wyrażona w cenie a nie pipsach)
2. nie wiadomo co to b i s (może tu być błąd)
3. CloseAll - pewnie zamyka wszystko (nie wiadomo czy jest poprawna funkcja) bez względu na stronę, tu masz przykład jak zamykać tylko long lub short:
http://www.forex-nawigator.biz/dyskusje ... 320#229320

Dodano po 4 minutach:

Co do reszty co po case musisz podać jaki ma być parametr aby dany kod wykonać (czyli jakie ma być Currency)
a Ty to nie wiem co robisz, masz jakieś EURUSD ale nie wiadomo co to jest (jaki typ danych), ba i nawet jakieś sprawdzanie robisz (tego się w case nie robi)

Zakładając że EURUSD ma takie sam typ (to jest zmienna) jak Currency miałoby być tak:

Kod: Zaznacz cały

switch(Currency)
 {
 case  EURUSD : buf = 0;buf2 =6; waluta1 = "USD"; waluta2 = "EUR"; break;
. 
jeśli EURUSD to nie jest zmienna to stringi podaje się w cudzysłowu:

Kod: Zaznacz cały

[code]
switch(Currency)
 {
 case  'EURUSD' : buf = 0;buf2 =6; waluta1 = "USD"; waluta2 = "EUR"; break;
. 
[/code]
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
sonixh
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 13 sty 2011, 19:26

Nieprzeczytany post autor: sonixh »

Ok, dopiszę to co pominąłem:
b==0 to wynik wcześniejszego sprawdzenia czy otwarte są zlecenia BUY czy SELL ( tu BUY=ZERO więc jest s>=1 )

Kod: Zaznacz cały

extern double ReverseBar=100; 
to jak pisałem parametr do porównania,
CloseAll() działa bo inne funkcje wykonuje prawidłowo.

Kod: Zaznacz cały

double stopB = Open[0]-Close[0];
liczy długość swiecy i w przypadku gdy

Kod: Zaznacz cały

if( s==0  && ( stopB > ReverseBar ))
powinien wykonać zamknięcie poprzez

Kod: Zaznacz cały

CloseAll() ;
ale tego nie robi.

Ale już widzę błąd. Liczyłem długość świecy np. 1,3215 - 1,3115 i to miało mi dać 100 a daje 0,01. Dzieki za tą uwagę. Zaraz wyjaśnie o co chodzi z tym drugim problemem.
Obrazek

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

Nieprzeczytany post autor: Tig3r »

sonixh pisze:extern double ReverseBar=100;
to jak pisałem parametr do porównania,
a więc tak jak pisałem:
Tig3r pisze:1. stopB i stopS [...] (pamiętaj że wyrażona w cenie a nie pipsach)
aby je mieć w pipsach (czyli móc porównywać z ReverseBar) musi być:

Kod: Zaznacz cały

double stopB = (Open[0]-Close[0])/Point;
double stopS = (Close[0]-Open[0])/Point;
Jak coś nie działa to zawsze możesz sobie zmienne wyświetlać jako Comment() na wykresie.
Ostatnio zmieniony 20 kwie 2012, 13:58 przez Tig3r, łącznie zmieniany 1 raz.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
sonixh
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 13 sty 2011, 19:26

Nieprzeczytany post autor: sonixh »

Może napiszę co chciałem zrobić w drugim przykładzie a czego nie umiem zrobić prawidłowo. Zrobiłem sobie taki wskaźnik:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                  Walutomierz.mq4 |
//+------------------------------------------------------------------+
#property copyright " Walutomierz by Sonixh "

#property indicator_chart_window

extern int SMA_variable = 3;
extern int SMA_base = 18;
extern int SMA_unit = 15;
extern int WhatCorner=1;
extern int X=20;
extern int Y=20;
extern int FontSize=13;
extern string FontType="Lucida Sans Regular";
extern string Nota = "Wybor JEDNEJ pary walutowej";



int init()
  {
 //  IndicatorShortName("Title","1-Walutomierz"); 
   return(0);
  }
int deinit()
  {
   return(0);
  }

int start()
  {

  
double g_ibuf_96=iCustom(NULL,0,"G7",SMA_variable, SMA_base, SMA_unit,0,0); 
double g_ibuf_95=iCustom(NULL,0,"G7",SMA_variable, SMA_base, SMA_unit,0,1);
double g_ibuf_120=iCustom(NULL,0,"G7",SMA_variable, SMA_base, SMA_unit,6,0); 
double g_ibuf_119=iCustom(NULL,0,"G7",SMA_variable, SMA_base, SMA_unit,6,1);  
color colour=Yellow;
double abseu0 = MathAbs(g_ibuf_120);
double absus0 = MathAbs(g_ibuf_96);
double abseu1 = MathAbs(g_ibuf_119);
double absus1 = MathAbs(g_ibuf_95);
double dev0 = abseu0 + absus0;
double dev1 = abseu1 + absus1;  
if(dev0 > dev1) {colour=Lime;}
if(dev0 < dev1) {colour=Red;}
string moc="Rownowaga";
if(g_ibuf_120 > g_ibuf_96) { moc="USD";}
if(g_ibuf_120 < g_ibuf_96) { moc="EURO";}

  string EATitle = "Dev. EUR vs USD = " + DoubleToStr(dev0,4) + "(prev."+DoubleToStr(dev1,4)+ ")___Przewaga = " +  moc ;
  ObjectCreate("Title",OBJ_LABEL,0,0,0);
  ObjectSet("Title", OBJPROP_CORNER, WhatCorner);
  ObjectSet("Title",OBJPROP_XDISTANCE,X);
  ObjectSet("Title",OBJPROP_YDISTANCE,Y);
  ObjectSetText("Title",EATitle,FontSize,FontType,colour);
  
    
          
  return(0);
}
  
teraz do tego chcę wrzucić automatyczne przełaczanie się wskaźnika na parę jaką mam akurat na wykresie. Samo przełaczanie potrafię skrobnąć ale tu cos powaliłem.

pomijając dalszą rozpiskę dopisałem najpierw to:

Kod: Zaznacz cały

extern bool EURUSD = true;
extern bool USDGBP = false;
extern bool GBPJPY = false;
extern bool GBPUSD = false;
extern bool AUDUSD = false;
extern bool USDCAD = false;
extern bool USDCHF = false;
extern bool USDJPY = false;
extern bool EURGBP = false;
extern bool EURJPY = false;
a potem chciałem to przełaczać:

Kod: Zaznacz cały

string  Currency = AccountCurrency() ;  
 bool result = false; 
 switch(Currency)
 {
 case  EURUSD == true : buf = 0;buf2 =6; waluta1 = "USD"; waluta2 = "EUR"; break;
 case  USDGBP == true : buf = 1;buf2 =6; waluta1 = "USD"; waluta2 = "GBP"; break;
 case  GBPJPY == true : buf = 1;buf2 =5; waluta1 = "GBP"; waluta2 = "JPY"; break;
 case  GBPUSD == true : buf = 1;buf2 =6; waluta1 = "USD"; waluta2 = "GBP"; break;
 case  AUDUSD == true : buf = 2;buf2 =6; waluta1 = "USD"; waluta2 = "AUD"; break;
 case  USDCAD == true : buf = 3;buf2 =6; waluta1 = "USD"; waluta2 = "CAD"; break;
 case  USDCHF == true : buf = 4;buf2 =6; waluta1 = "USD"; waluta2 = "CHF"; break;
 case  USDJPY == true : buf = 5;buf2 =6; waluta1 = "USD"; waluta2 = "JPY"; break;
 case  EURGBP == true : buf = 0;buf2 =1; waluta1 = "GBP"; waluta2 = "EUR"; break;
 case  EURJPY == true : buf = 0;buf2 =5; waluta1 = "JPY"; waluta2 = "EUR"; break;
 }
no i się zrobiła kicha. Co należy poprawić? EURUSD zmienić na "EURUSD" nie wystarczy. zamienić extern bool na string? wywalić ==true ? AccountCurrency() zwraca wartość typu string?
Obrazek

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

Nieprzeczytany post autor: Tig3r »

sonixh pisze:teraz do tego chcę wrzucić automatyczne przełaczanie się wskaźnika na parę jaką mam akurat na wykresie.
To robi automatycznie MT4 po nadejściu nowego ticka (tak samo zresztą robi dla EA) albo zmianie wykresu. Możesz wymusisz nieskończoną pętlę na wskaźniki i będzie Ci się np aktualizował co 1s, ale przez to obciążał będzie znacznie kompa.
Tak więc nie wiem co chcesz osiągnąć.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

ODPOWIEDZ