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

 

DiPach , grazie ancora per il tuo aiuto. Ho analizzato i vostri esempi. Ho apportato alcune modifiche al mio codice di avvio. Il risultato è questo:

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

Cosa è stato cambiato:

1. Ho spostato la linea contenente int awd1[]; dichiarazione dell'array all'interno della funzione OnStart()

2. Aggiunta la funzione ArrayResize(awd1,6,7);

3. Lo script funziona.

Cercherò di trarre alcune conclusioni. Negli script, è corretto dichiarare gli array all'interno della funzione OnStart(). Dopo che l'array è stato dichiarato, deve essere necessariamente definito nelle sue dimensioni usando la funzione ArrayResize(); altrimenti il compilatore si mette in allarme. Le mie conclusioni sono corrette? In caso contrario, si prega di dare l'interpretazione corretta.

 
silachara:

DiPach , grazie ancora per il tuo aiuto. Ho analizzato i vostri esempi. Ho apportato alcune modifiche al mio codice di avvio. Il risultato è questo:

Cosa è stato cambiato:

1. ha spostato la linea contenente la dichiarazione di int awd1[]; array all'interno della funzione OnStart()

2. Aggiunta la funzione ArrayResize(awd1,6,7);

3. Lo script funziona.

Cercherò di trarre delle conclusioni. Negli script, è corretto dichiarare gli array all'interno della funzione OnStart(). Dopo che l'array è stato dichiarato, deve essere necessariamente definito nelle dimensioni usando la funzione ArrayResize(); altrimenti il compilatore genererà un errore. Le mie conclusioni sono corrette? In caso contrario, si prega di dare l'interpretazione corretta.

In generale, sì. E funzionerà, almeno in silenzio, ma molto bene. :)

Mi limiterò a specificare i seguenti punti:

1. Quando si dichiarano le normali variabili e gli array, penso che si dovrebbe considerare ciò che lo script (o l'EA/indicatore) sta per fare e a cosa sono destinate le variabili/array.

Il flusso di lavoro del tuo script allegato permette di dichiarare le variabili non a livello globale del programma, ma localmente. Cioè, l'array è dichiarato una volta sola. Non abbiamo bisogno di dichiarazioni di loop nel corpo di Start(), per esempio, prima di iniziare il ciclo for() e quando abbiamo bisogno di ulteriori dichiarazioni di alcune variabili dopo for() {}:


Di conseguenza, l'array non è dichiarato a livello di variabili globali del programma ma nel corpo di OnStart() prima della dichiarazione del ciclo for() - è abbastanza accettabile in questo schema di esecuzione del programma.

Dal mio punto di vista, se non c'è bisogno di dichiarare qualcosa a livello di variabili globali in un programma, è meglio usare questa opportunità e dichiarare tutto ciò che possiamo localmente.

2. Per quanto riguarda il codice, lasciatemi chiarire:

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

Cioè:

  • Non si dovrebbe usare il segno <= (meno che uguale) in for. Voglio dire dove era (i=0;i<=5;i++). Basta mettere <(meno di) e il numero 6 invece di 5:
for(int i=0;i<6;i++)

Questo è il modo in cui il 5 sarebbe appropriato per:

for(int i=5;i>=0;i--)
  • Ricordo di aver incontrato in precedenza l'informazione che la funzione Stringconcatenate contribuisce a velocizzare l'elaborazione di testi lunghi. Ecco perché di solito lo uso nel mio codice. L'ho aggiunto anche qui, per sicurezza.


P./S.: Un altro chiarimento, per sicurezza, usando ArrayResize() - per gli array dinamici. Nella documentazione di questa funzione , ci sono informazioni su quando questa funzione non può ridimensionare gli array dinamici.

 
Best_ATS:
Perché non posso aggiungere amici?
E come si fa a immaginare un amico senza conoscerlo personalmente nella vita, dal lavoro?
 

Ciao, come posso fare in modo che il nuovo prezzo sia mostrato per primo e il prezzo precedente scenda in basso e così via? Ho fatto un esempio per renderlo chiaro.

double NN=0;
double NN1=0;
double NN2=0;
double NN3=0;
void OnTick()
  {
//---
if(Ask>NN)NN=Ask;
if(NN>NN1)NN1=NN;
if(NN1>NN2)NN2=NN1;
if(NN2>NN3)NN3=NN2;
        Comment(""       
             + "1.   "+"Buy: "" Max: " + DoubleToStr(NN,5)
             + "\n"  
             + "2.   "+"Buy: "" Max: " + DoubleToStr(NN1,5)
             + "\n"  
             + "3.   "+"Buy: "" Max: " + DoubleToStr(NN2,5)
             + "\n"  
             + "4.   "+"Buy: "" Max: " + DoubleToStr(NN3,5)
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks:

Ciao, come posso fare in modo che il nuovo prezzo sia mostrato per primo e il prezzo precedente scenda in basso e così via? Questo sarebbe chiaro fatto un esempio.

Ho fatto un esempio, e con le condizioni più o meno si può capire da soli:

double bda_Price[4];
void OnTick()
{
      int li_int;
//---
    if (Ask > bda_Price[0])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[0] = Ask;
        double lda_Price[3];
        ArrayCopy (lda_Price, bda_Price, 0, 1);
        for (int li_int = 1; li_int < 4; li_int++)
        {bda_Price[li_int] = lda_Price[li_int-1];}
    }
    string ls_txt;
    StringInit (ls_txt, 100);
    for (li_int = 0; li_int < 4; li_int++)
    {ls_txt = StringConcatenate (ls_txt, (string) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits), "\n");
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
    Comment (ls_txt);
//---
}
 
TarasBY:

Ho fatto un esempio, e potete risolvere i termini più o meno da soli:


Grazie!
 
abeiks:

Ciao, come posso fare in modo che il nuovo prezzo sia mostrato per primo e il prezzo precedente scenda in basso e così via? Per renderlo chiaro, ho fatto un esempio.

Ecco un codice completamente primitivo.

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
 
silachara:

Ecco un codice perfettamente primitivo fatto.




Grazie!
 

Ciao a tutti. Ho provato ad aprire un ordine di trading nello strategy tester usando uno script rudimentale, senza successo.

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point;

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,",0,0,Blu);

if(res>-1)Alert("Open BUY order with ticket ",res);

//----

ritorno(0);

}

Ho messo lo script sul grafico del tester in modalità visualizzazione, ma l'ordine di trading si apre nel terminale MT4.

Inoltre non posso ottenere informazioni sugli ordini aperti nel tester di strategia usando SimpleFXTester_v2.ex4.

Per favore, aiutatemi a capire questo.

 
kosmos0975:

Ciao a tutti. Ho provato ad aprire un ordine di trading nello strategy tester usando uno script rudimentale, senza successo.

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point;

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,",0,0,Blu);

if(res>-1)Alert("Open BUY order with ticket ",res);

//----

ritorno(0);

}

Ho messo lo script sul grafico del tester in modalità visualizzazione, ma l'ordine di trading si apre nel terminale MT4.

Inoltre non posso ottenere informazioni sugli ordini aperti nel tester di strategia usando SimpleFXTester_v2.ex4.

Per favore, aiutatemi a capire questo.

Gli script nello Strategy Tester non funzionano.
Motivazione: