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

 

Come faccio a svuotare i valori alti e bassi dell'indicatore? Per esempio, se imposto un massimo di 100 e un minimo di 0, e poi ho bisogno che l'indicatore visualizzi tutto, come lo organizzo? La questione è che scrivo un indicatore con diverse modalità, una delle quali utilizza max e min, ma dopo aver cambiato la modalità nei parametri di input il max rimane 100, così come il min 0


MQL5

 
Alekseu Fedotov:

Avete già chiamato e passato il valore restituito daDeviation(Kanal) alla funzioneEnvelopes(........)

e nella funzioneEnvelopes(........) stessa, si dichiara l'ultimo parametro, che prenderà questo valore


come questo

Grazie, ora ha più senso.

 

Leggermente modificato il codice per MT5 secondo i vostri consigli, è venuto fuori così:

input  string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

input  ENUM_TIMEFRAMES   Time_Frames    = PERIOD_M5;             // Временной период
       int                Ma_Period     = 120;                   // Период
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes(int buff, double _Deviation)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if(handle<0)
   {
    Print("Failed to create handle iEnvelopes, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator iEnvelopes, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Solo che ora non capisco perché ad ogni tick il primo valore calcolato viene scritto ovunque.

Calcoli

Puoi dirmi come risolvere il problema?
 
Alexander Layzerevich:

Leggermente modificato il codice per MT5 secondo i vostri consigli, è venuto fuori così:

Solo che ora non capisco perché ad ogni tick un valore calcolato viene scritto ovunque.

//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------

È immediatamente evidente. Anche senza essere evidenziato.

 
Artyom Trishkin:

Cattura immediatamente l'attenzione. Anche senza l'evidenziazione.

Grazie.

 

Tutte le domande dei neofiti su MQL4, aiuto e discussione su algoritmi e codici

WinProject, 2019.05.07 18:38

Potete dirmi perché lo stesso codice funziona in MT4 ma non funziona in MT5? In MT5 la variabile strNum è sempre =1, ma in MT4 il contatore ++ funziona come dovrebbe e strNum = il numero di righe del file.

int strNum;
void OnStart()
  {
 FileNum();
 Alert1();
  } 

  void FileNum()
{
      int handle=FileOpen("File.csv",FILE_CSV|FILE_READ,';');
      strNum=0; 
      while(!FileIsEnding(handle))
{
      FileReadString(handle);
      strNum++;
      if(FileIsEnding(handle)==true)
      break;
}
      FileClose(handle);
}

      void Alert1()
{
      Alert (strNum);
}

Mi sto rispondendo da solo, può essere utile per coloro che non hanno un ciclo in MT5 quando si apre o si legge un file in un array o una struttura. In MT5, a differenza di MT4, quando si legge un file .csv, è necessarioimpostare ancheil flag di apertura del file FILE_ANSI.

Cioè, in MT5 la linea dovrebbe apparire così:

int handle=FileOpen("File.csv",FILE_READ|FILE_ANSI|FILE_CSV,";");

Perché, non lo so, forse qualcuno lo sa?

 
Se il log dell'EA mostra una notifica in questo formato - uninit reason 3 (la notifica è dovuta al cambio della TM), ma il robot non viene rimosso dal grafico, i valori delle variabili e tutti i calcoli che sono stati ricevuti vengono conservati?
 

Ottengo "OrderSend error 130" per una ragione sconosciuta, il programma è in esecuzione in strategy tester sul conto demo, quindi non ci può essere alcuna restrizione da parte del broker per quanto ho capito, Stops Level = 30. Ottengo questo errore a intervalli regolari durante i test e lo stop è fissato in percentuale dell'ATR per tutti i trade, ma alcuni ordini vengono piazzati con successo mentre altri no.

      Print("!!!long level = ", level, ", stop = ", NormalizeDouble(level - stop, Digits));
      if(Bid < level) {
         tickets[orders] = OrderSend(symbol, OP_BUYSTOP, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                                                                           
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
      else { 
         tickets[orders] = OrderSend(symbol, OP_BUYLIMIT, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

Ci sono volte in cui un ordine viene rifiutato più volte e poi passa...



 

Come posso pubblicare lo stesso codice in CodeBase per un pubblico di lingue diverse (ad esempio, come posso compilare un modulo nel marketplace per la lingua corrispondente)?


Ho già visto questo in CodeBase, ecco un esempio


Come posso fare lo stesso?

 

Per esempio, quando si diminuisce al limite la dimensione della scala delle candele con il mouse, allora le letture dell'indicatore cambiano, anche se nessuna delle migliaia di candele nel codice dell'indicatore dice nulla sul cambiamento della dimensione delle candele. Per esempio, a ore 4 i volumi in forma ridotta mostrano un valore, ma se si aumenta leggermente la scala delle candele, allora un'altra impostazione sarà considerata come quella corretta.