Errori, bug, domande - pagina 623

 
MetaDriver:
Avrai un brusco risveglio... :))

Probabilmente,

Ho letto l'essenza del problema, non capisco perché ogni indicatore dovrebbe avere un timer, e perché ci sono così tanti indicatori,

se è possibile ottenere le offerte dello strumento richiesto direttamente nel timer EA e metterle nell'assemblea generale,

Se vuoi usare un indicatore, avrai bisogno di molti indicatori, perché la risoluzione sarà buona.

è diverso con le spie - non hanno orologi e gli eventi per tutti gli strumenti possono non accadere per molto tempo, o possono iniziare a ticchettare uno dopo l'altro.

Per esempio, nelle contrattazioni in cui c'è un ultimo prezzo, il dato Bid non è sempre presente, quindi controllate e scrivete o Bid o Last.

 

MetaDriver:

Propongo un compromesso: catturare i tick con le spie e inviarli immediatamente al capo Expert Advisor con un'etichetta al millisecondo (GetTickCount()). Expert Advisor li dispone secondo le loro etichette e li affetta in secondi blocchi.

Non è molto semplice, ma sarà preciso.

Non è una brutta variante. Secondo me, è l'unico che vale la pena prendere come base.

Urain:

A proposito, nelle contrattazioni in cui c'è un ultimo prezzo, il dato Bid non è sempre presente, quindi controlla e scrivi o Bid o Last.

Buon chiarimento, non ho incontrato tale. Bisognerà tenerne conto.
 

MetaDriver:

Предлагаю компромисс: ловишь тики шпионами и сразу отправляешь в головной эксперт, снабдив милисекундной меткой(GetTickCount()). Эксперт их упорядочивает в соответствии с метками и нарезает секундные блоки.

Не очень просто, зато с точностью будет порядок.

Interessante:

Non è una cattiva opzione. A mio parere, l'unico che vale la pena prendere come base.

Buon chiarimento, non mi sono mai imbattuto in questo. Bisognerà tenerne conto.

Potrebbe non essere una cattiva variante, ma il meccanismo di invio dei tick è assente nel terminale. Provate a pensare a 5-10 tick/sec su 16 coppie. Ancora una volta - è già andato)).

E non avete bisogno di una tale precisione - 1sec è sufficiente.

Grazie a tutti voi - il soggetto è finito.

 

Il problema è molto sgradevole a causa della sostituzione di barre di minuti con barre di timeframe superiori nel lontano passato storico, quando lo storico minuto per minuto non era ancora disponibile. L'unica soluzione che mi viene in mente è una complessa conversione di barre false in barre vere, e non può garantire la precisione. Non si tratta tanto di complessità quanto di dubbi sull'accuratezza di tale conversione.

Il compito iniziale è quello di verificare la pertinenza delle Fibonacci Time Zones tracciate. Se la zona è troppo lontana e la larghezza di lavoro di tutte le sue sottozone (fino a 34 larghezze di base per default) è così stretta che il bordo destro non raggiunge il momento presente, non la costruiamo, altrimenti creiamo un oggetto sul grafico. Ho provato a risolvere la cosa in due modi simili, uno dei quali lo cito. L'unica differenza è che nel primo modo, stavo ballando dall'inizio della storia usando

   datetime firstDate=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_FIRSTDATE);
E nel secondo - al contrario (cito questo metodo), l'essenza e i risultati sono assolutamente gli stessi. Testato su NZD/USD.

Se avete una storia falsa che termina in una data diversa dal 2009, come ho fatto io, riorganizzate le due Fibo Time Zone in modo che una di esse passi per quella data di ribaltamento, e la seconda sia già completamente sul lato destro della storia, dove tutte le barre sono reali. In questo caso, non dimenticate di cambiare i valori di startTime1, endTime1 e, se necessario, startTime2, endTime2 nello script; non potete regolare i prezzi - non è importante. Ora puoi testarlo... Il risultato sarà triste: se l'algoritmo di controllo per entrambi i fusi orari rimane invariato, funzionerà correttamente solo per la zona che ha un piede prima della data di svolta e un altro piede dopo, l'algoritmo la filtrerà erroneamente e ci impedirà di costruirla. Notate che entrambe le zone sono abbastanza vicine l'una all'altra e hanno larghezze simili, e queste due larghezze si estendono molto nel futuro e saranno rilevanti per molto tempo, infatti nessuna delle due dovrebbe essere filtrata (commentate le condizioni e vedete che entrambe le timezones sono costruite).

void OnStart()
  {
   datetime startTime1=D'2009.07.08 18:00:00';
   datetime endTime1=D'2009.11.03 12:17:00';
   datetime startTime2=D'2009.06.30 08:00:00';
   datetime endTime2=D'2009.10.21 20:16:00';

   double startPrice1=0.61930;
   double endPrice1=0.70948;
   double startPrice2=0.65470;
   double endPrice2=0.76300;

   int FTZ1pos1,FTZ2pos1,bandwidth;
   datetime Arr[],time1;

   CopyTime(_Symbol,PERIOD_M1,0,1,Arr);
   time1=Arr[0];

   FTZ1pos1=CopyTime(_Symbol,PERIOD_M1,time1,startTime1,Arr);
   bandwidth=CopyTime(_Symbol,PERIOD_M1,endTime1,startTime1,Arr)*(34+2); // +2 - небольшой запас общей ширины
                                                                         // зоны на всякий случай

   if(FTZ1pos1<=bandwidth)
      ObjectCreate(0,"FTZ1",OBJ_FIBOTIMES,0,
                   startTime1,startPrice1,
                   endTime1,endPrice1
                  );


// ---
   FTZ2pos1=CopyTime(_Symbol,PERIOD_M1,time1,startTime2,Arr);
   bandwidth=CopyTime(_Symbol,PERIOD_M1,endTime2,startTime2,Arr)*(34+2); // +2 - небольшой запас общей ширины
                                                                         // зоны на всякий случай

   if(FTZ2pos1<=bandwidth)
      ObjectCreate(0,"FTZ2",OBJ_FIBOTIMES,0,
                   startTime2,startPrice2,
                   endTime2,endPrice2
                  );
  }

Risultato desiderato:Ci devono essere due fusi orari Fibo

Da qualche parte tra la prima e la seconda linea di base 0 c'è un punto di svolta che separa le barre dei minuti false da quelle vere.

Se si rifiutano i calcoli nel numero di barre, e tutto viene calcolato con le date, allora certamente non darà la precisione desiderata, perché bisogna sottrarre i fine settimana (+/- ora di chiusura/apertura del mercato), le vacanze, ecc, e per non parlare delle barre mancanti in assenza di tick oltre il minuto e la divergenza dalla linea temporale.

Cosa consigliate come soluzione affidabile?

 

Errore nel caricamento del file in Expert Advisor. Trova 10 differenze. Il primo codice si riferisce allo script, il secondo all'Expert Advisor, sono identici Ctrl-C Ctrl-V. Il codice funziona nello script, non funziona nell'Expert Advisor.

#include <\\MyClass\RegulFind-v1-1.mqh>
#include <Trade\Trade.mqh>
int hMa,hRsi ;
double mMa[],mRsi[];                             
Kohonen  koh;
CTrade trade ;
void OnStart()
  {
   koh.LoadMap("KitMaRsi.csv") ;
   hMa=iMA(_Symbol,Period(),10,0,MODE_EMA,PRICE_CLOSE) ;
   if(hMa ==INVALID_HANDLE)
      Print("Ошибка загрузки машки====================== ",GetLastError());
   hRsi=iRSI(_Symbol,Period(),10,PRICE_CLOSE);
   if(hRsi ==INVALID_HANDLE)
      Print(" Ошибка загрузки РСИ ==========");   
   
  }
#include <\\MyClass\RegulFind-v1-1.mqh>
#include <Trade\Trade.mqh>
int hMa,hRsi ;
double mMa[],mRsi[];                             
Kohonen  koh;
CTrade trade ;
int OnInit()
  {
   koh.LoadMap("KitMaRsi.csv") ;
   hMa=iMA(_Symbol,Period(),10,0,MODE_EMA,PRICE_CLOSE) ;
   if(hMa ==INVALID_HANDLE)
      Print("Ошибка загрузки машки====================== ",GetLastError());
   hRsi=iRSI(_Symbol,Period(),10,PRICE_CLOSE);
   if(hRsi ==INVALID_HANDLE)
      Print(" Ошибка загрузки РСИ ==========");   
   return(0);
  }
 
ivandurak:

Errore nel caricamento del file in Expert Advisor. Trova 10 differenze. Il primo codice si riferisce allo script, il secondo all'Expert Advisor, sono identici Ctrl-C Ctrl-V. Il codice funziona nello script, non funziona nell'Expert Advisor.

Il tester ha una sandbox di file diversa. Se volete Expert Advisor nel tester e nel modo normale di lavorare con un file *.csv, mettetelo nella directory comune e aprite il file con il modificatore FILE_COMMON


P.S. Per metterlo nella cartella comune, devi scrivere un file con il modificatore
FILE_COMMON, o trovare qualcosa come questo (una variante per XP):

C:\Documents and Settings\Tutti gli utenti\Dati applicazioni\MetaQuotes\Terminal\Common\Files\



 
x100intraday:

Cosa consigliate come soluzione affidabile?

Torna a MT4.

Ho contattato gli sviluppatori sul futuro di questo problema, ma sono rimasti in silenzio, quindi personalmente non ho idea di cosa mi riservi il futuro.

 

L'interruttore con le variabili di carattere non sembra funzionare...

Invece di:

string type = "Buy";

switch(type)
{
case "Buy" : {direction = ORDER_TYPE_BUY;  price = SymbolInfoDouble(zSymbol,SYMBOL_ASK); break;}
case "Sell": {direction = ORDER_TYPE_SELL; price = SymbolInfoDouble(zSymbol,SYMBOL_BID); break;}
default: {return(lot_value);}
}

'type' - tipo di espressione switch illegale
'Buy' - l'espressione costante non è integrale

Devo disegnarlo così:

if(zShift == "Buy")  {direction = ORDER_TYPE_BUY;  price = SymbolInfoDouble(zSymbol,SYMBOL_ASK);}
if(zShift == "Sell") {direction = ORDER_TYPE_SELL; price = SymbolInfoDouble(zSymbol,SYMBOL_BID);}
if(zShift != "Buy" || zShift != "Sell") {return(lot_value);}

Non è così chiaro ed è storto.

Funziona bene in altre lingue.

Devo scriverlo in un altro modo?

 
awkozlov:

Switch non sembra funzionare con le variabili di carattere...


La documentazione dice (enfasi aggiunta) - Interruttore operatore:

Confronta il valore di un'espressione con le costanti in tutte le varianti di caso e passa il controllo all'operatore che corrisponde al valore dell'espressione. Ogni variante di caso può essere contrassegnata da una costante intera , una costante di carattere o un'espressione costante. Un'espressione costante non può includere variabili o chiamate di funzioni. L'espressione dell'operatore dicommutazione deve essere di tipo intero.

 
awkozlov:

Funziona in altre lingue...

Il fatto che funzioni in altre lingue è una caratteristica. Switch era originariamente inteso solo per i tipi integrali. Qui non c'è questa caratteristica.