Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 115

 

Ragazzi, ecco una domanda: come faccio a mettere valori variabili in un array unidimensionale?

Non mandarlo in aiuto - lì non c'è nessun esempio per un problema del genere.


Diciamo che c'è una variabile a, che cambia in certe condizioni.

Voglio un array per memorizzare gli ultimi 3 valori di questa variabile. Come è implementato questo in mql4?


Sto scrivendo int mas[3];

mas[]=a; all'interno del ciclo, dopo una condizione che cambia a,

Il compilatore dà fuori ']', ma non funziona nulla, anche se logicamente dovrebbe. - Vuole che metta qualche espressione sconosciuta dentro le parentesi in mas[]=a.

MQL4 ha qualche funzione che riempie l'array con un valore variabile ad ogni iterazione del ciclo?


 
Igor Makanu:

Mi scuso per non aver trovato l'inizio della corrispondenza, ma vorrei consigliare immediatamente di evitare condizioni e calcoli complessi al loro interno - questo rende il codice illeggibile e di conseguenza complica la ricerca di errori logici, io scriverei il tuo codice così:

Se capisci quello che voglio dire, puoi modificare il codice che ti ho dato un po' di più, voglio dire di metterlo in una condizione separataif(OrderType()==OP_BUY....

Allora sarà molto più facile trovare errori logici, imho

Inserire dopo ogni OrderSend => ritorno

o fare una selezione tramite l'interruttore :

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

Provando questo e non funziona.

hai pochi parametri di input nella chiamata del tuo indicatore personalizzato - conta quantevariabili esterne nell'indicatoreMorning Flat? (extern) - questo è il numero di parametri che dovreste passare quando usate iCustom

 
John Smith:
.....

Scrivo int mas[3]=a; all'interno del ciclo dopo la condizione quando a cambia,

ma non funziona nulla, anche se logicamente dovrebbe.

Imparate a fare tutte le azioni passo dopo passo piuttosto che tutte insieme.

Esempio :

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

hai pochi parametri di input nella chiamata del tuo indicatore personalizzato - conta quantevariabili esterne nell'indicatoreMorning Flat? (extern) - questo è il numero di parametri che dovreste passare quando usate iCustom

Li ho già provati tutti.

Ho risolto in un altro modo. Ho inserito il codice di calcolo del prezzo dell'indicatore nel mio Expert Advisor.

 
Igor Makanu:

La logica del codice è la stessa, ma se si dividono le condizioni, è più veloce trovare dove si trova l'errore logico, e nel tuo caso, se lo metti in una condizione separata, ottieni l'ottimizzazione - la condizione sarà controllata una volta e non 4 volte:

in una condizione separata, otteniamo un'ottimizzazione del codice - la condizione sarà controllata una volta e non 4 volte come nel tuo esempio.

Controllate l'output nel diario dell'Expert Advisor usando il comando

per la registrazione in modo da poter vedere quale frammento di codice è stato eseguito e con quali parametri

Grazie per la vostra risposta. Dividere le condizioni al limite. Controllato la logica con i commenti. Si è scoperto che la chiusura della posizione si basa sulle condizioni della prima posizione aperta. Significa che se prima abbiamo aperto una posizione Buy o Sell con la Condizione 1 e poi una seconda posizione aperta con la stessa condizione ma con la Condizione 2, questa condizione di chiusura viene ignorata e anche la seconda posizione viene chiusa con la Condizione 1 indipendentemente dall'altro numero magico. Cosa devo fare?

 
Vladimir Tkach:

Li ho già esaminati tutti.

Ho risolto il problema in un modo diverso. Ho incollato il codice del calcolo del prezzo dall'indicatore a Expert Advisor.

Ho notato che iCustom() non è stato chiamato correttamente, dovrebbe essere così:

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

Io passo 7 parametri quando chiamo l'indicatore, tu l'hai chiamato con 3 parametri

Lascerei la chiamata dell'indicatore, ma modificherei l'indicatore stesso - rimuoverei le variabili esterne e gli oggetti grafici dal codice dell'indicatore


novichok2018:

Ho controllato la logica con i commenti. Si è scoperto che le posizioni vengono chiuse in base alle condizioni della prima posizione aperta.

Congratulazioni! Sei sulla strada giusta, ma è meglio in fase di debug stamparlo nel diario (Print()) invece che nel commento ( Commetn())

Mostrami il codice.

 
Igor Makanu:

Allora, ho notato che non hai chiamato correttamente iCustom(), dovrebbe essere così:

Io passo 7 parametri quando chiamo l'indicatore, e tu l'hai chiamato con 3 parametri

Lascerei la chiamata dell'indicatore, ma modificherei l'indicatore stesso - rimuoverei le variabili esterne e gli oggetti grafici dal codice dell'indicatore


congratulazioni! Sei sulla strada giusta, ma è meglio, in fase di debug, fare l'output nel giornale (Print()) invece che nel commento (Commetn())

mostrare il codice.

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

Ho rimosso le impronte.

 
novichok2018:

Ho rimosso le impronte.

Non conosco tutta la logica del tuo codice, ma dopo ogni chiusura dell'ordine devi sicuramente uscire dal ciclo tramite break; e al prossimo tick devi controllare nuovamente gli ordini sulle tue condizioni - non so come si comportaOrderSelect() dopo che l'ordine è chiuso - se l'ordine è chiuso, allora cosa viene selezionato, o ci sarà un errore?

Fondamentalmente, il vostro problema è che volete controllare e chiudere tutto in una volta in un solo ciclo.

interruttore()

o fare una funzione per chiudere l'ordine (ci sono funzioni già pronte per gli ordini https://www.mql5.com/ru/forum/131859/page2#434206 )

o usare la pausa dopo che l'ordine è chiuso nel vostro codice

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

Non conosco tutta la logica del tuo codice, ma dopo ogni chiusura di un ordine, devi sicuramente uscire dal ciclo tramite break; e al prossimo tick devi controllare di nuovo le tue condizioni - non so come si comportaOrderSelect() dopo che l'ordine è chiuso - se l'ordine è chiuso, allora cosa viene selezionato, o un errore?

Fondamentalmente, il vostro problema è che volete controllare e chiudere tutto in una volta in un solo ciclo.

interruttore()

o fare una funzione per chiudere l'ordine (ci sono funzioni già pronte per gli ordini https://www.mql5.com/ru/forum/107476 )

o usa la pausa dopo che l'ordine è chiuso nel tuo codice

Grazie. La rottura sembra aver aiutato. Vedremo cosa succederà dopo.

Motivazione: