Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 85

 
deathmond1990:
Salve. La domanda è: possiamo caricare i valori dei tick (i prezzi corrispondenti) per un certo periodo di trading (cioè, per una singola candela) in un array unidimensionale? E farlo in modo tale che la matrice si formi durante la formazione di una candela. È realistico in MQL4? Apprezzerei il vostro feedback.


È reale. Una serie dinamica e via.

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


Realisticamente. Un array dinamico e via.

Grazie mille =)
 
Saluti signori! Non voglio che questo sia un diluvio, ma non posso fare a meno di questa funzione. Allora ragazzi, qualcuno può aiutarmi con questa funzione che passa attraverso tutti gli ordini e cancella due ordini allo stesso tempo, quello con il lotto più piccolo e profitto negativo, e quello con il lotto più grande e profitto positivo.
 
Arseniy Barudkin:
Saluti signori! Non voglio che questo suoni come un allagamento, ma non posso fare a meno di questa funzione. Allora ragazzi, qualcuno può aiutarmi con questa funzione che passa attraverso tutti gli ordini e cancella due ordini allo stesso tempo, quello con il lotto più piccolo e profitto negativo, e quello con il lotto più grande e profitto positivo, anche dagli ordini esistenti.

Prova a cercareOrderCloseBy
 

Come fare in modo che i dati di tutte le variabili globali siano salvati anche dopo la chiusura del terminale in modalità normale e anormale?

La domanda riguarda le variabili dichiarate all'inizio del codice come questa:

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

Ho bisogno di non perdere i valori di VAR1 e VAR2 (l'array è riempito di dati durante il funzionamento di Expert Advisor). Finora, l'unica idea è quella di scrivere dati in un file (global.txt) ad ogni tick e poi, quando il terminale viene lanciato, leggere dal file (global.txt) e ricreare le variabili e poi scriverle di nuovo ad ogni tick. Quali altre opzioni ci sono?

 
smart_man:

Come assicurarsi che i dati di tutte le variabili globali siano conservati anche dopo la chiusura del terminale client in modalità normale e anormale?

La domanda riguarda le variabili dichiarate in questo modo:

extern double  VAR1 = 1;

double VAR2[1000];

Ho bisogno di non perdere i valori di VAR1 e VAR2 (l'array è riempito di dati durante il funzionamento di Expert Advisor). Finora, l'unica idea è quella di scrivere dati in un file (global.txt) ad ogni tick e poi, quando il terminale viene lanciato, leggere dal file (global.txt) e ricreare le variabili e poi scriverle di nuovo ad ogni tick. Quali altre opzioni ci sono?

Opzione

Variabili globali del terminale client

//--------

Da non confondere con le variabili dichiarate globalmente

 
fxtz:

Domanda Posso scrivere un programma in Metatrader 4 per aprire da 2 a 250 posizioni di mia scelta con uno stoploss impostato e un profitto impostato in un clic? Non ho bisogno di aprirne uno manualmente


Hai trovato una società di brokeraggio dove puoi aprire così tanti ordini per uno strumento? Di solito 100 ordini è un limite per tutti gli strumenti...

E sì, potrei aprirne 100.

 
Alekseu Fedotov:

Prova a cercareOrderCloseBy

Grazie! Ma devo selezionare i biglietti di questi ordini tra almeno 3 ordini, spesso ce ne sono di più da 5 a 10 ordini, devo calcolare e confrontare i lotti e i profitti di questi ordini separatamente?

 
Arseniy Barudkin: Dobbiamo selezionare i ticker degli ordini, quindi perché dovremmo calcolare e confrontare i lotti e i profitti di questi ordini separatamente?

La situazione è molto peggiore di quanto immagini. Solo un ordine, selezionato da OrderSelect(), è disponibile in qualsiasi momento. E quando si seleziona il primo ordine, con cosa lo si deve confrontare? I ragazzi intelligenti fanno davvero qualcosa del genere

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
Poi guardate il valore dei biglietti trovati - improvvisamente sono zero!!!
 
STARIJ:

La situazione è molto peggiore di quanto immagini. Solo un ordine, selezionato da OrderSelect(), è disponibile in qualsiasi momento. E quando si seleziona il primo ordine, con cosa lo si deve confrontare? I ragazzi intelligenti fanno davvero qualcosa del genere

Poi guardate il valore dei biglietti trovati - improvvisamente sono zero!!!

Grazie per l'aiuto! Finora l'ho lasciato così, ora ho deciso di cambiare un po' le condizioni in cui viene chiamata la funzione. E in generale, mi avete aiutato molto))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}