Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1033

 
abeiks:

Salve.

L'ora non viene restituita correttamente al momento. Per esempio, se l'ora è 12.04, restituisce 12.4. Potete dirmi come rendere questa funzione corretta?

Bene, Hour() e Minute() restituiscono l'ora corrente e il minuto corrente dell'ultimo tempo del server al momento dell'avvio del programma. E i valori restituiti sono di tipo int. E questi sono solo numeri interi. Quindi è necessario formattarli. Per esempio, così:

string label=IntegerToString(Hour(),2,'0')+":"+IntegerToString(Minute(),2,'0');
 
artmedia70:

Hour() e Minute() restituiscono l'ora corrente e il minuto corrente dell'ultima ora del server all'inizio del programma. E i valori restituiti sono di tipo int. E questi sono solo numeri interi. Quindi è ancora necessario formattarli. Per esempio, così:


Grazie!
 
abeiks:
Grazie!

Non c'è di che. Se non è un segreto, perché avete bisogno di un timestamp che mostri l'ultima volta che il vostro programma è stato avviato - il tempo in esso non cambierà.

Solo una curiosità inutile...

 

Buon pomeriggio!

Si prega di consigliare come implementare correttamente la funzione di limitare 1 accordo a 1 barra (cioè se un accordo è già stato aperto o chiuso su una candela, un nuovo accordo non si aprirà su quella candela)

