[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 627

 
chief2000:

Ho sostituito "return(0)" con "return", ma questo non ha risolto il "problema" - dopo l'ottimizzazione si vedono ancora gli stessi risultati 0-zero. C'è qualche soluzione per non emettere zeri durante l'ottimizzazione?

Grazie!


Non so se lo fai o no, te lo dico per sicurezza, spunta la casella "Ignora i risultati inutili".

I risultati meno (per equilibrio) saranno eliminati, non sono sicuro degli zeri, ma fate una prova.

 
Mi chiedo come ottenere un numero 'casuale' entro, diciamo, 15 +/- 7 su ogni nuovo tick, in modo che sia generato casualmente entro i limiti dati ...
 

Come questo:

int random(){
   MathSrand(TimeLocal());
   while(true){
      int x = MathRand();
      if(x >= 8 && x <= 22)return(x);
   }
}

:)

 
ToLik_SRGV:

Come questo:

:)

Grazie!!! ;)
 
ToLik_SRGV:

Non so se lo sai o no, ma nel caso, spunta la casella "Salta risultati inutili".

I risultati negativi (per equilibrio) saranno filtrati, non sono sicuro di quelli nulli, ma dovreste provare.

Il fatto è che voglio vedere i risultati nulli - nelle prime fasi dell'ottimizzazione devo spesso selezionare i migliori tra i risultati nulli (e nelle fasi successive è utile guardarli e confrontarli). Gli zeri sono d'intralcio perché questi stessi risultati non hanno senso e ce ne sono troppi - la dimensione dei file memorizzati diventa più grande e impedisce visivamente la visualizzazione dei risultati. Grazie comunque!

 
granit77:

Se intendete le variabili esterne MA_Fast_Period e MA_Slow_Period, c'è una soluzione. Se le variabili sono calcolate nell'Expert Advisor, allora non c'è niente da fare.

È tardi, la mia testa non funziona più... ma sembra un'ottima idea! Grazie!

 
artmedia70:
Mi chiedo come ottenere un numero "casuale" entro, diciamo, 15 +/- 7 su ogni nuovo tick, in modo che sia generato casualmente entro i limiti dati ...
http://prolang.ru/index.php/cpp/cpptheory/3-clang-random.html

Per ottenere numeri reali casuali con distribuzione uniforme nell'intervallo [a,b], usare la formula

x = rand()*(b-a)/RAND_MAX + a;

Per mql, nella descrizione della funzione MathRand(), è scritto: La funzione restituisce un numero intero pseudorandom nell'intervallo da 0 a 32767

cioè per mql RAND_MAX = 32767

 

Ho iniziato a imparare mq4, e ho subito incontrato alcuni momenti oscuri.

Mi sono messo alla prova, per così dire. Ho scritto un semplice Expert Advisor su Ma. Ma non vuole commerciare nemmeno sulla storia. Non mostra alcun errore.

Puoi dirmi dove ho sbagliato?

int start()
  {
   //---проверим возможность входа в позицию
   bool flagchange = false;
   int Slippage = 3;
   int i = 0;
   double lt = getLots() ; // минимальный лот
   RefreshRates();
   int total = OrdersTotal();   
   int ticket = -1;
   for (;;)
      {
      int flag= GetEma();
       if (flagchange != flag) // проверим, сигнал ема изменился? если да, то можно открыть или закрыть поз.
       flagchange = true;      // изменился!
       else flagchange = false;
        if (flagchange == True)
        {       
           int Total=OrdersTotal(); //проверим есть открытые позиции?
           if(Total>0)
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) // если а то закрываем
        {
           if(OrderType()==OP_BUY || OrderType()==OP_SELL) // Только Buy и Sell
           {
              if(OrderType()==OP_BUY) 
              bool Result=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE);
              else
              Result=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE);
              if(Result!=true) 
              { 
              Print("LastError = ",GetLastError()); 
              }
           }
        }
        else // если открытых нет, то окрываем.
         if (flag ==1) OrderSend(Symbol(),OP_BUY,lt,Ask,Slippage,Bid - sl * Point,0,"Buy",888,0,Blue);
         else OrderSend(Symbol(),OP_SELL,lt,Bid,Slippage,Ask + sl * Point,0,"Seel",888,0,Red);
        {
        }
     }
  }                                             
      }
 }      
//----
   return(0);
  }
      //////////////////////////////////////////////////////
  int GetEma() {
  //----Получим значение EMA1
      int ma1= iMA(Symbol(),PERIOD_H1,ema1,0,1,6,0);
  //----Получим значение EMA2   
      int ma2= iMA("",PERIOD_H1,ema2,0,1,6,0); 
      if (ma1>ma2) return (1);
      else return (0);}
   /////////////////////////////////////////////////////  
         // посчитаем разтер лота
   double getLots() 
        {
                double minlot = MarketInfo(Symbol(), MODE_MINLOT);
                 int round = MathAbs(MathLog(minlot) / MathLog(10.0)) + 0.5;
                 double lot = minlot;
//---- select lot size
                 lot = NormalizeDouble(AccountFreeMargin() * Risk / 1000.0, round);
                 if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) 
                        {
                                lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), round);
                        }
                 if(lot < minlot) lot = minlot;
                 double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
                 if(lot > maxlot) lot = maxlot;
//---- return lot size
   return(lot);
        } 
 


bool flagchange = false;
int Slippage = 3;
int i = 0;
double lt = getLots() ; // lotto minimo
RefreshRates();
int total = OrdersTotal();
int ticket = -1;
for (;;)
{
int flag= GetEma();
if (flagchange != flag)

l'istruzione for senza il parametro? - il punto? i loop eterni non sono scritti in quel modo, e il secondo è che ci sono variabili globali per l'EA - non per il terminale, sono descritte all'inizio del codice prima di tutte le funzioni e anche della funzione start(), come hai scritto - ad ogni tick chiami la funzione start(), flagchange = false; e poi cerchi di confrontare questa bandiera con lo stato precedente, ma il suo stato sarà sempre falso

Se stai appena iniziando a provare le tue forze - prendi un qualsiasi Expert Advisor pronto da Kodobase e cambia le condizioni per entrare nel mercato con le tue - sarà più veloce.


 
MarkTrade:

Ho iniziato a imparare mq4, e ho subito incontrato alcuni momenti oscuri.

Mi sono messo alla prova, per così dire. Ho scritto un semplice Expert Advisor su Ma. Ma non vuole commerciare nemmeno sulla storia. Non mostra alcun errore.

Puoi dirmi dove ho sbagliato?


Qual è lo scopo del looping dell'EA?

for (;;) {


}
Motivazione: