[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 667

 
artmedia70:

Amici, non riesco a capire perché non funziona:

Se si trova una posizione con la magia 5100 nel ciclo, il ciclo deve passare a una nuova iterazione:

... Ma questo non accade e la posizione selezionata con un numero magico 5100 inizia a partecipare a ulteriori calcoli come la più perdente...

Questa è la chiusura... E poi, di conseguenza, un altro di chiusura è impostato su di esso...

Aiutami a capire dove è nascosto il cane...

Questo è tutto, grazie, non c'è bisogno. Ho trovato il cane da solo...
 

Finora ho lavorato con funzioni semplici che danno come risultato un singolo valore di uscita.

La funzione può emettere i valori di diverse variabili? Per esempio: Time_1, High_1, Low_1, Time_2, High_2, Low_2.

Grazie!

 
chief2000:

Una funzione può emettere i valori di più variabili?


Una funzione può restituire solo un parametro, ma nessuno vieta a una funzione di lavorare con variabili dichiarate al di fuori della funzione start()(variabili globali).
 
DDFedor:

La funzione può restituire un solo parametro, ma nessuno vieta alla funzione di lavorare con variabili dichiarate al di fuori della funzione start() (variabili globali).


Facciamo un semplice esempio - se [MA_1>=Ma_2], dovreste restituire i valori Time_1, High_1, Low_1

per la barra in cui si è verificato il crossover. Questo modulo in start() è

 
chief2000:


giusto?


Ma bisogna tener conto che i valori di tali variabili sono rilevanti fino a quando la funzione viene chiamata di nuovo. quindi, le variabili devono essere utilizzate IMMEDIATAMENTE dopo la chiamata della funzione. allora le variabili conterranno i valori calcolati per QUESTA chiamata di funzione.
 
DDFedor:

Ma bisogna tener conto del fatto che i valori di tali variabili sono rilevanti fino a quando la funzione viene chiamata di nuovo. quindi, le variabili devono essere utilizzate IMMEDIATAMENTE dopo la chiamata della funzione. allora le variabili conterranno i valori calcolati per questa chiamata di funzione.

Sì, è comprensibile. Grazie!

 
chief2000:

Finora ho lavorato con funzioni semplici che producono un singolo valore di uscita.

La funzione può emettere i valori di diverse variabili? Per esempio: Time_1, High_1, Low_1, Time_2, High_2, Low_2.

E cosa vi impedisce di usare il passaggio dei parametri per riferimento piuttosto che per valore nella dichiarazione della funzione? Esempio (Fondamenti del linguaggio/Variabili/Parametri formali):

È possibile passare parametri per riferimento. In questo caso, la modifica di tali parametri influenzerà le variabili corrispondenti nella funzione chiamata passata per riferimento. Non si possono passare elementi di array per riferimento. I parametri possono essere passati per riferimento solo entro i limiti di un singolo modulo, tale opportunità non è prevista per le funzioni di libreria. Per specificare che un parametro è passato per riferimento, il modificatore & deve essere posto dopo il tipo di dati.

Esempio:

void func(int& x, double& y, double& z[]) { double calculated_tp; ... for(int i=0; i<OrdersTotal(); i++) { if(i==ArraySize(z)) break; if(OrderSelect(i)==false) break; z[i]=OrderOpenPrice(); } x=i; y=calculated_tp; }

Gli array possono anche essere passati per riferimento, tutti i cambiamenti saranno riflessi nell'array originale. A differenza dei parametri semplici, gli array possono anche essere passati per riferimento alle funzioni di libreria.

Notate che func() è di tipo void, ma la sua esecuzione cambierà tutti e tre i parametri dichiarati al suo esterno, poiché tutti e tre sono forniti con il modificatore &. Compreso, a proposito, l'array z[] cambia completamente.
 
Mathemat:

E cosa vi impedisce di usare il passaggio di parametri per riferimento piuttosto che per valore nella dichiarazione della funzione? Esempio (Fondamenti del linguaggio/Variabili/Parametri formali):

Notate che la funzione func() è di tipo void, ma la sua esecuzione cambierà tutti e tre i parametri dichiarati al suo esterno, poiché tutti e tre sono forniti con il modificatore &. Compreso, a proposito, l'array z[] cambia completamente.

Grazie mille!

 
Come farlo! Se l'ultimo trade non è stato redditizio, bisogna cambiare il lotto, altrimenti no)?
 
rovlent:
Come fare così! Se l'ultimo trade non era redditizio, dovremmo cambiare il lotto, altrimenti - no?)


Per esempio così

//=================================================
// Расчет размера позиции
//==================================================
double CalculateLots(){
   double Res=dLots;
   bool bProfit=true;
   int PrevTime=-1;
   double tmpLots;
   for (int i=0;i<OrdersHistoryTotal();i++){
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderMagicNumber()!=MAGIC)                  continue;
      if (OrderCloseTime()<PrevTime)                  continue;
      PrevTime=OrderCloseTime();
      if (OrderProfit()>0) bProfit=true; else bProfit=false;
      tmpLots=OrderLots();
   }
   double Lots_Step=MarketInfo(Symbol(), MODE_LOTSTEP);
   if (!bProfit) Res=tmpLots+Lots_Step;
   return(Res);
}

Aumentato del passo impostato dal DC. Anche se le varianti possono essere diverse

dLots - dimensione predefinita della posizione

Motivazione: