Errori, bug, domande - pagina 33

 
Urain:

Questoè un suggerimento degno di nota,

Anche se dal punto di vista della logica ordinaria è come grattarsi l'orecchio sinistro con la mano destra (ma questo non dipende da te, dipende dagli sviluppatori),

perché la possibilità di chiamare i dati di uno strumento non nativo?

se è ancora necessario creare indicatori personalizzati e chiamarli da un simbolo richiesto, in generale, la conclusione è pensare testa compro.

La possibilità di una tale chiamata è necessaria, gli sviluppatori sicuramente non potevano supporre un tale approccio quando hanno scritto gli indici.

Intendo l'indicazione dello strumento nei parametri dell'indicatore dell'utente (e non nei parametri iCustom() come dovrebbe essere secondo loro).


PS

La priorità al lavoro con iCustom() sembra essere stata data inizialmente al trading meccanico che infatti presuppone che alcuni momenti saranno considerati e alcune azioni saranno eseguite nell'Expert Advisor e solo allora iCustom() sarà chiamato per l'indicatore personalizzato.

Altrimenti tutto il lavoro e la responsabilità ricadono sul programmatore che implementa il codice dell'indyke (che può portare a errori e conseguenze fatali, perché un indyke troppo fantasioso può portare alla frenata o al crash dell'intero sistema).

 
Urain:

Suggerimento degno di attenzione,

Anche se, ancora una volta, chiamo l'indicatore pronto per EUR con dati su JPY (per esempio, la storia di yen non è sufficiente)

Non ho dati per questa lunghezza e cosa mi dirà?

È molto più facile gestire gli errori e i colli di bottiglia nello strumento nativo, e il controllo preliminare e il controllo finale sono fatti prima e dopo la chiamata nell'Expert Advisor o nell'indicatore che richiede i dati.

Suppongo che ci sia un secondo modo, che è fondamentalmente sbagliato dal mio punto di vista. Secondo la sua logica è necessario creare una o più funzioni nell'indicatore (chiamate dalla calcolatrice), calcolare tutto ciò che serve in esse e restituire il risultato alla calcolatrice.

PS

Ma ecco il punto: si può calcolare il numero di barre su un simbolo arbitrario. Ma che dire di altre cose?

 
Prival:

Bug. Descrizione. ATS sempre a mercato (rollover del doppio lotto 0,2).

Modalità di prova tutte le zecche. Tutto è normale.

modalità di test, aprendo i prezzi. lo stesso pezzo.

Per qualche motivo si divide in 2 trade. forse è solo il modo in cui viene visualizzato, ma non è giusto. non dovrebbe essere così.

Riordinate i comandi di apertura con quelli di chiusura. Dovrebbe essere in questo ordine

- chiudere le posizioni

- modificare le posizioni

- posizioni aperte

Allora le tue posizioni di chiusura e di apertura saranno sulla stessa barra.

 
gpwr:

Riordinate i comandi di apertura con quelli di chiusura. L'ordine dovrebbe essere il seguente

- chiudere le posizioni

- modificare le posizioni

- posizioni aperte

Allora la chiusura e l'apertura saranno sulla stessa barra.

Se il mercato è comprare 0,1, apro una vendita 0,2. Il risultato di questa operazione dovrebbe essere 0,1,1 in una transazione, non due.

Credo che gli sviluppatori abbiano capito quello che stavo dicendo.

 

Ho scritto questo codice

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

Sembra funzionare bene, ma se tiene conto di tutto non lo so.
Se è così, ecco una variante per voi.
Se non è corretto, per favore correggetelo.

 

Ora ho una domanda.

Perché l'indicatore viene chiamato dall'Expert Advisor, il valore non coincide con l'indicatore.

Cioè l'indicatore ha 1,5123 e l'EA ottiene 1,5117

Ho cercato di usarlo perché non so come leggerlo e non voglio perderlo.

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

e immagine

E il primo buffer, lo strumento su cui gira, coincide.

File:
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

Ora ho una domanda.

Perché l'indicatore viene chiamato dall'Expert Advisor, il valore non coincide con l'indicatore.

Cioè l'indicatore ha 1,5123 e l'EA ottiene 1,5117

Ecco il codice di EA, inoltre è duplicato nell'allegato.

E si guarda il valore precedente dell'indicatore. Ho il sospetto che sia esattamente 1,5117. Prende l'attuale (ultimo) valore per indice 1. Oppure assegnare gli array SetAsSeries(bufX,true)
 
stringo:
E si guarda il valore dell'indicatore precedente.
1,512380 - attuale 1,512310 - precedente
 
ddd06:

Ho scritto questo codice

Sembra funzionare bene, ma se tiene conto di tutto non lo so.
Se è così, ecco una variante per voi.
Se non è corretto, per favore correggetelo.

Sì, la mia versione rielaborata ha anche un controllo per la lunghezza dell'array, ma mi sono perso nelle direzioni della serie, come al solito,

ed è risultato che il disegno è andato avanti, ma poiché la lunghezza dell'array è inferiore alla lunghezza del grafico, il disegno è andato dalla fine al centro (o giù di lì),

Ecco perché ho avuto l'impressione che non ci fosse il rendering.

In generale, ho il sospetto che ci sarà confusione in questo posto per molto tempo,

perché lo stesso problema era con i visitatori di mql4.com e ora stanno scaricando qui.

 
Urain:

Proprio così.

È fantastico. Il codice è semplice e locale, quindi potete usarlo come base.

Domanda su EA - devo scrivere al Service Desk?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.