Wie programmiert man? - Seite 114

 
matrixebiz:
Wie richte ich Time Trading Stunden in einem EA ein?

Ich habe dies versucht;

int TradeHour;

if(Hour()17) TradeHour = false;

aber es scheint die Regel nicht zu befolgen, es wird einfach gehandelt, wann immer es geht, und ich habe && TradeHour in meinen Kauf-/Verkaufsanweisungen.

Danke

Haben Sie versucht, TradeHour als booleschen Wert anstelle einer ganzen Zahl zu definieren?

bool TradeHour;

if ((Hour()17)){ TradeHour = false;}

Außerdem benötigen Sie möglicherweise die zusätzlichen Klammern.

 
matrixebiz:
Wie richte ich Time Trading Stunden in einem EA ein?

Ich habe dies versucht;

int TradeHour;

if(Hour()17) TradeHour = false;

aber es scheint die Regel nicht zu befolgen, es wird einfach gehandelt, wann immer es geht, und ich habe && TradeHour in meinen Kauf-/Verkaufsanweisungen.

Danke

Wie kann Hour() kleiner als 9 UND größer als 17 sein? Meinten Sie Or (||)?

Lux

 
luxinterior:
Wie kann Hour() kleiner als 9 UND größer als 17 sein? Meinten Sie Or (||)? Lux

Guter Punkt, luxinterior! Das ist ein echtes Problem. Das habe ich übersehen.

 

Entschuldigung, ich meinte ||

und ich habe dies versucht;

//+---------Handelsstundenvariablen------------------

// if (Hour() < StartHour) TradeHourS = false;

// wenn (Stunde() > EndStunde) TradeHourE = false;

Wenn also StartHour=5 und EndHour=17 ist, sollte nur innerhalb dieser Stunden gehandelt werden, richtig?

Aber es wird trotzdem jederzeit gehandelt? Ist es ein Problem, wenn man den Strategy Tester benutzt?

 

Warum verwenden Sie nicht einfach das Beispiel aus der Hilfedatei?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

Lux

 

Rückgabe einer Zeichenkette aus exportierten Funktionen einer C/C++ DLL

Hallo zusammen,

Ich habe eine Reihe von Funktionen entwickelt, um Konfigurationseinstellungen von einem EA zu verwalten.

Diese Funktionen werden von einer C++ DLL exportiert und jede der exportierten Funktionen hat die __stdcall Aufruf convetion angefordert meine MQL4.

Mein Problem tritt auf, wenn eine Funktion eine Zeichenkette an den EA zurückgeben muss.

Natürlich kann die Funktion nicht:

- einen Zeiger auf eine lokale Variable zurückgeben (Variable geht aus dem Bereich)

- einen Zeiger auf eine globale Variable der DLL zurückgeben (Probleme mit gleichzeitigem Zugriff)

- einen Zeiger auf eine im Heap zugewiesene Zeichenkette zurückgeben (Funktionen zum Freigeben von Speicher, die vom EA aufgerufen werden müssen: Dieser Ansatz gefällt mir nicht)

Also habe ich beschlossen, einen String und die Stringgröße aus dem EA zu übergeben. Es:

string buffer;

GetString( buffer, 30 );

[/CODE]

and from the c++ dll, something like this

void __stdcall GetString( LPTSTR buffer, int BufSize )

{

// Read a string from a some source

....

// -1 to take into account the terminating null character

StringCchCopy( buffer, BufSize-1, ReadStringFromASource );

}

[/CODE]

Here starts the weird behaviour of MQL managing strings returned from a DLL.

using the following code:

string buffer;

GetString( buffer, 30 );

the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.

Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.

Tried even:

[CODE]

string buffer = " "; // 'allocate' 30 blank characters

GetString( buffer, StringLen(buffer) );

but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.

At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...

[CODE]

CopyMemory( buffer, ReadStringFromASource, min(BufferSize,ReadStringFromASourceLength) );

und nicht das abschließende Null-Zeichen hinzuzufügen.

Aber wenn von MQL aufgerufen, ist keine Zeichenfolge überhaupt zurück.

Hat jemand eine Antwort?

 
luxinterior:
Warum nicht einfach das Beispiel aus der Hilfedatei verwenden?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

Lux

Ja, das habe ich auch versucht;

bool TradeHour=false;

if(Hour()>=12 || Hour()<17) TradeHour=true

aber die ODER-Zeile wird nicht funktionieren, denn wenn Hour zufällig 22 ist, dann erfüllt es den ersten Teil "if(Hour()>=12" und handelt immer noch, wann immer es will, und ich habe && TradeHour zu den Kauf/Verkaufsanweisungen hinzugefügt. Das zweite Beispiel, das ich gab, sollte den Trick, ich verstehe es nicht

 
luxinterior:
Warum nicht einfach das Beispiel aus der Hilfedatei verwenden?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

[/code]

Lux

Ich denke, wenn Ihr Ziel ist, zwischen 12:00 und 17:00 Uhr zu handeln, müssen Sie einfach das Folgende tun:

[code]

bool TradingEnabled=false; // Globale Variable

...

...

TradingEnabled=false; // Rücksetzen bei jedem Tick-Lauf

if(Stunde()>=12 && Stunde()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Handelslogik hier

}

...

...

 
gorgoroth:
Ich denke, wenn Ihr Ziel ist, zwischen 12:00 und 17:00 Uhr zu handeln, müssen Sie einfach folgendes tun:

bool TradingEnabled=false; // Global variable

...

...

TradingEnabled=false; // Reset every tic run

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Trading logic here

}

...

...

Mache ich damit nicht das Gleiche?

if (Hour() 17) TradeHour = false;

Das heißt, wenn die Stunde zwischen 12 und 17 liegt, ist TradeHour=true, richtig?

(Hinzufügen von && TradeHour in meiner Buy/Sell-Anweisung)

 
luxinterior:
Wie kann Hour() kleiner als 9 UND größer als 17 sein? Meinten Sie Or (||)? Lux

Oh, und ich meinte &&, weil Sie Recht die Stunde kann nicht weniger als 9 UND größer als 17, die die Aussage falsch macht, aber wenn Stunde ist 10 dann ist es nicht weniger als 9 UND nicht größer als 17 so Aussage wird wahr.

Vielleicht verwirrt es MT4 buy auf diese Weise, aber es funktioniert;

int TradeHour;

TradeHour = ((Hour()>=StartHour) && (Hour()<EndHour));

Danke