Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 411

 
Leanid Aladzyeu:

Ha iniziato a studiare gli array.

Ho scritto una funzione pro-ordine con array, 3 array = 0 acquisto, 1= vendita, 2= totale delle compravendite.

Poi ho scritto una condizione per comprare se ( la prima condizione && array [0] == 0 )allora apriamo un acquisto

e in vendita se ( la prima condizione && array [1]== 0) allora apriamo una posizione Sell.

Ma il tester lancia un errore e il test si ferma, qual è il problema? ( errore " uscita di matrice " )

Significa che l'indice a cui vi state rivolgendo è al di fuori del layout dell'array. Per esempio, se array[ 3 ]; potete indirizzare solo gli elementi da 0 a 2. Controlla il tuo codice.

Un'altra possibilità è che non avete partizionato l'array (con ArrayResize()), ma state cercando di accedere ad alcuni dei suoi elementi.

 
codice...
void Oher(int Mag,string Symb, int &mas[2])
{
ArrayInitialize( mas,0);

int tip;
int ticket3 =-1;
  for (int pos=OrdersTotal()-1; pos>=0; pos--)
     {
     if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
          switch(tip)
              {
              case 0:mas[0]++; mas [2]++;break;// 0 покупка
              case 1:mas[1]++; mas [2]++;break;// 1 продажа
              }
          }
          continue;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu:
codice...
Cercate di capirlo da soli, il tester dovrebbe indicare in quale linea e posizione nella linea si è verificato l'errore.
 
Tapochun:
Cercate di capirlo da soli, il tester dovrebbe indicare in quale linea e posizione nella linea si è verificato l'errore.

o_oops non sapevo che il terminale punge anche dove è l'errore, la prima volta ho colpito un errore critico.

   case 1:mas[1]++; mas [2]++;break;// 1 продажа

Ci sputa sopra.

 
Risolto. era un totale di 2 array e avevo bisogno di 3. nell'inizializzazione dell'array e nella funzione il numero fatto +1. e ha funzionato)
 

Si prega di consigliare come verificare il funzionamento dell'indicatore.

L'idea è la seguente: quando l'EA forma una nuova barra chiama l'indicatore, ma l'indicatore non ha dati in questo momento e ottengo i dati della barra precedente (non ha avuto il tempo di calcolare).

Come evitare questo problema. Inoltre, tutto è a posto nello Strategy Tester. Io ottengo o bene o per niente sulla demo!

Questo è tutto, non è rilevante. Risolto.

 

Ciao, ho un problema da principiante...

Non riesco a fare in modo che il sistema confronti il valore di chiusura dell'ultima barra con i massimi e i minimi di un certo periodo, per esempio

ultime 20 battute. Cosa sto facendo di sbagliato?

extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55)
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Ho controllato con Alert e per qualche ragione sconosciuta il tester dà il valore massimo dal calcolo dall'ultimo tick, ma dà questo valore

È lo stesso numero di volte dei tick, quindi l'ordine non si apre.


Il secondo problema è come fare in modo che il mio EA aspetti fino all'apertura della prossima barra (periodo di 30m)? Quando faccio il test usando i punti di controllo tutto va bene, ma se uso i tick,

poi l'EA si apre nella stessa barra subito dopo aver chiuso allo stop loss...


Inoltre, come posso chiudere un ordine, indipendentemente dal fatto che sia stato un tick o meno? Per esempio, su un periodo di 30m voglio chiudere l'ordine 5 secondi prima della fine della barra (29.55, 59.55)

In base a tutti i dati di quel momento. A questo punto il problema è che se un tick non si verifica entro 5 secondi, quindi nessun

(In teoria questa è una stronzata, ma in realtà il prossimo tick potrebbe apparire in qualche candela per qualche motivo.

può risultare in qualche candela per qualche motivo.


Grazie in anticipo!
 

Aiuto con i commenti. Su ogni barra vengono generati dei commenti. Ad ogni spunta voglio aggiungere altro testo al commento esistente.

Chiamo il codice:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Aggiunge un nuovo commento e ad ogni spunta in una nuova linea e il testo scorre verso il basso.

Come fare in modo che cancelli le ultime righe prima dell'output?

 
ForTorg ZEVs:

Aiuto con i commenti. Su ogni barra vengono generati dei commenti. Ad ogni spunta voglio aggiungere altro testo al commento esistente.

Chiamo il codice:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Aggiunge un nuovo commento e ad ogni spunta in una nuova linea e il testo scorre verso il basso.

Come fare in modo che cancelli le ultime righe prima dell'output?

Mi sembra che si possa sostituire completamente solo Comment()

E di conseguenza, per cambiare una parte del commento su ogni tick, bisogna cambiare completamente il commento su ogni tick.

 
ForTorg ZEVs:

Aiuto con i commenti. Su ogni barra vengono generati dei commenti. Ad ogni spunta voglio aggiungere altro testo al commento esistente.

Chiamo il codice:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Aggiunge un nuovo commento e ad ogni spunta in una nuova linea e il testo scorre verso il basso.

Come fare in modo che cancelli le ultime righe prima dell'output?

Quindi hai un carattere di controllo "\n" nel tuo commento - è un carattere di avanzamento linea. Se lo rimuovi, non ci saranno più linee.