Fehler, Irrtümer, Fragen - Seite 379

 
Graff:

Ist es sinnvoll, dass

rates_total durch BarsCalculated(ich) ersetzen?

Das glaube ich nicht. Es handelt sich eher um einen Service-Stub, der sicherstellt, dass der Puffer bereit ist...

Außerdem gibt Copy so viele Daten wie berechnet zurück, nicht die angeforderte Größe.


Und aus welcher Stadt kommen Sie, wenn nicht aus einer geheimen?

nicht in Dnepr.
 
sergeev:

Sind Sie übrigens sicher, dass Sie keine zusätzlichen Funktionen aufrufen müssen?

Die Bibliothek verfügt sowohl über Refresh als auch BufferResize. Ich habe den Eindruck, dass sie für ein normales Funktionieren notwendig sind.


Und wo steht geschrieben, dass sie es sein sollten?

Ich habe verschiedene Varianten ausprobiert.

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

Ich habe keine Wirkung.

 

Fortsetzung....

Beim iIchimoku-Indikator ist eine Störung aufgetreten. Mein Indikator zeichnet nur Pfeile in Abhängigkeit von if(tenkan[i]>kijun[i]). Wie Sie auf dem Screenshot sehen können, sind die Pfeile nicht korrekt gezeichnet

Der vollständige Code befindet sich in der Datei Ich_1_f.mq5

Wenn Sie sie jedoch manuell berechnen, wird alles korrekt angezeigt.

Vollständiger Code in der Datei Ich_1_ok.mq5

Dateien:
Ich_1_f.mq5  6 kb
Ich_1_ok.mq5  6 kb
 

Schreiben Sie die 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);}

einstecken:

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

anrufen:

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

erhalten wir dies:

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

obwohl beide Zeilen den gleichen Wert 153,25 ergeben sollten.

Und warum?

 
Urain:

Warum?
Handelt es sich dabei um die 32- oder 64-Bit-Version?
 
Renat:
Handelt es sich dabei um die 32- oder 64-Bit-Version?

32
 

Es ist sehr einfach - in der Funktion GetPtrVar(double a) nehmen Sie die Adresse einer Kopie der Variablen im Stack und versuchen dann, das verschüttete Stück Stack-Speicher zu lesen.

Beim ersten Mal konnten wir aufgrund eines nahen Aufrufs von GetValuePtr vom nicht kontaminierten Stack lesen, während die nachfolgenden Funktionsaufrufe den Stack unwiderruflich beschädigten.

Es liegt kein Fehler vor.

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

Es ist sehr einfach - in der Funktion GetPtrVar(double a) nehmen Sie die Adresse einer Kopie der Variablen im Stack und versuchen dann, das verschüttete Stück Stack-Speicher zu lesen.

Ja, genau, ich hatte das Gefühl, dass ich dort irgendwo graben muss.

Sie müssen in die DLL schreiben

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

Es ist sehr einfach - in der Funktion GetPtrVar(double a) nehmen Sie die Adresse einer Kopie der Variablen im Stack und versuchen dann, das verschüttete Stück Stack-Speicher zu lesen.

Beim ersten Mal konnten wir aufgrund eines nahen Aufrufs von GetValuePtr vom nicht kontaminierten Stack lesen, während die nachfolgenden Funktionsaufrufe den Stack unwiderruflich beschädigten.

Es liegt kein Fehler vor.

Ich habe es auch bemerkt. Ich denke, das ist der richtige Weg:

#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);}

verstopfen:

#import "Projeckt1.dll"
int      GetPtrVar(double & a);
double   GetValuePtr(int pointer);
#import
 
In der Version 439 von Metatrader5 wurde ein Indikator für die Qualität der Historie hinzugefügt. Wenn ich auf M1 und H4 auf Eröffnungskursen und auf allen Ticks teste, ist die Qualität 51%... Warum und wie kann man sie erhöhen? Die Quelle der Zitate ist alpari demo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5