Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 557

 
Ihor Herasko:

OrderSelect() viene eseguito all'interno del terminale, non c'è nessuna richiesta al server. Quindi, non c'è niente di sbagliato nell'accedere alla lista degli ordini ad ogni tick. La maggior parte degli Expert Advisors lo fa.

E la tua domanda sull'array è legata all'architettura del programma. Nel caso di un EA complesso che opera con una grande quantità di ordini, questo è assolutamente necessario. Se l'Expert Advisor opera con un solo ordine con una logica semplice, l'array è ridondante.

Vale solo la pena menzionare il fatto che anche se abbiamo un array di ordini, non possiamo fare a meno di chiamare OrderSelect(). Dopo tutto, dobbiamo controllare ad ogni tick se l'ordine esiste ancora o no. Anche i suoi parametri potrebbero essere cambiati.

Grazie.
 
Rustam Bikbulatov:

Ragazzi, ditemi come trattare e da dove cominciare!

Esempio: ho 15 ordini con lotto 0,01. Ho bisogno di chiudere qualche trade con lotto 0,07 ad un certo punto.

La mia domanda è: come posso chiudere 7 ordini o 0,07 in un OrderClose(...)?

Se metto 0,07 in una volta sola non vede i trade con volume 0,01.

Sono nuovo nella programmazione.


    int countS = 3;
   if(LastTime!=iTime(NULL,1,0)){
      for(int i=OrdersTotal()-1; i>=0; i--){
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol() && OrderMagicNumber()==321){ 
         if(OrderType()==OP_SELL){
           irvb=OrderClose(OrderTicket(),0.01,Ask,3,CLR_NONE);
           LastTime=iTime(NULL,1,0); countS--; if(countS==0)break;   
          }}}}} 

Ho ricevuto un suggerimento su come fare un contatore sotto forma dicountS .

Dovrebbe chiudere tre operazioni di 0,01 lotti al minuto. Ora, abbiamo una domanda come convertirlo in modo che tutti gli ordini siano calcolati in ordine.

