Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 202

 
Yurij Kozhevnikov:

=

Questo sembra essere il caso, se ho capito bene il principio di sostituzione.

Punto e virgola extra dopo le parentesi graffe. E non è chiaro a cos'altro ci si riferisce.

È un peccato che apparentemente non ci sia un modo semplice per automatizzare l'espansione delle macro per vedere cosa succede. A meno che non sia in grado di inventare una mia sceneggiatura.

Grazie! C'è una ragione per cui non c'è il punto e virgola dopo while in una macro.

Le macro sono una buona cosa, ma la linea tra il bene e il male, nel loro caso, è ancora più sottile che con una donna))) Bisogna stare molto, molto attenti con loro. E sì, nel mio esempio, non ';', ma esattamente else, che ha iniziato a riferirsi a if, che è nella macro, dopo aver rimosso ;.

Sono molto bravo con le macro, quindi per un caso come il tuo ho rinunciato a usarle da circa 1,5 anni, è ottimale:

inline bool CheckRead(){
   ...
}

if (!CheckRead()) return;
 

A parte il fatto che non riesco a trovare nulla di inline qui.

E non conosco il C++.

 

Buon pomeriggio, per favore aiutatemi!

C'è un codice abbastanza semplice per aprire e modificare un ordine. Le funzioni OrderSend, OrderSelect e OrderModify sono messe in un ciclo con un piccolo ritardo tra i tentativi. Per minimizzare gli errori di comunicazione, ecc.

Succede la seguente cosa strana: l'ordine viene aperto normalmente, seguito da una modifica riuscita dello StopLoss e da una modifica riuscita del TakeProfit. Ma quando imposto il TP, lo StopLoss è nullo. Non riesco a capire la ragione.

Ecco questa parte del codice:

send = 5; //numero massimo di tentativi per impostare un ordine

tick=0;

sendschet=0; //contatore di tentativi

while(!tick && sendschet<=send)

{

tick=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Bid,150,0.0,0.0,komm,MagNum,0,Yellow);

mittente++;

Sleep(1000); //Delay 1 secondo prima del prossimo tentativo

}

select = 5; //numero massimo di tentativi per selezionare un ordine

slschet=0; //prova il contatore per la selezione dell'ordine

while(!OrderSelect(tick,SELECT_BY_TICKET) && slschet<=select)

{

slschet++;

Sleep(500); //Delay 0,5 secondi prima del prossimo tentativo

}

if(slschet<select) //i tentativi erano meno del massimo, significa che l'ordine è stato selezionato con successo

{

modifica = 5; //numero massimo di tentativi di modificare l'ordine

mdschet=0;

while(!OrderModify(tick,OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Yellow)

&& mdschet<=modifica)

{

mdschet++;

Sleep(500); //Delay 0,5 secondi prima del prossimo tentativo

}

*Qui tutto va bene - SL è impostato

mdschet=0; //reset del contatore prima di cambiare TP

while(!OrderModify(tick,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TP,Digits),0,Yellow)

&& mdschet<=modifica)

{

mdschet++;

Dormire(500);

}

}

*dove TP è impostato normalmente, ma SL è già uguale a 0.0. Quindi risulta che OrderStopLoss() è uguale a 0.0.

La selezione degli ordini non è cambiata però.

Se aggiungiamo OrderSelect ancora una volta tra l'impostazione di SL e TP, tutto sembra funzionare. Ma contraddice la logica.

Vi ringrazio in anticipo per il vostro aiuto in questa materia.

 

Buon pomeriggio!

Per favore, aiutatemi a gestire la modifica della dimensione di un array dinamico.

Diciamo che sto impostando un array:

int DB[][8];

Poi nella prima subroutine del ciclo, possibilmente più volte (nessuna domanda su questo -- finora funziona come previsto):

ushort i = 0;
ArrayResize(DB,i+1);

Nella prossima subroutine aggiungerò elementi nella prima dimensione del ciclo. Non so quanti in anticipo. So che è più lento che se si dichiara la dimensione in anticipo. Ma penso che fino a 500 aggiunte all'anno non faranno la differenza.

La domanda è: come scopro la dimensione esistente dell'array in questa subroutine? Per prenderlo come dimensione di base e aggiungervi un nuovo valore.

Prendere ArraySize() e dividere per 8? O c'è qualche altra funzione che mi soddisfa di più?

Grazie in anticipo!

 
Oleg_Ko:

Buon pomeriggio!

Per favore, aiutatemi a gestire la modifica della dimensione di un array dinamico.

Diciamo che sto impostando un array:

Poi nella prima subroutine del ciclo, possibilmente più volte (nessuna domanda su questo -- finora funziona come previsto):

Nella prossima subroutine aggiungerò elementi nella prima dimensione del ciclo. Non so quanti in anticipo. So che è più lento che se si dichiara la dimensione in anticipo. Ma penso che fino a 500 aggiunte all'anno non faranno la differenza.

La domanda è: come scopro la dimensione esistente dell'array in questa subroutine? Per prenderlo come dimensione di base e aggiungervi un nuovo valore.

Prendere ArraySize() e dividere per 8? O c'è qualche altra funzione che mi soddisfa di più?

Grazie in anticipo!

ArrayRange()

Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

ArrayRange()

Artem, grazie.
 

Buon pomeriggio.

Non ho fatto trading su MT4 per molto tempo, ho deciso di provare di nuovo. In precedenza ho usato lo script (allegato), ma ora non viene eseguito, per favore vedi cosa è andato storto.

File:
RiskAdvisor.mq4  12 kb
 
Nauris Zukas:

Ciao!
C'è un modo per sapere immediatamente CopyHigh il numero di elementi di un array in qualsiasi periodo di tempo?

Mi rispondo da solo, forse qualcuno si imbatterà nella domanda attraverso un motore di ricerca.

SeriesInfoInteger(symbol_name,timeframe,SERIES_BARS_COUNT);
 
Nauris Zukas:

Mi rispondo da solo, forse qualcuno si imbatterà nella domanda attraverso un motore di ricerca.

Anche Bars(), iBars()
 
Artyom Trishkin:
Anche Bars(), iBars()

Con Bars(), non potete scoprire il numero di elementi della matrice in qualsiasi periodo di tempo, ma solo nel grafico corrente.

Motivazione: