CoVal
Ani WindowRedraw(), ani RefreshRates() nic nie dają (sprawdziłem).
Myślę, że problem tkwi w odwołaniu się do danych konta (AccountFreeMargin().
Wszystkie pozostałe dane pochodzą z terminala notowań i funkcje zbudowane na nich działają poprawnie.
Wszystkie trzy funkcje zbudowane w oparciu o AccountFreeMargin() nie odświeżają się samoczynnie po uruchomieniu terminala - to odświeżanie trzeba wymusić zmianą interwału wykresu.
Szukam rozwiązania ale moja wiedza w tym zakresie jest znikoma, zajmie więc mi to sporo czasu, o ile w ogóle jakieś rozwiązanie znajdę.
Szukam w sieci podobnych wskaźników, by podpatrzeć kawałek odpowiedniego kodu.
Brak odświeżania wskaźnika.
No to moze latwiej bedzie po prostu olac wbudowana funkcje i sobie samemu napisac prosta funkcje wyliczaca na biezaco free margin - to chyba nie jest rocket science, nie ?arkoni pisze:CoVal
Ani WindowRedraw(), ani RefreshRates() nic nie dają (sprawdziłem).
Myślę, że problem tkwi w odwołaniu się do danych konta (AccountFreeMargin().
Wszystkie pozostałe dane pochodzą z terminala notowań i funkcje zbudowane na nich działają poprawnie.
Wszystkie trzy funkcje zbudowane w oparciu o AccountFreeMargin() nie odświeżają się samoczynnie po uruchomieniu terminala - to odświeżanie trzeba wymusić zmianą interwału wykresu.
Szukam rozwiązania ale moja wiedza w tym zakresie jest znikoma, zajmie więc mi to sporo czasu, o ile w ogóle jakieś rozwiązanie znajdę.
Szukam w sieci podobnych wskaźników, by podpatrzeć kawałek odpowiedniego kodu.
jako laik spytam, po co jest ta linijka:
sugeruję wywalić
Kod: Zaznacz cały
int counted_bars=IndicatorCounted();
wojtasek - w sumie to masz rację.
Rozwiązałem problem odświeżania.
Dla AccountFreeMargin() program nie przeliczał wartości zdefiniowanych w kodzie funkcji w których funkcja ta (AccountFreeMargin()) była zawarta. To wynika ze sposobu w jaki MT4 dokonuje obliczeń i je odświeża.
Poniżej sam wskaźnik.
Zaznaczam, że nie zamierzam upraszczać tasiemcowych definicji niektórych funkcji (dla komputera to i tak no problem), choć zdaję sobie sprawę, że nie wygląda to zbyt estetycznie, ale działa poprawnie i to jest najważniejsze.
Wskaźnik powinien działać na każdej platformie, ale tego nie sprawdzałem.
Jeżeli kogoś to jeszcze interesuje (zaznaczam, że nie testowałem wskaźnika w dzień, w którym odbywają się notowania, tzn. napływają nowe dane dotyczące notowań - dzisiaj sobota) - oto wskaźnik:
Oczywiście dziękuję wszystkim za pomoc.
P.S. Jeżeli komuś nie odpowiada miejsce umieszczenia wskaźnika w oknie wykresu, może ją zmienić wartością "x".
Rozwiązałem problem odświeżania.
Dla AccountFreeMargin() program nie przeliczał wartości zdefiniowanych w kodzie funkcji w których funkcja ta (AccountFreeMargin()) była zawarta. To wynika ze sposobu w jaki MT4 dokonuje obliczeń i je odświeża.
Poniżej sam wskaźnik.
Zaznaczam, że nie zamierzam upraszczać tasiemcowych definicji niektórych funkcji (dla komputera to i tak no problem), choć zdaję sobie sprawę, że nie wygląda to zbyt estetycznie, ale działa poprawnie i to jest najważniejsze.
Wskaźnik powinien działać na każdej platformie, ale tego nie sprawdzałem.
Jeżeli kogoś to jeszcze interesuje (zaznaczam, że nie testowałem wskaźnika w dzień, w którym odbywają się notowania, tzn. napływają nowe dane dotyczące notowań - dzisiaj sobota) - oto wskaźnik:
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| arkoni Monay Managment BOSSAmikro.mq4 |
//| Copyright 2012, arkoni |
//+------------------------------------------------------------------+
#property indicator_chart_window
extern color color1= SlateGray;
extern color color2= Green;
extern color color3= Red;
extern color color4= DarkSeaGreen;
extern double ryzyko=0.02;
extern double mnożnikATR=2;
extern double okresATR=100;
extern int x=0;
double pozycja=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,x,pozycja);
Create("zm",0,x+20,pozycja);
Create("ok",120,x,pozycja);
Create("os",220,x,pozycja);
Create("SL",330,x,pozycja);
Create("SL1",390,x,pozycja);
Create("MDP",470,x,pozycja);
Create("MDP1",570,x,pozycja);
Create("WSL",330,x+20,pozycja);
Create("WPP",470,x+20,pozycja);
Create("WSpr",620,x,pozycja);
Create("USprSL",620,x+20,pozycja);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("SL");
ObjectDelete("SL1");
ObjectDelete("MDP");
ObjectDelete("MDP1");
ObjectDelete("WSL");
ObjectDelete("WPP");
ObjectDelete("np");
ObjectDelete("ok");
ObjectDelete("os");
ObjectDelete("zm");
ObjectDelete("WSpr");
ObjectDelete("USprSL");
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()
{
DisplayText("np",Symbol()+" "+ow(),"Arial",11,color4);
DisplayText("zm","ATR: " +DoubleToStr(iATR(NULL,0,okresATR,0),Digits),"Arial",11,color4);
DisplayText("ok",DoubleToStr(Ask,Digits),"Arial",18,color3);
DisplayText("os",DoubleToStr(Bid,Digits),"Arial",18,color2);
DisplayText("SL","SL (R): ","Arial",12,color1);
DisplayText("SL1",SL(),"Arial",12,color3);
DisplayText("MDP","MDP "+DoubleToStr(ryzyko*100,1)+"%K: ","Arial",12,color4);
DisplayText("MDP1",DoubleToStr(MDP(),2),"Arial",12,color3);
DisplayText("WSL","SL (R), PLN: " +DoubleToStr(WSL(),2),"Arial",11,color1);
DisplayText("WPP","Pip, PLN: " +DoubleToStr(WPP(),2),"Arial",11,color4);
DisplayText("WSpr","Spr., PLN: " +DoubleToStr(WSpr(),2),"Arial",11,color1);
DisplayText("USprSL","Spr./SL w %: " +USprSL(),"Arial",11,color1);
return(0);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Interwal wykresu.
string ow()
{
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);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Stop Loss (SL) ze spreadem dla MDP.
string SL()
{
if (Symbol()=="FPL20")
return (DoubleToStr((MathRound(iATR(NULL,0,okresATR,0))*mnożnikATR+NormalizeDouble((Ask-Bid),Digits)),0));
else
return (DoubleToStr((iATR(NULL,0,okresATR,0)*mnożnikATR+NormalizeDouble((Ask-Bid),Digits)),Digits));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Maksymalna dopuszczalna wielkość pozycji w lotach (MDP).
double MDP()
{
if ((Symbol()=="FPL20")&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(((MathFloor(10*(AccountFreeMargin()*ryzyko)
/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)*mnożnikATR+((Ask-Bid)/Point)),Digits)
*MarketInfo(Symbol(),MODE_TICKVALUE))))/10),1));
else
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(((MathFloor(100*(AccountFreeMargin()*ryzyko)
/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+((Ask-Bid)/Point)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartość SL ze spreadem dla MDP w PLN.
double WSL()
{
if ((Symbol()=="FPL20")&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(( MathRound(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits))*(MathFloor((MathFloor(100
*(AccountFreeMargin()*ryzyko)/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100*10)/10)
*MarketInfo(Symbol(),MODE_TICKVALUE)),0));
else
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(( NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits)*(MathFloor(100*(AccountFreeMargin()
*ryzyko)/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100
*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartosc 1 pipsa dla MDP w PLN.
double WPP()
{
if ((Digits==5 || Digits==3)&&IsConnected()&&AccountFreeMargin()>0)
return ((NormalizeDouble((((MathFloor(100*(AccountFreeMargin()*ryzyko)
/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100)
*(MarketInfo(Symbol(),MODE_TICKVALUE))*10),2)));
else
if ((Symbol()=="FPL20")&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(((MathFloor((MathFloor(100
*(AccountFreeMargin()*ryzyko)/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100*10)/10)
*MarketInfo(Symbol(),MODE_TICKVALUE)),0));
else
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(((MathFloor(100*(AccountFreeMargin()
*ryzyko)/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+MarketInfo(Symbol(),MODE_SPREAD)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100
*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartość spreadu dla MDP w PLN.
double WSpr()
{
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_TICKVALUE)*MDP(),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Udział spreadu w SL w %.
string USprSL()
{
if (IsConnected()&&AccountFreeMargin()>0)
return (DoubleToStr((WSpr()/WSL()*100),1));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
Oczywiście dziękuję wszystkim za pomoc.
P.S. Jeżeli komuś nie odpowiada miejsce umieszczenia wskaźnika w oknie wykresu, może ją zmienić wartością "x".
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Przejąłem się odświeżaniem, a nie zauważyłem oczywistego błędu w sposobie wyliczania SL. Zauważyłem to dopiero wklejając funkcję wyliczającą SL do skryptu.
Dla formalności wklejam poprawiony wskaźnik.
Przy okazji poprawiłem trochę inne funkcje.
To już definitywny koniec.
Jeżeli admin uzna, że temat powinien być usunięty, to proszę bardzo.
Dla formalności wklejam poprawiony wskaźnik.
Przy okazji poprawiłem trochę inne funkcje.
To już definitywny koniec.
Jeżeli admin uzna, że temat powinien być usunięty, to proszę bardzo.
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| arkoni Monay Managment BOSSAmikro.mq4 |
//| Copyright 2012, arkoni |
//+------------------------------------------------------------------+
#property indicator_chart_window
extern color color1= SlateGray;
extern color color2= Green;
extern color color3= Red;
extern color color4= DarkSeaGreen;
extern double ryzyko= 0.02;
extern double mnożnikATR= 2;
extern double okresATR= 100;
extern int x= 0;
double pozycja= 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,x,pozycja); Create("zm",0,x+20,pozycja);
Create("ok",120,x,pozycja); Create("os",220,x,pozycja);
Create("SL",330,x,pozycja);Create("SL1",405,x,pozycja);
Create("MDP",470,x,pozycja);Create("MDP1",570,x,pozycja);
Create("WSL",330,x+20,pozycja); Create("WPP",470,x+20,pozycja);
Create("WSpr",620,x+20,pozycja);Create("USprSL",620,x,pozycja);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("SL");ObjectDelete("SL1");ObjectDelete("MDP");
ObjectDelete("MDP1"); ObjectDelete("WSL"); ObjectDelete("WPP");
ObjectDelete("np");ObjectDelete("ok");ObjectDelete("os");
ObjectDelete("zm"); ObjectDelete("WSpr");ObjectDelete("USprSL");
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()
{
DisplayText("np",Symbol()+" "+ow(),"Arial",11,color4);
DisplayText("zm","ATR: " +DoubleToStr(iATR(NULL,0,okresATR,0),Digits),"Arial",11,color4);
DisplayText("ok",DoubleToStr(Ask,Digits),"Arial",18,color3);
DisplayText("os",DoubleToStr(Bid,Digits),"Arial",18,color2);
DisplayText("SL","StopLoss: ","Arial",12,color1);
DisplayText("SL1",DoubleToStr(SL()-Ask+Bid, Digits),"Arial",12,color3);
DisplayText("MDP","Loty ["+DoubleToStr(ryzyko*100,1)+"%K]: ","Arial",12,color4);
DisplayText("MDP1",DoubleToStr(MDP(),2),"Arial",12,color3);
DisplayText("WSL","Wartość R: " +DoubleToStr(WSL(),2),"Arial",11,color1);
DisplayText("WPP","Wartość pipsa: " +DoubleToStr(WPP(),2),"Arial",11,color4);
DisplayText("WSpr","Wartość spr.: " +DoubleToStr(WSpr(),2),"Arial",11,color1);
DisplayText("USprSL","Spr./R w %: " +DoubleToStr(USprSL(),1),"Arial",11,color1);
return(0);
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Interwal wykresu.
string ow()
{
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);
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Stop Loss (SL) ze spreadem dla MDP.
double SL()
{
if (Symbol()=="FPL20")
return (NormalizeDouble((MathRound(iATR(NULL,0,okresATR,0)/Point)*Point*mnożnikATR+(Ask-Bid)),0));
else
return (NormalizeDouble((MathRound(iATR(NULL,0,okresATR,0)/Point)*Point*mnożnikATR+(Ask-Bid)),Digits));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Maksymalna dopuszczalna wielkość pozycji w lotach (MDP).
double MDP()
{
if ((Symbol()=="FPL20")&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(((MathFloor(10*(AccountFreeMargin()*ryzyko)
/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)*mnożnikATR+((Ask-Bid)/Point)),Digits)
*MarketInfo(Symbol(),MODE_TICKVALUE))))/10),1));
else
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(((MathFloor(100*(AccountFreeMargin()*ryzyko)
/(NormalizeDouble(( MathRound (iATR(NULL,0,okresATR,0)/Point)
*mnożnikATR+((Ask-Bid)/Point)),Digits)*MarketInfo(Symbol(),MODE_TICKVALUE))))/100),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartość SL ze spreadem (całkowite koszty transakcji [R]) dla MDP w walucie rachunku.
double WSL()
{
if ((Symbol()=="FPL20")&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(SL()*MarketInfo(Symbol(),MODE_TICKVALUE)*MDP(),0));
else
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(SL()/Point*MarketInfo(Symbol(),MODE_TICKVALUE)*MDP(),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartosc 1 pipsa dla MDP w walucie rachunku.
double WPP()
{
if ((Digits==5 || Digits==3)&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(MarketInfo(Symbol(),MODE_TICKVALUE)*MDP()*10,2));
else
if ((Symbol()=="FPL20")&&IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(MarketInfo(Symbol(),MODE_TICKVALUE)*MDP(),0));
else
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(MarketInfo(Symbol(),MODE_TICKVALUE)*MDP(),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Wartość spreadu dla MDP w walucie rachunku.
double WSpr()
{
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_TICKVALUE)*MDP(),2));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
//Udział spreadu w kosztach transakcji w %.
double USprSL()
{
if (IsConnected()&&AccountFreeMargin()>0)
return (NormalizeDouble((WSpr()/WSL()*100),1));
}
//---------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------//
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.