Se impostiamofor(int i=OrdersTotal()-1; i>=0; i--){ gli ultimi ordini saranno contati in ordine,

Se for(int p=0; p<OrdersTotal(); p++){ allora vai dal primo a un ordine.

Il contatore funziona, ma quando la dimensione del lotto è 0,15, per esempio, non chiude 0,03 lotti e chiude 0,01 lotti ogni minuto.

Cosa consiglieresti di aggiungere?

Come faccio a rendere possibile la chiusura di una parte del lotto totale indipendentemente dal numero e dalla dimensione del lotto degli ordini?
 
Rustam Bikbulatov:


Un suggerimento su come fare un contatorecountS .

Ci dovrebbero essere tre scambi di 0,01 lotti chiusi al minuto. Ora ho una domanda come convertirlo in modo che tutti gli ordini siano contati in ordine.

Se impostiamofor(int i=OrdersTotal()-1; i>=0; i--){ gli ultimi ordini saranno contati in ordine,

Se for(int p=0; p<OrdersTotal(); p++){ allora vai dal primo a un ordine.

Il contatore funziona, ma quando la dimensione del lotto per esempio è 0,15 non chiude 0,03 lotti, chiude 0,01 lotti ogni minuto.

Cosa consiglieresti di aggiungere?

Come faccio a rendere possibile la chiusura di una parte del lotto totale indipendentemente dal numero e dalla dimensione del lotto degli ordini?

Quando si imposta questo problema (molto strano, tra l'altro), è necessario lavorare con la lista della "Storia dell'account". Ad ogni nuova iterazione, dovremmo passare attraverso questa lista e trovare gli ordini che sono stati chiusi durante il minuto corrente e sommare il loro volume. Se non c'è abbastanza volume, allora ordinate come necessario (non chiedete come, dipende da voi) e prendete un solo ordine. Chiudetelo a 0,01. Alla prossima iterazione, ricominciate.

 
Ihor Herasko:

Quando si imposta un compito del genere (molto strano, tra l'altro), bisogna lavorare con la lista "Storia dell'account". Ad ogni nuova iterazione devi passare attraverso questa lista e trovare gli ordini che sono stati chiusi durante il minuto corrente, sommando il loro volume. Se non c'è abbastanza volume, allora ordinate come necessario (non chiedete come, dipende da voi) e prendete un solo ordine. Per chiuderlo a 0,01. Alla prossima iterazione tutto da capo.

Ci proverò! Grazie

 
harbor:
non può configurare l'invio di posta dal terminale
Non riesco a farlo funzionare con myl.ru ma ora l'ho configurato allo stesso modo e non invia il messaggio di prova.
Qualcuno se n'è occupato?

se per te stesso (non per la vendita) allora il trattamento giusto per i problemi di posta è :

1) ottenere un mailer su localhost per gestire l'inoltro, garantire la consegna e non scherzare con l'autorizzazione e la protezione anti-spam. Altrimenti gli EA finiranno molto rapidamente su ogni sorta di lista nera.
Questo non è difficile - c'è un win smtp integrato e gratuito con semplici impostazioni, in un pizzico si può scrivere da soli :-)

2) Utilizzare un'alternativa a SendMail() . Per controllare l'intero processo, per inviare rapporti più intelligenti, con tag, bandiere, opzionalmente in html e con immagini.

Quando combini 1+2 ottieni un totale di 3 :-) quindi è una soluzione sensata e stabile.

di più sull'invio di posta : https://www.mql5.com/ru/blogs/post/718364

-----

Se hai bisogno di aiuto su specifiche di SendMail e sulla configurazione di MT, allora allega screenshot, estratti di codice sorgente, diagnostica degli errori...
Quindi non è solo un "colpo sotterraneo"

TradeBiff - отправка почты со скриншотами
TradeBiff - отправка почты со скриншотами
  • 2018.05.19
  • Maxim Kuznetsov
  • www.mql5.com
Очень важно получать детальные оповещения о действиях любого робота. Универсальный способ оповещений - это отправка почты. TradeBiff будет следить за изменениями и отправлять вам необходимые отчёты. Таким образом у вас в почтовом ящике получится хороший торговый журнал. Постановка задачи Ставим себя на место заказчика и формулируем задачу...
 
Ho capito bene che"TimeCurrent()" restituirà il tempo dell'ultimo tick quando viene chiamato da una funzione utente?
 
Asa saas:
Ho capito bene che "TimeCurrent()" restituirà il tempo dell'ultimo tick quando viene chiamato da una funzione utente?

 

Saluti!


Si può accedere a un ordine con il comandoOrderSelect tramite il suo numero.

Domanda, è possibile conoscere in anticipo i numeri degli ordini esistenti, per non passarli tutti? Per esempio, possiamo memorizzare questo numero quando apriamo un nuovo ordine.

Capisco che questo numero è assegnato in ordine a partire da 1. Quali sono le possibili sfumature?

Grazie mille.

 
Decromor:

Saluti!


Si può accedere a un ordine con il comando OrderSelect tramite il suo numero.

Domanda, è possibile conoscere in anticipo i numeri degli ordini esistenti, per non passarli tutti? Per esempio, possiamo memorizzare questo numero quando apriamo un nuovo ordine.

Capisco che questo numero è assegnato in ordine a partire da 1. Quali sono le possibili sfumature?

Grazie mille.

OrderSend
OrderSelect

 

Mi si è rotto il cervello, aiuto per favore!

Ho scritto un'unità di calcolo di correlazione. Ma OANDA e investing.com danno risultati completamente diversi! È divertente - non si abbinano nemmeno tra loro!

Dove mi sbaglio?


La coppia di valute corrente - EURUSD, controllo la correlazione con GBPUSD.


extern string SubSymbol = "GBPUSD";

extern int correlation_time = 24; // quante ore per controllare la correlazione delle coppie di valute selezionate

.....

// ------------------------ blocco di calcolo della correlazione --------------------------------------

int periodo = 15;

int bars_number = MathRound(correlation_time*60/period);

doppio symbol_avg = 0;

doppio symbol_avg = 0;

doppio symbol_price[], doppio subsymbol_price[];

doppio x,y;

int j;

int shift = 0;

ArrayResize(symbol_price, bars_number);

ArrayResize(subsymbol_price, bars_number);

per (j=0; j < numero di barre; j++)

{

symbol_price[j] = (iHigh(NULL,period,j+shift) - iLow(NULL,period,j+shift))/2;

subsymbol_price[j] = (iHigh(SubSymbol,period,j+shift) - iLow(SubSymbol,period,j+shift))/2;

symbol_avg = symbol_avg + symbol_price[j];

subsymbol_avg = subsymbol_avg + subsymbol_price[j];

}

symbol_avg = symbol_avg/bars_number;

subsymbol_avg = subsymbol_avg/bars_number;

doppio ss_xx = 0;

doppio ss_xy = 0;

doppio ss_yy = 0;

per (j=0; j < numero di barre; j++)

{

x = symbol_price[j] - symbol_avg;

y = subsymbol_price[j] - subsymbol_avg;

ss_xy = ss_xy + x*y;

ss_xx = ss_xx + x*x;

ss_yyy = ss_yy + y*y;

}

doppia correlazione = ss_xy/MathSqrt(ss_xx*ss_yy);

Alert(correlazione, " ", numero di barre);

ArrayFree(symbol_price);

ArrayFree(subsymbol_price);

// ------------------------ fine del blocco di calcolo della correlazione ---------------------------------

Motivazione: