Wszystkie pytania dozwolone początkujących programistów
Witam mam problem z wyswietlaniem informacji na wykresie, mam funkcje
Wywołuje ją w ten sposób
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
i w
Objaw numer dwa to mocne obciążenie procesora strategia
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///////////////////////////
Kod: Zaznacz cały
PrintText(TimeToStr(time)+"BossaAPI zainicjalizowane poprawnie", "MyIndicator_Range1", 5, 25, 0, Green);
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));
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);
}
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
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
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ś:
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:
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.
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();
}
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;
.
.
.
}
Dzieki za pomoc.

Nie wiem co chciałeś zrobić ale twój kod nic nie przedstawiasonixh pisze:Niestety żadnej reakcji nie ma. czegoś nie dopisałem? O czym zapomniałem?
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;
.
Kod: Zaznacz cały
[code]
switch(Currency)
{
case 'EURUSD' : buf = 0;buf2 =6; waluta1 = "USD"; waluta2 = "EUR"; break;
.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
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 )to jak pisałem parametr do porównania,
CloseAll() działa bo inne funkcje wykonuje prawidłowo. liczy długość swiecy i w przypadku gdy powinien wykonać zamknięcie poprzez 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.
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;
CloseAll() działa bo inne funkcje wykonuje prawidłowo.
Kod: Zaznacz cały
double stopB = Open[0]-Close[0];
Kod: Zaznacz cały
if( s==0 && ( stopB > ReverseBar ))
Kod: Zaznacz cały
CloseAll() ;
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.
a więc tak jak pisałem:sonixh pisze:extern double ReverseBar=100;
to jak pisałem parametr do porównania,
aby je mieć w pipsach (czyli móc porównywać z ReverseBar) musi być:Tig3r pisze:1. stopB i stopS [...] (pamiętaj że wyrażona w cenie a nie pipsach)
Kod: Zaznacz cały
double stopB = (Open[0]-Close[0])/Point;
double stopS = (Close[0]-Open[0])/Point;
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ć..
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
Może napiszę co chciałem zrobić w drugim przykładzie a czego nie umiem zrobić prawidłowo. Zrobiłem sobie taki wskaźnik:
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:
a potem chciałem to przełaczać:
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?
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);
}
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;
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;
}
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.sonixh pisze:teraz do tego chcę wrzucić automatyczne przełaczanie się wskaźnika na parę jaką mam akurat na wykresie.
Tak więc nie wiem co chcesz osiągnąć.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..