Brak odświeżania wskaźnika.
Brak odświeżania wskaźnika.
Czy ktoś może mi wyjaśnić co jest nie tak z tym wskaźnikiem.
Po ponownym uruchomieniu platformy wskaźnik się nie odświeża.
Na wykresie nie pojawia się wielkość wyliczonej pozycji w lotach
dla określonego ryzyka. By to się stało trzeba zmienić interwał wykresu na inny, np.: M5 na M1. Potem wskaźnik działa poprawnie aż do ponownego uruchomienia platformy.
Będę wdzięczny za wszelkie sugestie - staram się nauczyć podstaw mql`a. i zbudować na bazie tego wskaźnika bardziej rozbudowane narzędzie.
//+------------------------------------------------------------------+
//| Monay Managment.mq4 |
//| Copyright 2010, Cisco Press. |
//| error.detection@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, Cisco Press."
#property link "error.detection@gmail.com"
#property indicator_chart_window
#property indicator_buffers 2
extern color indicator_clr1= Gold;
extern color indicator_clr2= Aqua;
extern int SL=40;
extern double Risk=0.02;
extern int Order.No=1;
extern int Position =1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete("lot");
ObjectDelete("lot1");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
DisplayText("Lot","Allow Lots Per "+Order.No +" trade with Risk "+DoubleToStr((Risk*100),0)+"% :","Arial",18,indicator_clr1,80,10,Position);
DisplayText("Lot1",DoubleToStr(Lots(),2),"Arial",18,indicator_clr2,10,10,Position);
//----
return(0);
}
//+------------------------------------------------------------------+
double Lots()
{
double accfr= AccountFreeMargin();
double PV=MarketInfo(Symbol(),MODE_TICKVALUE);
double Lot = (accfr*Risk)/(SL*PV);
if (Order.No==1)Lot=Lot;
else Lot=Lot/Order.No;
return (NormalizeDouble(Lot,2));
}
//+------------------------------------------------------------------+
void DisplayText(string objname, string objtext, string fontname, int fontsize, int clr, int x, int y,int Cor)
{
ObjectCreate(objname,OBJ_LABEL,0,0,0);
ObjectSetText(objname,objtext,fontsize,fontname,clr);
ObjectSet(objname,OBJPROP_CORNER,Cor);
ObjectSet(objname,OBJPROP_XDISTANCE,x);
ObjectSet(objname,OBJPROP_YDISTANCE,y);
}
//+------------------------------------------------------------------+
Po ponownym uruchomieniu platformy wskaźnik się nie odświeża.
Na wykresie nie pojawia się wielkość wyliczonej pozycji w lotach
dla określonego ryzyka. By to się stało trzeba zmienić interwał wykresu na inny, np.: M5 na M1. Potem wskaźnik działa poprawnie aż do ponownego uruchomienia platformy.
Będę wdzięczny za wszelkie sugestie - staram się nauczyć podstaw mql`a. i zbudować na bazie tego wskaźnika bardziej rozbudowane narzędzie.
//+------------------------------------------------------------------+
//| Monay Managment.mq4 |
//| Copyright 2010, Cisco Press. |
//| error.detection@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, Cisco Press."
#property link "error.detection@gmail.com"
#property indicator_chart_window
#property indicator_buffers 2
extern color indicator_clr1= Gold;
extern color indicator_clr2= Aqua;
extern int SL=40;
extern double Risk=0.02;
extern int Order.No=1;
extern int Position =1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete("lot");
ObjectDelete("lot1");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
DisplayText("Lot","Allow Lots Per "+Order.No +" trade with Risk "+DoubleToStr((Risk*100),0)+"% :","Arial",18,indicator_clr1,80,10,Position);
DisplayText("Lot1",DoubleToStr(Lots(),2),"Arial",18,indicator_clr2,10,10,Position);
//----
return(0);
}
//+------------------------------------------------------------------+
double Lots()
{
double accfr= AccountFreeMargin();
double PV=MarketInfo(Symbol(),MODE_TICKVALUE);
double Lot = (accfr*Risk)/(SL*PV);
if (Order.No==1)Lot=Lot;
else Lot=Lot/Order.No;
return (NormalizeDouble(Lot,2));
}
//+------------------------------------------------------------------+
void DisplayText(string objname, string objtext, string fontname, int fontsize, int clr, int x, int y,int Cor)
{
ObjectCreate(objname,OBJ_LABEL,0,0,0);
ObjectSetText(objname,objtext,fontsize,fontname,clr);
ObjectSet(objname,OBJPROP_CORNER,Cor);
ObjectSet(objname,OBJPROP_XDISTANCE,x);
ObjectSet(objname,OBJPROP_YDISTANCE,y);
}
//+------------------------------------------------------------------+
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
No cóż, szkoda, że nikt nie podjął tematu.
Zamieszczam wskaźnik do zarządzania kapitałem dla platformy BOSSA mikroloty napisany przeze mnie właściwie od nowa.
Wskaźnik wylicza ATR, maksymalną dopuszczalną wielkość pozycji (MDP) dla określonej zmienności i dostępnych środków, SL ze spreadem i wartość SL ze spreadem w walucie rachunku oraz wartość 1 pipsa dla MDP.
Wskaźnik obsługuje wszystkie 49 instrumentów dostępnych na tej platformie.
Niestety - nadal nie rozwiązałem problemu odświeżania.
Połowicznie rozwiązałem to redukując funkcję ObjectDelete() tylko do niektórych obiektów.
Jeżeli ktoś się zainteresuje wskaźnikiem, to jestem chętny do współpracy.
Zamieszczam wskaźnik do zarządzania kapitałem dla platformy BOSSA mikroloty napisany przeze mnie właściwie od nowa.
Wskaźnik wylicza ATR, maksymalną dopuszczalną wielkość pozycji (MDP) dla określonej zmienności i dostępnych środków, SL ze spreadem i wartość SL ze spreadem w walucie rachunku oraz wartość 1 pipsa dla MDP.
Wskaźnik obsługuje wszystkie 49 instrumentów dostępnych na tej platformie.
Niestety - nadal nie rozwiązałem problemu odświeżania.
Połowicznie rozwiązałem to redukując funkcję ObjectDelete() tylko do niektórych obiektów.
Jeżeli ktoś się zainteresuje wskaźnikiem, to jestem chętny do współpracy.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Może zrób tak :
Ogólnie - obiekty tworzyć w init()
- usuwać w deinit()
- nic nie ObjectCreate w DisplayText tylko odświeżać dane dla utworzonego obiektu z init() ;
Nie wszystkie obiekty masz usuwane w swoim kodzie w deinit() ;
Właściwie wszystkie Set spróbował bym przenieść do init() , a w DisplayText zostawił tylko
Kod: Zaznacz cały
#property indicator_buffers 2 // to wywal
string name1 = "xxx";
string name2= "yyy" ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
ObjectCreate(name1,OBJ_LABEL,0,0,0);
ObjectCreate(name2,OBJ_LABEL,0,0,0);
// itd ...............
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete(name1);
ObjectDelete(name2);
// itd
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
DisplayText(name1,"Allow Lots Per "+Order.No +" trade with Risk "+DoubleToStr((Risk*100),0)+"% :","Arial",18,indicator_clr1,80,10,Position);
DisplayText(name2,DoubleToStr(Lots(),2),"Arial",18,indicator_clr2,10,10,Position);
//----
return(0);
}
//+------------------------------------------------------------------+
// ... kdjfguhdv idnn
//+------------------------------------------------------------------+
void DisplayText(string objname, string objtext, string fontname, int fontsize, int clr, int x, int y,int Cor)
{
//////////////////////ObjectCreate(objname,OBJ_LABEL,0,0,0); Wywalić
ObjectSetText(objname,objtext,fontsize,fontname,clr);
ObjectSet(objname,OBJPROP_CORNER,Cor);
ObjectSet(objname,OBJPROP_XDISTANCE,x);
ObjectSet(objname,OBJPROP_YDISTANCE,y);
}
//+------------------------------------------------------------------+
- usuwać w deinit()
- nic nie ObjectCreate w DisplayText tylko odświeżać dane dla utworzonego obiektu z init() ;
Nie wszystkie obiekty masz usuwane w swoim kodzie w deinit() ;
Właściwie wszystkie Set spróbował bym przenieść do init() , a w DisplayText zostawił tylko
Kod: Zaznacz cały
ObjectSetText(objname,objtext,fontsize,fontname,clr);
Kod: Zaznacz cały
//+------------------------------------------------------------------+
void Create(string objname , int x ,int y,int Cor)
{
ObjectDelete(objname); //!! jesli zostały jakieś śmiecie usuwamy przed
// utworzeniem nowych
ObjectCreate(objname,OBJ_LABEL,0,0,0);
ObjectSet(objname,OBJPROP_CORNER,Cor);
ObjectSet(objname,OBJPROP_XDISTANCE,x);
ObjectSet(objname,OBJPROP_YDISTANCE,y);
}
int init()
{
//----
Create(name1, 20,210,1)
Create(name2,.....
// itd ...............
//----
return(0);
}
//---------------------------------------------------------------------------------------//
void DisplayText(string objname, string objtext, string fontname, int fontsize, int clr)
{
ObjectSetText(objname,objtext,fontsize,fontname,clr);
}
//+------------------------------------------------------------------+
Nie spiesz się , zawsze zdążysz stracić .
Wielkie dzięki.
Muszę to teraz przetrawić (a to trochę potrwa).
Gdy tylko znajdę odpowiednią ilość czasu, to wskaźnik poprawię i
zamieszczę na forum w tym wątku.
Mam nadzieję, że komuś się on przyda.
Oczywiście, ten już zamieszczony jest w pełni funkcjonalny.
Zauważyłem błąd - wskaźnik źle oblicza wartość w PLN SL ze spreadem dla FPL20 - oczywiście, przy okazji i to poprawię.
Muszę to teraz przetrawić (a to trochę potrwa).
Gdy tylko znajdę odpowiednią ilość czasu, to wskaźnik poprawię i
zamieszczę na forum w tym wątku.
Mam nadzieję, że komuś się on przyda.
Oczywiście, ten już zamieszczony jest w pełni funkcjonalny.
Zauważyłem błąd - wskaźnik źle oblicza wartość w PLN SL ze spreadem dla FPL20 - oczywiście, przy okazji i to poprawię.
Poprawiłem kod wskaźnika.
Niestety - problemy z odświeżaniem nie zniknęły.
Udało mi się częściowo je ominąć poprzez przestawianie linii tej części kodu:
int start()
{
int counted_bars=IndicatorCounted();
DisplayText("np",nazwapary()+" "+okreswykresu(),"Arial",11,indicator_clr5);
DisplayText("zm","ATR: " +Zmienność(),"Arial",11,indicator_clr5);
DisplayText("ok",ofertakupna(),"Arial",18,indicator_clr4);
DisplayText("os",ofertasprzedaży(),"Arial",18,indicator_clr3);
DisplayText("SLoss","SL: " +StopLoss(),"Arial",12,indicator_clr1);
DisplayText("Lot","MDP: " +Lots(),"Arial",12,indicator_clr1);
DisplayText("WSL","SL w PLN: " +WartSL(),"Arial",11,indicator_clr5);
DisplayText("WPP","Pips w PLN: " +WartPipPoz(),"Arial",11,indicator_clr5);
return(0);
}
Niestety pozostały trzy ""Label" tak jak na załączonym gif`ie.
Dołączam sam wskaźnik.
Oczywiście wspomniany już tekst "label" zniknie po zmianie interwału wykresu. Potem wskaźnik pracuje poprawnie aż do ponownego uruchomienia platformy transakcyjnej.
Niestety - problemy z odświeżaniem nie zniknęły.
Udało mi się częściowo je ominąć poprzez przestawianie linii tej części kodu:
int start()
{
int counted_bars=IndicatorCounted();
DisplayText("np",nazwapary()+" "+okreswykresu(),"Arial",11,indicator_clr5);
DisplayText("zm","ATR: " +Zmienność(),"Arial",11,indicator_clr5);
DisplayText("ok",ofertakupna(),"Arial",18,indicator_clr4);
DisplayText("os",ofertasprzedaży(),"Arial",18,indicator_clr3);
DisplayText("SLoss","SL: " +StopLoss(),"Arial",12,indicator_clr1);
DisplayText("Lot","MDP: " +Lots(),"Arial",12,indicator_clr1);
DisplayText("WSL","SL w PLN: " +WartSL(),"Arial",11,indicator_clr5);
DisplayText("WPP","Pips w PLN: " +WartPipPoz(),"Arial",11,indicator_clr5);
return(0);
}
Niestety pozostały trzy ""Label" tak jak na załączonym gif`ie.
Dołączam sam wskaźnik.
Oczywiście wspomniany już tekst "label" zniknie po zmianie interwału wykresu. Potem wskaźnik pracuje poprawnie aż do ponownego uruchomienia platformy transakcyjnej.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Kod: Zaznacz cały
//---------------------------------------------------------------------------------------//
//Interwal wykresu.
/*string okreswykresu() // ŻLE
{
int o=Period();
string ow;
if (o==1) ow="M1"; else
if (o==5) ow="M5"; else
if (o==15) ow="M15"; else
if (o==30) ow="M30"; else
if (o==60) ow="H1"; else
if (o==240) ow="H4"; else
if (o==1440) ow="D1"; else
if (o==10080) ow="W1"; else
if (o==43200) ow="MN";
return(ow);
}*/
//---------------------------------------------------------------------------------------//
Kod: Zaznacz cały
//+------------------------------------------------------------------+
string okreswykresu()
{
string s ="";
int o=Period();
switch(o)
{
case PERIOD_M1:
s = " M1 " ;
break ;
case PERIOD_M5:
s = " M5 " ;
break ;
case PERIOD_M15:
s = " M15 " ;
break ;
case PERIOD_M30:
s = " M30 " ;
break ;
case PERIOD_H1:
s = " H1 " ;
break ;
case PERIOD_H4:
s = " H4 " ;
break ;
case PERIOD_D1:
s = " D1 " ;
break ;
case PERIOD_W1:
s = " W1" ;
break ;
case PERIOD_MN1:
s = " MN" ;
break ;
}
return(s);
}
//---------------------------------------------------------------------------------------//
Kod: Zaznacz cały
//Cena sprzedaży.
/*string ofertasprzedaży() /// ŻLE
{
{
string os;
if(Symbol()=="EURUSD" || Symbol()=="GBPUSD" || Symbol()=="USDCHF" || Symbol()=="EURCHF" || Symbol()=="USDCAD"|| Symbol()=="EURGBP")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),5);
else
if(Symbol()=="USDPLN" || Symbol()=="EURPLN" || Symbol()=="GBPPLN" || Symbol()=="CHFPLN" ||
Symbol()=="JPYPLN" || Symbol()=="AUDUSD" || Symbol()=="AUDCAD" || Symbol()=="AUDCHF" || Symbol()=="AUDNZD"
|| Symbol()=="NZDUSD" || Symbol()=="EURCAD" || Symbol()=="EURAUD"|| Symbol()=="EURNZD"|| Symbol()=="USDHKD"|| Symbol()=="GBPCHF"
|| Symbol()=="GBPAUD"|| Symbol()=="CADCHF"|| Symbol()=="GBPCAD")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),4);
else
if(Symbol()=="USDJPY" || Symbol()=="EURJPY" || Symbol()=="GBPJPY")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),3);
else
if(Symbol()=="AUDJPY" || Symbol()=="NZDJPY" || Symbol()=="CADJPY" || Symbol()=="CHFJPY" ||
Symbol()=="FUS100" || Symbol()=="FU500" || Symbol()=="FOIL" || Symbol()=="FGOLD" || Symbol()=="FCORN"
|| Symbol()=="FWHEAT" || Symbol()=="FSOYBEAN" || Symbol()=="FRISE"|| Symbol()=="FTNOTE10"|| Symbol()=="FSCHATZ2"|| Symbol()=="FOAT10"
|| Symbol()=="FBTP10")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),2);
else
if(Symbol()=="FEUBANKS")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),1);
else
if(Symbol()=="FUS30" || Symbol()=="FPL20" || Symbol()=="FEU50" || Symbol()=="FCH20")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),0);
else /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return (os);
}
return (os);
}*/
Kod: Zaznacz cały
//----------------------------------------------------------------------------------------//
string ofertasprzedaży()
{
string os;
if(Symbol()=="EURUSD" || Symbol()=="GBPUSD" || Symbol()=="USDCHF" || Symbol()=="EURCHF" || Symbol()=="USDCAD"|| Symbol()=="EURGBP")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),5);
else
if(Symbol()=="USDPLN" || Symbol()=="EURPLN" || Symbol()=="GBPPLN" || Symbol()=="CHFPLN" ||
Symbol()=="JPYPLN" || Symbol()=="AUDUSD" || Symbol()=="AUDCAD" || Symbol()=="AUDCHF" || Symbol()=="AUDNZD"
|| Symbol()=="NZDUSD" || Symbol()=="EURCAD" || Symbol()=="EURAUD"|| Symbol()=="EURNZD"|| Symbol()=="USDHKD"|| Symbol()=="GBPCHF"
|| Symbol()=="GBPAUD"|| Symbol()=="CADCHF"|| Symbol()=="GBPCAD")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),4);
else
if(Symbol()=="USDJPY" || Symbol()=="EURJPY" || Symbol()=="GBPJPY")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),3);
else
if(Symbol()=="AUDJPY" || Symbol()=="NZDJPY" || Symbol()=="CADJPY" || Symbol()=="CHFJPY" ||
Symbol()=="FUS100" || Symbol()=="FU500" || Symbol()=="FOIL" || Symbol()=="FGOLD" || Symbol()=="FCORN"
|| Symbol()=="FWHEAT" || Symbol()=="FSOYBEAN" || Symbol()=="FRISE"|| Symbol()=="FTNOTE10"|| Symbol()=="FSCHATZ2"|| Symbol()=="FOAT10"
|| Symbol()=="FBTP10")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),2);
else
if(Symbol()=="FEUBANKS")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),1);
else
if(Symbol()=="FUS30" || Symbol()=="FPL20" || Symbol()=="FEU50" || Symbol()=="FCH20")
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),0);
return (os);
}
//---------------------------------------------------------------------------------------//
Do określenia ilości miejsc po przecinku masz dostępną predefiniowaną zmienną
Kod: Zaznacz cały
Digits
Kod: Zaznacz cały
Point
czyli:
Kod: Zaznacz cały
string ofertasprzedaży()
{
string os;
os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),Digits);
return (os);
}
//---------------------------------------------------------------------------------------//
Kod: Zaznacz cały
Bid
Ask
Kod: Zaznacz cały
//----------------------------------------------------------------------------------------//
string ofertasprzedaży()
{
return (Bid);
}
//---------------------------------------------------------------------------------------//
Kod: Zaznacz cały
DisplayText("ok",DoubleToStr(Ask,Digits),"Arial",18,indicator_clr4);
DisplayText("os",DoubleToStr(Bid,Digits),"Arial",18,indicator_clr3);
Na pewno mozna to jakoś uogólnić , nikt takich konstrukcji nie stosuje .
Sama konstrukcja funkcji i warunków jest zła .
takie coś to jest tragedia :
Kod: Zaznacz cały
{ //<<<!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
string ok;
if(Symbol()=="EURUSD" || Symbol()=="GBPUSD" || Symbol()=="USDCHF" || Symbol()=="EURCHF" || Symbol()=="USDCAD"|| Symbol()=="EURGBP")
.........
if(Symbol()=="FUS30" || Symbol()=="FPL20" || Symbol()=="FEU50" || Symbol()=="FCH20")
ok=DoubleToStr((MarketInfo(Symbol(),MODE_ASK)),0);
else // <<< !!!!!!!!!!!!!!!!!!!!!!
return (ok);
} //<!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return (ok);
Kod: Zaznacz cały
else
return (ok);
masz cały blok z warunkami ujęty w klamry ,w klamrach tworzysz obiekt string ,
gdy kod wychodzi za klamry np. w C obiekt jest niszczony .
Konstrukcja jest błędna i występuje we wszystkich funkcjach z if else
Nie możesz sobie stawiać klamer gdzie popadnie dla ozdoby , bo one wyznaczają lokalne zakresy .
I jeszcze powiedz jakim cudem funkcja ma zwrócić określoną wartość i którą ?
Przecież ten kod tego nie rozpozna , co zwróci WP , WPP czy SLoss
Kod: Zaznacz cały
string WartPipPoz()
{
double accfr= AccountFreeMargin();
double PV=MarketInfo(Symbol(),MODE_TICKVALUE);
double spr=MarketInfo(Symbol(),MODE_SPREAD);
{
double SLoss;
if(Symbol()=="EURUSD" || Symbol()=="GBPUSD" || Symbol()=="USDCHF" || Symbol()=="EURCHF" || Symbol()=="USDCAD"|| Symbol()=="EURGBP")
SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)*100000)*mnożnikATR+spr),5);
else
if(Symbol()=="USDPLN" || Symbol()=="EURPLN" || Symbol()=="GBPPLN" || Symbol()=="CHFPLN" ||
Symbol()=="JPYPLN" || Symbol()=="AUDUSD" || Symbol()=="AUDCAD" || Symbol()=="AUDCHF" || Symbol()=="AUDNZD"
|| Symbol()=="NZDUSD" || Symbol()=="EURCAD" || Symbol()=="EURAUD"|| Symbol()=="EURNZD"|| Symbol()=="USDHKD"|| Symbol()=="GBPCHF"
|| Symbol()=="GBPAUD"|| Symbol()=="CADCHF"|| Symbol()=="GBPCAD")
SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)*10000)*mnożnikATR+spr),4);
else
if(Symbol()=="USDJPY" || Symbol()=="EURJPY" || Symbol()=="GBPJPY")
SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)*1000)*mnożnikATR+spr),3);
else
if(Symbol()=="AUDJPY" || Symbol()=="NZDJPY" || Symbol()=="CADJPY" || Symbol()=="CHFJPY" ||
Symbol()=="FUS100" || Symbol()=="FU500" || Symbol()=="FOIL" || Symbol()=="FGOLD" || Symbol()=="FCORN"
|| Symbol()=="FWHEAT" || Symbol()=="FSOYBEAN" || Symbol()=="FRISE"|| Symbol()=="FTNOTE10"|| Symbol()=="FSCHATZ2"|| Symbol()=="FOAT10"
|| Symbol()=="FBTP10"|| Symbol()=="FBUND10")
SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)*100)*mnożnikATR+spr),2);
else
if(Symbol()=="FEUBANKS")
SLoss = NormalizeDouble((MathRound (iATR(NULL,0,okresATR,0)*10)*mnożnikATR+spr),1);
else
if(Symbol()=="FUS30" || Symbol()=="FPL20" || Symbol()=="FEU50" || Symbol()=="FCH20")
SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)*1)*mnożnikATR+spr),0);
else
return (SLoss);
}
double Lot = (MathFloor(100*(accfr*ryzyko)/(SLoss*PV)))/100;
{
double WP;
if(Symbol()=="EURUSD" || Symbol()=="GBPUSD" || Symbol()=="USDCHF" || Symbol()=="EURCHF" || Symbol()=="USDCAD"|| Symbol()=="EURGBP"
|| Symbol()=="USDJPY" || Symbol()=="EURJPY" || Symbol()=="GBPJPY")
WP =Lot*PV*10;
else
if(Symbol()=="USDPLN" || Symbol()=="EURPLN" || Symbol()=="GBPPLN" || Symbol()=="CHFPLN" ||
Symbol()=="JPYPLN" || Symbol()=="AUDUSD" || Symbol()=="AUDCAD" || Symbol()=="AUDCHF" || Symbol()=="AUDNZD"
|| Symbol()=="NZDUSD" || Symbol()=="EURCAD" || Symbol()=="EURAUD"|| Symbol()=="EURNZD"|| Symbol()=="USDHKD"|| Symbol()=="GBPCHF"
|| Symbol()=="GBPAUD"|| Symbol()=="CADCHF" || Symbol()=="AUDJPY" || Symbol()=="NZDJPY" || Symbol()=="CADJPY" || Symbol()=="CHFJPY" ||
Symbol()=="FUS100" || Symbol()=="FU500" || Symbol()=="FOIL" || Symbol()=="FGOLD" || Symbol()=="FCORN"
|| Symbol()=="FWHEAT" || Symbol()=="FSOYBEAN" || Symbol()=="FRISE"|| Symbol()=="FTNOTE10"|| Symbol()=="FSCHATZ2"|| Symbol()=="FOAT10"
|| Symbol()=="FBUND10" || Symbol()=="FBTP10" || Symbol()=="FEUBANKS" || Symbol()=="FUS30" || Symbol()=="FEU50" || Symbol()=="FCH20"|| Symbol()=="GBPCAD")
WP =Lot*PV;
else
if(Symbol()=="FPL20")
WP=MathRound(Lot*PV);
else
return (WP);
}
string WPP=(DoubleToStr(WP,2));
return (WPP);
}
//---------------------------------------------------------------------------------------//
Kod: Zaznacz cały
string Zmienność()
{
string zm;
zm =DoubleToStr((MathRound (iATR(NULL,0,okresATR,0)*100000)/100000 //*?*/),Digits); // <<<< DIGITS
Kurs MQL4 :
http://www.kjk.za.pl/kursy/Kurs%20MetaQ ... ge%204.zip
Nie spiesz się , zawsze zdążysz stracić .
Kolejny raz wielkie dzięki.
Pomimo totalnej krytyki (nie wątpię, że mi się należała).
Jak już pisałem, nie znam języka mql.
Po prostu - po wielu miesiącach korzystania z arkusza kalkulacyjnego w Exelu, napisanego do zarządzania kapitałem w oparciu o zmienność (ATR), stwierdziłem, że wszystkie dane powinienem mieć pernamentnie w oknie wykresu.
Stąd te moje żałosne wypociny.
Do wyliczenia wielkości pozycji potrzebne jest ATR, mnożnik ATR, wielkość wolnego kapitału, ułamkowa wielkość (lub procentowa) zaangażowania tego kapitału. Stąd te wszystkie zmienne.
Co do tego mnożenia przez np. 100000 i zaraz po obliczeniach dzielenia przez tę liczbę - wynika to z właściwości funkcji MathRound. Chodziło mi o uzyskanie wyniku działania zgodnego (identycznego) z tym w Excelu jak i wyniku uzyskanego na papierze.
Co do reszty całkowicie się z Tobą zgadzam.
Czeka mnie jeszcze dużo pracy z tym kodem.
Pomimo totalnej krytyki (nie wątpię, że mi się należała).
Jak już pisałem, nie znam języka mql.
Po prostu - po wielu miesiącach korzystania z arkusza kalkulacyjnego w Exelu, napisanego do zarządzania kapitałem w oparciu o zmienność (ATR), stwierdziłem, że wszystkie dane powinienem mieć pernamentnie w oknie wykresu.
Stąd te moje żałosne wypociny.
Do wyliczenia wielkości pozycji potrzebne jest ATR, mnożnik ATR, wielkość wolnego kapitału, ułamkowa wielkość (lub procentowa) zaangażowania tego kapitału. Stąd te wszystkie zmienne.
Co do tego mnożenia przez np. 100000 i zaraz po obliczeniach dzielenia przez tę liczbę - wynika to z właściwości funkcji MathRound. Chodziło mi o uzyskanie wyniku działania zgodnego (identycznego) z tym w Excelu jak i wyniku uzyskanego na papierze.
Co do reszty całkowicie się z Tobą zgadzam.
Czeka mnie jeszcze dużo pracy z tym kodem.
Krytykuje kod nie ciebie , to jest po prostu źle napisane .arkoni pisze:Kolejny raz wielkie dzięki.
Pomimo totalnej krytyki (nie wątpię, że mi się należała).

Kurs MQL4 :
http://www.kjk.za.pl/kursy/Kurs%20MetaQ ... ge%204.zip
Dobrze jest też się zapoznać z językiem C/C++ , przynajmniej podstawami - funkcje ,pętle, instrukcje warunkowe , zmienne i zasięg zmiennych .
Nie spiesz się , zawsze zdążysz stracić .
dulf - moim celem jest napisanie wskaźnika wyświetlającego niezbędne, z mojego punktu widzenia, dane w oknie wykresu.
Nie używam oscylatorów, średnich, że już nie wspomnę o automatach.
Oczywiście, na ile mi na to czas pozwala, staram się nauczyć mql.
Przedtem używałem Amibrokera i afl wydawał mi się jednak prostszy.
Poprawiłem nieco ten kod.
Faktycznie wyglądał miejscami tragicznie.
Oczywiście będę pracował nad nim.
Jest tylko jeden problem - wszystkie te poprawki nie zlikwidowały problemu odświeżania. Dotyczy wartości odnoszących się do stanu konta.
Na razie wygląda to tak
Nie używam oscylatorów, średnich, że już nie wspomnę o automatach.
Oczywiście, na ile mi na to czas pozwala, staram się nauczyć mql.
Przedtem używałem Amibrokera i afl wydawał mi się jednak prostszy.
Poprawiłem nieco ten kod.
Faktycznie wyglądał miejscami tragicznie.
Oczywiście będę pracował nad nim.
Jest tylko jeden problem - wszystkie te poprawki nie zlikwidowały problemu odświeżania. Dotyczy wartości odnoszących się do stanu konta.
Na razie wygląda to tak
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| arkoni Monay Managment BOSSAmikro.mq4 |
//| Copyright © 2012, arkoni |
//+------------------------------------------------------------------+
#property indicator_chart_window
extern color indicator_clr1= Crimson;
extern color indicator_clr3= Green;
extern color indicator_clr4= Red;
extern color indicator_clr5= Gray;
extern double ryzyko=0.005;
extern double mnożnikATR=2;
extern double okresATR=500;
extern double Position =0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void Create(string objname , int x ,int y,int Cor)
{
ObjectDelete(objname);
ObjectCreate(objname,OBJ_LABEL,0,0,0);
ObjectSet(objname,OBJPROP_CORNER,Cor);
ObjectSet(objname,OBJPROP_XDISTANCE,x);
ObjectSet(objname,OBJPROP_YDISTANCE,y);
}
int init()
{
Create("np",0,0,Position);
Create("zm",0,20,Position);
Create("ok",120,0,Position);
Create("os",220,0,Position);
Create("SLoss",330,0,Position);
Create("Lot",480,0,Position);
Create("WSL",330,20,Position);
Create("WPP",480,20,Position);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("np");
ObjectDelete("ok");
ObjectDelete("os");
ObjectDelete("SLoss");
ObjectDelete("Lot");
ObjectDelete("zm");
ObjectDelete("WSL");
ObjectDelete("WPP");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void DisplayText(string objname, string objtext, string fontname, int fontsize, int clr)
{
ObjectSetText(objname,objtext,fontsize,fontname,clr);
}
//+------------------------------------------------------------------
int start()
{
int counted_bars=IndicatorCounted();
DisplayText("np",nazwapary()+" "+okreswykresu(),"Arial",11,indicator_clr5);
DisplayText("zm","ATR: " +Zmienność(),"Arial",11,indicator_clr5);
DisplayText("ok",ofertakupna(),"Arial",18,indicator_clr4);
DisplayText("os",ofertasprzedaży(),"Arial",18,indicator_clr3);
DisplayText("SLoss","SL: " +StopLoss(),"Arial",12,indicator_clr1);
DisplayText("Lot","MDP: " +Lots(),"Arial",12,indicator_clr1);
DisplayText("WSL","SL w PLN: " +WartSL(),"Arial",11,indicator_clr5);
DisplayText("WPP","Pips w PLN: " +WartPipPoz(),"Arial",11,indicator_clr5);
return(0);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Nazwa instrumentu.
string nazwapary()
{
string np=Symbol();
return (np);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Interwal wykresu.
string okreswykresu()
{
string s ="";
int o=Period();
switch(o)
{
case PERIOD_M1:
s = " M1 " ;
break ;
case PERIOD_M5:
s = " M5 " ;
break ;
case PERIOD_M15:
s = " M15 " ;
break ;
case PERIOD_M30:
s = " M30 " ;
break ;
case PERIOD_H1:
s = " H1 " ;
break ;
case PERIOD_H4:
s = " H4 " ;
break ;
case PERIOD_D1:
s = " D1 " ;
break ;
case PERIOD_W1:
s = " W1" ;
break ;
case PERIOD_MN1:
s = " MN" ;
break ;
}
return(s);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Cena sprzedaży.
string ofertasprzedaży()
{
string os=DoubleToStr(Bid,Digits);
return (os);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Cena kupna.
string ofertakupna()
{
string ok= DoubleToStr(Ask,Digits);
return (ok);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Stop Loss (SL) ze spreadem dla MDP.
string StopLoss()
{
double spr=NormalizeDouble((Ask-Bid),Digits);
string SLoss =DoubleToStr((iATR(NULL,0,okresATR,0)*mnożnikATR+spr),Digits);
return (SLoss);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Maksymalna dopuszczalna wielkość pozycji w lotach (MDP).
string Lots()
{
double accfr= AccountFreeMargin();
double PV=MarketInfo(Symbol(),MODE_TICKVALUE);
double spr=MarketInfo(Symbol(),MODE_SPREAD);
double SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)*mnożnikATR+spr),Digits);
{
string Lot;
if(Symbol()=="FPL20")
Lot = DoubleToStr(((MathFloor(10*(accfr*ryzyko)/(SLoss*PV)))/10),1);
else
Lot = DoubleToStr(((MathFloor(100*(accfr*ryzyko)/(SLoss*PV)))/100),2);
return (Lot);
}
return (Lot);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Zmiennosc (ATR).
string Zmienność()
{
string zm =DoubleToStr(iATR(NULL,0,okresATR,0),Digits);
return (zm);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartość SL ze spreadem dla MDP w PLN.
string WartSL()
{
double accfr= AccountFreeMargin();
double PV=MarketInfo(Symbol(),MODE_TICKVALUE);
double spr=MarketInfo(Symbol(),MODE_SPREAD);
double SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)*mnożnikATR+spr),Digits);
double Lot = (MathFloor(100*(accfr*ryzyko)/(SLoss*PV)))/100;
string WSL =DoubleToStr(( SLoss*Lot*PV),2);
return (WSL);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartosc 1 pipsa dla MDP w PLN.
string WartPipPoz()
{
double accfr= AccountFreeMargin();
double PV=MarketInfo(Symbol(),MODE_TICKVALUE);
double spr=MarketInfo(Symbol(),MODE_SPREAD);
double SLoss =NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)*mnożnikATR+spr),Digits);
double Lot = (MathFloor(100*(accfr*ryzyko)/(SLoss*PV)))/100;
{
string WPP;
if(Symbol()=="EURUSD" || Symbol()=="GBPUSD" || Symbol()=="USDCHF"||
Symbol()=="EURCHF" || Symbol()=="USDCAD" || Symbol()=="EURGBP"||
Symbol()=="USDJPY" || Symbol()=="EURJPY" || Symbol()=="GBPJPY")
WPP=(DoubleToStr((Lot*PV*10),2));
else
WPP=(DoubleToStr((Lot*PV),2));
return (WPP);
}
return (WPP);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
arkoni,
troche namieszales, troche zrobiles to po excelowsku, ale generalnie nie widze w kodzie jakichs szczegolnych bledow.
Wartoby go jednak znacznie uproscic....
Co do braku odswiezania wskaznikow - to czasem juz tak niestety w tym cholernym MT4 jest...
Sprobuj jednak dodac do funkcji start() jeszcze jedna linie WindowRedraw(): to powinno odswiezyc zawartosc okna wraz z uaktualnieniem wartosci wszystkich obiektow.
Jesli nie pomoze, to chyba trzeba bedzie sie przyjzec dokladniej temu co ty tam zakodowales....
troche namieszales, troche zrobiles to po excelowsku, ale generalnie nie widze w kodzie jakichs szczegolnych bledow.
Wartoby go jednak znacznie uproscic....
Co do braku odswiezania wskaznikow - to czasem juz tak niestety w tym cholernym MT4 jest...
Sprobuj jednak dodac do funkcji start() jeszcze jedna linie WindowRedraw():
Kod: Zaznacz cały
int start()
{
DisplayText("np",nazwapary()+" "+okreswykresu(),"Arial",11,indicator_clr5);
DisplayText("zm","ATR: " +Zmienność(),"Arial",11,indicator_clr5);
DisplayText("ok",ofertakupna(),"Arial",18,indicator_clr4);
DisplayText("os",ofertasprzedaży(),"Arial",18,indicator_clr3);
DisplayText("SLoss","SL: " +StopLoss(),"Arial",12,indicator_clr1);
DisplayText("Lot","MDP: " +Lots(),"Arial",12,indicator_clr1);
DisplayText("WSL","SL w PLN: " +WartSL(),"Arial",11,indicator_clr5);
DisplayText("WPP","Pips w PLN: " +WartPipPoz(),"Arial",11,indicator_clr5);
WindowRedraw();
return(0);
}
Jesli nie pomoze, to chyba trzeba bedzie sie przyjzec dokladniej temu co ty tam zakodowales....