Ho trovato molte varianti, ma non riesco a capire come scrivere correttamente il codice di un gufo (cioè quale parte dovrebbe essere scritta nelle variabili globali, e quale parte dovrebbe essere scritta nella condizione di apertura dell'affare)

Per esempio, ecco una tale variante:

int TekBar = -1; // Barra corrente.

if (TekBar == Bars)return(0); // Solo un trade per barra.
TekBar = Bars; // C'è solo un trade su una barra.

{...}

quale parte di questo script dovrebbe essere inserita in quale area del codice del gufo?

 
DuKle:

Buon pomeriggio!

Si prega di consigliare come implementare correttamente la funzione di limitare 1 accordo a 1 barra (cioè se un accordo è già stato aperto o chiuso su una candela, un nuovo accordo non si aprirà su quella candela)

Ho trovato molte varianti, ma non riesco a capire come scrivere correttamente il codice di un gufo (cioè quale parte dovrebbe essere scritta nelle variabili globali, e quale parte dovrebbe essere scritta nella condizione di apertura dell'affare)

Per esempio, ecco una tale variante:

int TekBar = -1; // barra corrente.

if (TekBar == Bars)return(0); // Solo un trade per barra.
TekBar = Bars; // C'è solo un trade su una barra.

{...}

quale parte di questo script dovrebbe essere inserita in quale area del codice del gufo?

Dovete scoprire se l'ultimo trade alla barra numero 0 è stato aperto o chiuso.

Per fare questo, è necessario trovare l'ultimo trade aperto e l'ultimo trade chiuso.

Visualizza la barra dell'ultimo trade aperto e la barra dell'ultimo trade chiuso.

Se uno di questi valori (barra dell'ultimo trade aperto o barra dell'ultimo trade chiuso) è zero, non potete aprire nuove posizioni.

E, sì: non è uno script, è solo un pezzo di codice. E non c'è bisogno di inserire nulla nel gufo: il gufo è un rapace notturno, e lascia vivere l'uccello.

 

Ciao, per favore aiutatemi!

Ho un'idea, ma non so come implementarla. E soprattutto, non so se questo problema ha una soluzione.

L'essenza è la seguente: abbiamo un indicatore che disegna una linea sul grafico su un dato numero di barre.

È possibile cambiare il numero di barre su cui viene disegnata la linea trascinando la "fine" sinistra della linea con il mouse? Dopo il trascinamento, l'indicatore dovrebbe ricordare il nuovo numero di barre utilizzato per il calcolo. Ecco un esempio di un indicatore che voglio migliorare

//+------------------------------------------------------------------+
//|                                                      Canal__.mq4 |
//+------------------------------------------------------------------+
//----------------------------------
#property indicator_chart_window
//----------------------------------
extern int Hours=20;
extern color col=Red;
//------------------
double lr,lr0,lrp;
double sx,sy,sxy,sx2,aa,bb;
int p,fs;
ulong sName;
int f,f0,f1;
double dh,dl,dh_1,dl_1,dh_2,dl_2;
int ai_1,ai_2,bi_1,bi_2;
double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;
double price_p1,price_p0,price_p2,price_01,price_00,price_02;
int p1,p0,p2,fp;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   p=Hours*60/Period();
   if(fs==0)
     {
      sName=TimeCurrent(); 
      fs=1;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("1"+(string)sName);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i,n;
//----
   if(f==1)
     {
      p1=iBarShift(Symbol(),Period(),(datetime)ObjectGet("1"+(string)sName,OBJPROP_TIME1));
      if(fp==0 && p!=p1) {p=p1; fp=1;}
     }
//----
   sx=0; sy=0; sxy=0; sx2=0;
   for(n=0; n<=p; n++)
     {
      sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);
     }
   aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);
//----
   for(i=0; i<=p; i++)
     {
      lr=bb+aa*i;
      dh=High[i]-lr; dl=Low[i]-lr;
      //----
      if(i<p/2)
        {
         if(i==0)
           {
            dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;
           }
         if(dh>=dh_1) {dh_1=dh; ai_1=i;}
         if(dl<=dl_1) {dl_1=dl; bi_1=i;}
        }
      //----
      if(i>=p/2)
        {
         if(i==p/2)
           {
            dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;
           }
         if(dh>=dh_2) {dh_2=dh; ai_2=i;}
         if(dl<=dl_2) {dl_2=dl; bi_2=i;}
        }
     }
   lr0=bb; lrp=bb+aa*(i+p);
//===================================================
   if(MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;
   if(MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;
   if(MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2))
     {
      if(MathAbs(dh_1-dh_2)<MathAbs(dl_1-dl_2)) f=1; if(MathAbs(dh_1-dh_2)>=MathAbs(dl_1-dl_2)) f=2;
     }
//=================================================
   if(f==1)
     {
      for(n=0; n<=20; n++)
        {
         f1=0;
         for(i=0; i<=p; i++)
           {
            hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
            if(i==0 || i==p/2) dhm=0.0;
            if(High[i]-hai>dhm && i<p/2) {ai_1=i; f1=1;}
            if(High[i]-hai>dhm && i>=p/2) {ai_2=i; f1=1;}
           }
         if(f==0) break;
        }
      //----------------------------
      for(i=0; i<=p; i++)
        {
         hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
         dli=Low[i]-hai;
         if(i==0) dlm=0.0; if(dli<dlm) dlm=dli;
        }
      ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);
      hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);
      //----------------------------
      price_p1=hap+dlm/2;
      price_01=ha0+dlm/2;
     }
//=================================================
   if(f==2)
     {
      for(n=0; n<=20; n++)
        {
         f1=0;
         for(i=0; i<=p; i++) 
           {
            lai=Low[bi_1]*(i-bi_2)/(bi_1-bi_2)+Low[bi_2]*(i-bi_1)/(bi_2-bi_1);
            if(i==0 || i==p/2) dlm=0.0;
            if(Low[i]-lai<dlm && i<p/2) {bi_1=i; f1=1;}
            if(Low[i]-lai<dlm && i>=p/2) {bi_2=i; f1=1;}
           }
         if(f==0) break;
        }
      //----------------------------
      for(i=0; i<=p; i++)
        {
         lai=Low[bi_1]*(i-bi_2)/(bi_1-bi_2)+Low[bi_2]*(i-bi_1)/(bi_2-bi_1);
         dhi=High[i]-lai;
         if(i==0) dhm=0.0; if(dhi>dhm) dhm=dhi;
        }
      la0=Low[bi_1]*(0-bi_2)/(bi_1-bi_2)+Low[bi_2]*(0-bi_1)/(bi_2-bi_1);
      lap=Low[bi_1]*(p-bi_2)/(bi_1-bi_2)+Low[bi_2]*(p-bi_1)/(bi_2-bi_1);
      //----------------------------------------------------------------
      price_p1=lap+dhm/2;
      price_01=la0+dhm/2;
     }
//=================================================================================== отрисовка линий
   ObjectCreate("1"+(string)sName,2,0,Time[p],price_p1,Time[0],price_01);
//-----------------------------------------------------------------
   ObjectSet("1"+(string)sName,OBJPROP_COLOR,col);
   ObjectSet("1"+(string)sName,OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectSet("1"+(string)sName,OBJPROP_RAY,false);
//---------------------------------------------
   ObjectSet("1"+(string)sName,OBJPROP_TIME1,Time[p]);
   ObjectSet("1"+(string)sName,OBJPROP_PRICE1,price_p1);
   ObjectSet("1"+(string)sName,OBJPROP_TIME2,Time[0]);
   ObjectSet("1"+(string)sName,OBJPROP_PRICE2,price_01);
   f=1; p1=p; p0=p; p2=p; fp=0;
//===================================================================================
   return(0);
  }
//+------------------------------------------------------------------+
 
Night63:

Ciao, per favore aiutatemi!

Ho un'idea, ma non so come implementarla. E soprattutto, non so se questo problema ha una soluzione.

L'essenza è la seguente: abbiamo un indicatore che disegna una linea sul grafico su un dato numero di barre.

È possibile cambiare il numero di barre su cui viene disegnata la linea trascinando la "fine" sinistra della linea con il mouse? Dopo il trascinamento, l'indicatore dovrebbe ricordare il nuovo numero di barre utilizzato per il calcolo. Ecco un esempio di un indicatore che voglio migliorare

Dovete aggiungere OnChartEvent() all'indicatore e tracciare l'evento di cambiamento della dimensione della linea con il suo nome: CHARTEVENT_OBJECT_CHANGE. Ricalcola la nuova lunghezza della linea in barre, e usa la sua nuova dimensione come parametro per il calcolo.
 
artmedia70:

Devi scoprire se l'ultimo trade è stato aperto o chiuso sulla barra numero 0.

Per fare questo, è necessario trovare l'ultimo trade aperto e l'ultimo trade chiuso.

Visualizza la barra di apertura dell'ultimo trade aperto e la barra di chiusura dell'ultimo trade chiuso.

Se uno di questi valori (la barra dell'ultimo trade aperto o la barra dell'ultimo trade chiuso) è zero, non potete aprire nuove posizioni.

E, sì: non hai uno script, è solo una parte del codice di nepomyshchego. E non c'è bisogno di inserire nulla nel gufo: il gufo è un rapace notturno, e lascia vivere l'uccello.

Capisco il principio di rilevare la presenza di un accordo, ma non so come implementarlo nel codice :-(
 
DuKle:
Capisco il principio di determinare se una transazione esiste, non so come implementarlo nel codice :-(

Com'è triste tutto questo...

Lo faccio io per te?

Per cominciare, e per capire meglio, leggete il thread"Funzioni utili di KimIV".

Il codice, naturalmente, è ridondante, ma è giusto per iniziare e imparare.

 

Cari programmatori di mql4/5!

Sono un principiante che ha imparato le basi del linguaggio di programmazione e ha sviluppato un EA per il mio diploma!

Ho un capitolo nel mio diploma chiamato "Economia".

Se dovessi sviluppare un programma per un'azienda - tutto è chiaro con la parte economica.

Ma come essere nel mio caso? Cosa posso prendere in considerazione e quali percorsi seguire!

Grazie mille!!!!

___________________________

La strada è percorsa da coloro che camminano (c)