Brak odświeżania wskaźnika.

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
arkoni
Gaduła
Gaduła
Posty: 173
Rejestracja: 27 gru 2011, 12:19

Nieprzeczytany post autor: arkoni »

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.

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

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.
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 ?

Awatar użytkownika
arkoni
Gaduła
Gaduła
Posty: 173
Rejestracja: 27 gru 2011, 12:19

Nieprzeczytany post autor: arkoni »

AccountFreeMargin() niewinne jest.
Sprawdziłem, wstawiając w miejsce AccountFreeMargin() po prostu wolny kapitał.
Program ma więc dane wewnątrz swojego kodu, a mimo to nadal brak odświeżania.

Awatar użytkownika
wojtasek
Gaduła
Gaduła
Posty: 213
Rejestracja: 13 mar 2007, 21:25

Nieprzeczytany post autor: wojtasek »

jako laik spytam, po co jest ta linijka:

Kod: Zaznacz cały

int counted_bars=IndicatorCounted(); 
sugeruję wywalić

Awatar użytkownika
arkoni
Gaduła
Gaduła
Posty: 173
Rejestracja: 27 gru 2011, 12:19

Nieprzeczytany post autor: arkoni »

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:

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.

Awatar użytkownika
arkoni
Gaduła
Gaduła
Posty: 173
Rejestracja: 27 gru 2011, 12:19

Nieprzeczytany post autor: arkoni »

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.

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.

ODPOWIEDZ