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

Brak odświeżania wskaźnika.

Nieprzeczytany post autor: arkoni »

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);
}
//+------------------------------------------------------------------+
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 »

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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Może zrób tak :

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); 
 } 
 //+------------------------------------------------------------------+
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

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

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

Nieprzeczytany post autor: arkoni »

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

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

Nieprzeczytany post autor: arkoni »

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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

:doh: A co ten wskaźnik ma robić ? Coś mi się wydaje że cały ten kod jest nie bałdzo - widzę podstawowe błędy , zobacz na to :

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); 
} 
//---------------------------------------------------------------------------------------//
Nie możesz stosowac takich konstrukcji na piechotę , do czego te wszystkie symbole ?
Do określenia ilości miejsc po przecinku masz dostępną predefiniowaną zmienną

Kod: Zaznacz cały

Digits
Punkt przez zmienną :

Kod: Zaznacz cały

Point
Nie trzeba kombinować - jak EURO to 4 , jak JPY to 3 .. bez jaj .
czyli:

Kod: Zaznacz cały

string ofertasprzedaży()
{  
      
       string os;

           os=DoubleToStr((MarketInfo(Symbol(),MODE_BID)),Digits);

    return (os); 
} 
//---------------------------------------------------------------------------------------// 
Zresztą ceny dal poszczególnych wykresów są dostępne też bezpośrednio przez zmienne :

Kod: Zaznacz cały

Bid 
Ask

Kod: Zaznacz cały

//----------------------------------------------------------------------------------------//
string ofertasprzedaży()
{  
    return (Bid); 
} 
//---------------------------------------------------------------------------------------// 
Co można od razu wrzucić bez własnej funkcji do :

Kod: Zaznacz cały

      DisplayText("ok",DoubleToStr(Ask,Digits),"Arial",18,indicator_clr4);     
     DisplayText("os",DoubleToStr(Bid,Digits),"Arial",18,indicator_clr3);
Czyli już masz dwie funkcje niepotrzebne
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);
to else na końcu niepotrzebne .
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); 
}   
//---------------------------------------------------------------------------------------//
Tego też kompletnie nie rozumiem , mnożysz ATR przez liczbę i potem dzielisz przez tą samą[?] .

Kod: Zaznacz cały

string Zmienność()
   {

       string zm;

           zm =DoubleToStr((MathRound (iATR(NULL,0,okresATR,0)*100000)/100000 //*?*/),Digits); // <<<< DIGITS
Wszystko na śmietnik i do poprawki ,kod z funkcjami, obiekty dopszzzzzzzzzze,poprawnie tworzone i usuwane .

Kurs MQL4 :
http://www.kjk.za.pl/kursy/Kurs%20MetaQ ... ge%204.zip
Nie spiesz się , zawsze zdążysz stracić .

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

Nieprzeczytany post autor: arkoni »

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.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

arkoni pisze:Kolejny raz wielkie dzięki.
Pomimo totalnej krytyki (nie wątpię, że mi się należała).
Krytykuje kod nie ciebie , to jest po prostu źle napisane . :lol:
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ć .

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

Nieprzeczytany post autor: arkoni »

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

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                            arkoni Monay Managment BOSSAmikro.mq4 |
//|                                         Copyright &copy; 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); 
}   
//---------------------------------------------------------------------------------------//    
//---------------------------------------------------------------------------------------//  

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

Nieprzeczytany post autor: CoVal »

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():

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); 
  }
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....

ODPOWIEDZ