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

 
sergeev:

no


Il problema qui è semplicemente nel ciclo. i va da 0 a 2. Voi volete 2 a 0.



Mostrami un esempio per favore, l'ho fatto
 for(i = OrdersTotal(); i > 0; i--)
Non ha funzionato.
 

sss2019:



Mostrami un esempio per favore, l'ho fatto Non ha funzionato


Ho fatto lo script in questo modo

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

Come risultato, Print produce il seguente risultato

0 4

1 4

Questo è tutto, per qualche motivo il ciclo non stampa

2 4

3 4

Ho aggiunto al ciclo OrderSelect(i, SELECT_BY_POS, MODE_TRADES invece di I 0, cioè il primo ordine è sempre selezionato e lo script funziona correttamente. Risulta che quando il ciclo cancella due ordini, cerca di selezionare il terzo ordine quando ci sono solo due ordini nella lista.

 
sss2019:


Ha fatto lo script in questo modo

Alla fine...

Esempi
 
sss2019:

Per favore mostratemi un esempio, ho fatto

for(i = OrdersTotal(); i > 0; i--)

Non ha aiutato.


perché devi ancora pensare.

for(i = OrdersTotal()-1; i >=0; i--)
 

Aiutami a risolvere questo dilemma

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

Lo script cerca la distanza massima tra le linee. Emette tutti i valori su tutte le barre, l'intervallo massimo è 1,6235 su una barra e 1,6208 sull'altra.

Provo a stampare Print(maxrange); stampa 0,086, non capisco perché, sto dividendo per Point

 
sss2019:

Aiutami a risolvere questo dilemma

Lo script cerca la distanza massima tra le linee. Emette tutti i valori su tutte le barre, l'intervallo massimo è 1,6235 su una barra e 1,6208 sull'altra.

Provo a stampare Print(maxrange); restituisce 0,086, non capisco proprio perché, sto dividendo per Point


Questo non è un dilemma. Un dilemma è quando non si sa quale delle due soluzioni sia migliore.

Beh, per prima cosa, la funzione iMA() ha sette parametri, non sei. In secondo luogo, avete dichiarato una variabile con la stringa int i. E inoltre, la variabile i non è inizializzata da nessuna parte con un valore. Di conseguenza, o è zero o contiene spazzatura di memoria lasciata dall'attività precedente. E in terzo luogo, il ciclo while è disposto in modo scorretto. Bene, diciamo che la variabile i è uguale a zero dopo l'inizializzazione. Supponiamo anche che l'espressione Ma1 > Ma2 sia vera. Di conseguenza, la linea while(Ma1 > Ma2) avvierà il ciclo. Alla prossima iterazione del ciclo scopriremo che l'espressione (Ma1 > Ma2) non è più vera e il ciclo sarà terminato. Le variabili Ma1 e Ma2 non conterranno la distanza massima - la distanza massima era una volta. Questa condizione mostrerà solo che Ma1 è diventato ora minore o uguale a Ma2.

Inoltre, la variabile maxrange sarà inizializzata con un valore solo nella linea range = (Ma1 - Ma2)/Point; Bene, e se la condizione if(range > maxrange) non si verificherà mai, perché non inizializzi la variabile maxrange con un valore in nessun altro punto del codice? Così si scopre che state confrontando il risultato dei calcoli con la spazzatura delle cellule di memoria. Qui avete stampe incomprensibili come risultato dell'esecuzione del codice.

 
Il fatto è che stavo emettendo tutti i valori MA nel ciclo, e tutti i valori sono corretti, cioè tutti i valori MA per questo periodo sono stati enumerati. Ma il calcolo è sbagliato in questo posto - range = (Ma1 - Ma2)/Point;
if(range > maxrange) maxrange = range;
 
sss2019:
Questo è il punto, stavo emettendo tutti i valori MA nel ciclo e tutti i valori sono corretti, cioè tutti i valori MA per questo periodo sono stati cercati. Ma il calcolo è sbagliato in questo posto - range = (Ma1 - Ma2)/Point;
if(range > maxrange) maxrange = range;

*Punto

gamma = (Ma1 - Ma2)*Punto





 
pako:

*Punto

gamma = (Ma1 - Ma2)*Punto

MA1 = 0,6526, MA2 = 0,6516. MA1-MA2 = 0,6526-0,6516 = 0,0010. Punto = 0,0001. Se moltiplicato, è un bilibrario. 0,0010 * 0,0001 = 0,0000001
 
sss2019:
Il fatto è che stavo emettendo tutti i valori MA nel ciclo, e tutti i valori sono corretti, cioè tutti i valori MA per questo periodo sono stati enumerati. Ma il calcolo è sbagliato in questo posto - range = (Ma1 - Ma2)/Point;
if(range > maxrange) maxrange = range;

Beh, bisogna controllare cosa viene inserito. Quali valori variabili sono coinvolti nei calcoli?
Motivazione: