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

 
drknn:


1. Per decidere esattamente cosa dovrebbe restituire una funzione normale, dovrei sapere perché il codice principale ha bisogno di un tale valore. Per esempio, se voglio prendere la decisione di aprire un ordine di acquisto quando c'è un segnale, scriverò una funzione che restituisce il numero di ordini di acquisto già aperti. A seconda di quanti sono, il codice prenderà una decisione seguendo la logica incorporata nel codice. Non so quale logica sia incorporata nel codice di ritorno. Oggi stavo guardando un articolo sulla creazione di un semaforo e mi sono imbattuto in un codice di ritorno (-2). Sorpreso, ha fatto una domanda qui. Questo è tutto. ( https://www.mql5.com/ru/articles/1412 - articolo qui).

2. il terminale ignora i valori di ritorno. È accurato? Se è così, allora ancora una volta sorge una domanda legittima, perché nella creazione di un EA/indicatore/script lo sviluppatore mette in un template esattamente int, perché sarebbe più logico metterci void - allora il terminale non dovrebbe ignorare nulla - guadagneremmo quindi 1 tatto di tempo del processore? Forse c'è qualche logica in COSA restituire dalle funzioni int init(), int deinit() e int start()? Credo che Roche l'abbia già spiegato a qualcuno da qualche parte - ricordava una descrizione di quando restituire zero e quando restituire (-1). Era proprio questa la spiegazione che cercavo. Peccato che non l'ho trovato...

P.S.

L'autore dell'articolo usa return(-2) per i suoi scopi. Ma il fatto è che a volte la funzione start() finisce con un codice che restituisce un valore diverso da zero. E non è solo una persona a farlo. È esattamente questa la logica che voglio capire.

1. Non posso aggiungere nulla. Qualsiasi cosa tu voglia, restituiscila.

2. Il terminale lo ignora e il vostro codice non lo ignora, se è così che è costruito. La chiamata di sistema ignora entrambi i parametri e il valore di ritorno. È abbastanza ovvio. Dove torna in questo caso?

Possiamo solo indovinare la creazione del modello. Gli sviluppatori devono aver proceduto dall'INT predefinito.

 
okvseok:

come si possono capire queste righe:

Scrivi così e guarda nel diario:

//---- return orders volume

if(buys>0){
 Print("buys = ",buys);
 return(buys);
}
else{
 Print("-sells = ",-sells);
 return(-sells);// это эквивалентно команде return(sells*(-1));
}
 

Puoi darmi qualche consiglio?

Uso diversi indicatori che usano la data in variabili globali

extern bool   shiftdata           = false;
extern string ShiftHistory        = "02.06.2012 00:00";

Se cambiate la data nella storia, dovete cambiarla in tutti gli indicatori.

Ho fatto un indicatore che invia il valore di spostamento attraverso iCustom alle barre int.

Ma il problema è che passa la data invariata che viene compilata (02.07.2012), ma quando la si cambia manualmente (02.06.2012) non viene passata!

PERCHE' e COSA FARE????

//+------------------------------------------------------------------+
//|                                                        iTime.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
extern string BLOK_______1        = "Работа с историей";
extern string ShiftHistory        = "02.07.2012 00:00";
extern string PERIOD              = "D1";
//---
double buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0,buffer);
   SetIndexStyle(0,DRAW_ARROW,0,0);
   SetIndexEmptyValue(0,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
int  counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
int i,period,limit,bs,barn;

if(PERIOD=="MN1") period=PERIOD_MN1;
else
if(PERIOD=="W1")  period=PERIOD_W1;
else
if(PERIOD=="D1")  period=PERIOD_D1;
else 
if(PERIOD=="H4")  period=PERIOD_H4;
else
if(PERIOD=="H1")  period=PERIOD_H1;
else
if(PERIOD=="M30") period=PERIOD_M30;
else
if(PERIOD=="M15") period=PERIOD_M15;
else
if(PERIOD=="M5")  period=PERIOD_M5;
else
if(PERIOD=="M1")  period=PERIOD_M1;
else
period=PERIOD_D1;

bs=iBarShift(Symbol(),period,StrToTime(ShiftHistory));
barn=iBars(Symbol(),period);
limit=barn-100;

if(limit>bs)
for(i=barn-1; i>=0; i--)
{
if (i==bs) buffer[i]=bs;
} RefreshRates();
return(0);
}

Ecco il ricevitore

for(int y=barn-100; y>=0; y--)
{
int bbb,st=iCustom(Symbol(),PERIOD,"iTime",0,y);
if(st>0) bbb=st;
}
 Comment(bbb);

Il commento scrive il turno 16. E al 02.06.2012 dovrebbe essere 48.

Per favore, aiutate a consigliare!

 

aiutatemi a determinare l'ultimo massimo e minimo di uno zigzag in un EA

doppio zz1;
int start()
{
zz1=iCustom(NULL,0, "ZigZag", 12, 5, 3, 0, 1);
MessageBox("zz1="+zz1,"zz1");
ritorno(0);
}
"0.00000" sta uscendo

 
spek:

aiutatemi a determinare l'ultimo massimo e minimo di uno zigzag in un EA

doppio zz1;
int start()
{
zz1=iCustom(NULL,0, "ZigZag", 12, 5, 3, 0, 1);
MessageBox("zz1="+zz1,"zz1");
ritorno(0);
}
"0.00000" sta uscendo

double ZZ[10000]={0.0};  //массив для значений ZigZag
double zz1[10000]={0.0};

//-----
int init()
{

}
return(0);
//---
int start()
{
int q=1;   //ПОПРАВИЛ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

for(int i=1; i<=1000; i++)
{
zz1[i]=iCustom(NULL,0,"ZigZag", 12, 5, 3, 0, i);
if(zzl[i]>0) { ZZ[q]=zzl[i];  q++; }
//MessageBox("zz1="+zz1,"zz1");
Comment(ZZ[1],"  ",ZZ[2]);

return(0);
}
 

Voglio metterci dentro "Alert()" per dirmi quando la tendenza si è invertita.

Voglio mettere "Alert()" per dirmi quando la tendenza si inverte.

//+------------------------------------------------------------------+
//|                                                    mikahekin.mq4 |
//|                        Copyright 2004, MetaQuotes Software Corp. |
//|                                                http://www.sasara |
//|                              Modified by: Ronald Verwer/ROVERCOM |
//+------------------------------------------------------------------+
#property copyright "Copyright 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property  indicator_chart_window
#property  indicator_buffers 4
#property  indicator_color1  Silver
#property  indicator_color2  Yellow
#property  indicator_color3  Red
#property  indicator_color4  Blue
#property  indicator_width1 3
#property  indicator_width2 3

//---- input parameters
extern int KPeriod=3;
extern int DPeriod=3;
extern int JPeriod=7;

double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
double HighesBuffer[];
double LowesBuffer[];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
        IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 3);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 3);
   SetIndexStyle(2,DRAW_ARROW, 0, 1);
   SetIndexStyle(3,DRAW_ARROW, 0, 1);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
   SetIndexDrawBegin(4,10);
   SetIndexDrawBegin(5,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
   SetIndexBuffer(2,ind_buffer3);
   SetIndexBuffer(3,ind_buffer4);
   SetIndexBuffer(4, HighesBuffer);
   SetIndexBuffer(5, LowesBuffer);
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("mikahekin");
   SetIndexLabel(0,"Open");
   SetIndexLabel(1,"Close");
   SetIndexLabel(2,"High");
   SetIndexLabel(3,"Low");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k,j;
   int    counted_bars=IndicatorCounted();
   double price;
   
//----
   if(Bars<=10) return(0);
//---- initial zero
   if(counted_bars<0) return (-1);
//---- minimums  counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=Low[k];
         if(min>price) min=price;
         k--;
        }
      LowesBuffer[i]=min;
      i--;
     }
//---- maximums counting
   i=Bars-DPeriod;
   if(counted_bars>DPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double max=-100000;
      j=i+DPeriod-1;
      while(j>=i)
        {
         price=High[j];
         if(price>max) max=price;
         j--;
        }
      HighesBuffer[i]=max;
      i--;
     }
//---- mikahekin calcaulation
   i=Bars-JPeriod;
   if(counted_bars>JPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      double sumopen=0.0;
      double sumclose=0.0;
      double close=0.0;
      double open=0.0;
      double high=0.0;
      double low=0.0;

      for(k=(i+JPeriod-1);k>=i;k--)
         {
         sumclose+=Close[k];
         close=sumclose/JPeriod;
         sumlow+= LowesBuffer[k];
         low= sumlow/JPeriod;
         sumopen+=Open[k];
         open=sumopen/JPeriod;
         sumhigh+=HighesBuffer[k];
         high=sumhigh/JPeriod;
         }
         
      ind_buffer1[i]=open;
      ind_buffer2[i]=close;
      ind_buffer3[i]=high;
      ind_buffer4[i]=low;

      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Z.I. Sono un po' più bravo con mql4 che nella danza classica, ma...
 
Zhunko:

1. Non posso aggiungere nulla. Qualsiasi cosa tu voglia, restituiscila.

2. il terminale ignora e il vostro codice non ignora, se è così che è costruito. La chiamata di sistema ignora sia i parametri che il valore di ritorno. È abbastanza ovvio. Dove torna in questo caso?

Possiamo solo indovinare la creazione del modello. Gli sviluppatori devono aver proceduto dall'INT predefinito.


È arrivato un tick, il terminale chiama la funzione start() dell'EA. Lei afferma che il valore restituito da questa funzione è indifferente al terminale. Questo è documentato da qualche parte?
 
KoKoS:

Voglio metterci dentro "Alert()" per dirmi quando la tendenza si è invertita.

Voglio usare "Alert()" per dirmi quando la tendenza si inverte.

Z.U. Sono un po' più bravo con mql4 che con la danza classica ma...


Linee

#property  indicator_color1  Silver
#property  indicator_color2  Yellow

Penso che i primi due buffer siano l'indicatore di un cambiamento di tendenza. Hanno segni rossi in cima ai candelabri e blu in fondo. Solo la combinazione giallo-grigio funziona come indicatore di inversione di tendenza. Per loro sarà di conseguenza:

//---- indicator buffers mapping
   SetIndexBuffer(0,ind_buffer1);// для серого цвета
   SetIndexBuffer(1,ind_buffer2);// для жёлтого цвета
Lì, nei valori di quei buffer, scavate.
 
Gente, consigli sul trasferimento della data tramite iCustom. Passa il valore corrente compilato, come passare il buffer cambiato a livello globale? Quando cambio la data, passa ancora lo stesso valore.
extern bool   shiftdata           = false;
extern string ShiftHistory        = "02.06.2012 00:00";

Indicatore postato appena sopra.....

O non cambia in alcun modo?????

Potreste parlarmi del trasferimento della data tramite iCustom?

 

Per favore aiutate, se qualcuno di voi può, a scrivere il codice per la seguente condizione:

"se un ordine è stato chiuso da TakeProfit, dopo aver attraversato una media mobile, allora non aprire altre operazioni in quella direzione fino a quando il prezzo non attraversa la media mobile nella direzione opposta".

Grazie in anticipo per il vostro aiuto!

Motivazione: