Errori, bug, domande - pagina 379

 
Graff:

Ha senso

sostituire rates_total con BarsCalculated(ich)?

Non credo. È più che altro uno stub di servizio per assicurarsi che il buffer sia pronto...

Inoltre, Copy restituirà la quantità di dati calcolata, non la dimensione richiesta.


E da quale città vieni, se non da un segreto?

non in Dnepr.
 
sergeev:

A proposito, sei sicuro di non aver bisogno di chiamare qualche funzione aggiuntiva?

La libreria ha sia Refresh che BufferResize. Mi sembra che siano necessari per un funzionamento normale.


E dove sta scritto che dovrebbero essere?

Ho provato diverse varianti.

ichi.Refresh(true);
ichi.Refresh(false);
ichi.RefreshCurrent(true);
ichi.RefreshCurrent(false);

Non ho ottenuto alcun effetto.

 

Continua....

L'indicatore iIchimoku sta avendo un problema. Il mio indicatore disegna semplicemente delle frecce a seconda di if(tenkan[i]>kijun[i]). Come potete vedere nello screenshot le frecce non sono disegnate correttamente

Il codice completo è nel file Ich_1_f.mq5

Tuttavia, se li calcolate manualmente, tutto viene visualizzato correttamente

Codice completo nel file Ich_1_ok.mq5

File:
Ich_1_f.mq5  6 kb
Ich_1_ok.mq5  6 kb
 

Scrivere il dll :

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

collegarlo:

#import "Projeckt1.dll"
int      GetPtrVar(double a);
double   GetValuePtr(int pointer);
#import

chiamare :

void OnStart()
  {   
   double var=153.25; 
   Print("вложенный вызов = ",GetValuePtr(GetPtrVar(var)));
   int pointer=GetPtrVar(var);   
   Print("вызов с сохранением адреса = ",GetValuePtr(pointer));
  }

otteniamo questo:

2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вызов с сохранением адреса = 5.560304580319136 e-287
2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вложенный вызов = 153.25

anche se entrambe le linee dovrebbero restituire lo stesso valore 153,25.

Perché?

 
Urain:

Perché?
È nella versione a 32 o 64 bit?
 
Renat:
È nella versione a 32 o 64 bit?

32
 

È molto semplice - nella funzione GetPtrVar(double a) si prende l'indirizzo di una copia della variabile nello stack e poi si cerca di leggere il pezzo di memoria dello stack.

La prima volta, a causa di una chiamata ravvicinata di GetValuePtr siamo riusciti a leggere dallo stack incontaminato, mentre le successive chiamate di funzione hanno danneggiato lo stack irrevocabilmente.

Non c'è nessun errore.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 
Renat:

È molto semplice - nella funzione GetPtrVar(double a) prendete l'indirizzo di una copia della variabile nello stack, e poi provate a leggere il pezzo di memoria dello stack.

Sì, esattamente, sentivo che dovevo scavare lì da qualche parte.

dovete scrivere nella dll

GetPtrVar(double &a){return((int)(&a));}
 
Renat:

È molto semplice - nella funzione GetPtrVar(double a) si prende l'indirizzo di una copia della variabile nello stack e poi si cerca di leggere il pezzo di memoria dello stack.

La prima volta, a causa di una chiamata ravvicinata di GetValuePtr siamo riusciti a leggere dallo stack incontaminato, mentre le successive chiamate di funzione hanno danneggiato lo stack irrevocabilmente.

Non c'è nessun errore.

L'ho notato anch'io. Penso che questo sia il modo giusto per farlo:

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double & a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

tamponamento :

#import "Projeckt1.dll"
int      GetPtrVar(double & a);
double   GetValuePtr(int pointer);
#import
 
Nella build 439 di Metatrader5, è stato aggiunto un indicatore di qualità della storia. Quando sto testando su M1 e H4 sui prezzi di apertura e su tutti i tick, la qualità è del 51%... Perché e come aumentarlo? La fonte delle citazioni è alpari demo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5