Wie programmiert man? - Seite 271

 

Brauche Hilfe mit iCustom Funktion für diesen EA kann einen benutzerdefinierten Indikator aufrufen.

Hallo, alle,

Ich würde gerne diesen (Entry.mq4) indi zu diesem (swb grid 4.1.0.3_EA) EA mit

iCustom Funktion hinzufügen, damit ich und wir diesen Indikator in der Strategie des EAs verwenden können.

der EA verwendet bereits 3 MT4 Indikatoren Bollinger Bands, Stochastic und RSI und haben

Schalter, so dass Sie entweder einen oder alle von ihnen zu verwenden, durch die Auswahl TRUE oder FALSE wählen können

und ich würde gerne diesen 4. indi(Entry.mq4) zum EA hinzufügen.

Ich würde es sehr schätzen, wenn mir jemand helfen könnte.

Vielen Dank.

die EA und indi beigefügt unten.

Dateien:
 

Noob MQL4 Hilfe benötigt, um dieses Array zu verstehen

Hallo, Programmierer

Könnte mir jemand etwas über Arrays beibringen?

Oder vielleicht habe ich mehr Probleme, diese Schleife zu verstehen, da sie sich auf dieses Array bezieht.

int i=Bars;

#property copyright "Unfinished POS by Agent86"

double v1[];

double v2[];

double val1;

double val2;

int start()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

wenn (val1 > 0)

{

v1=Hoch;

}

sonst

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

wenn (val2 > 0)

{

v2=Niedrig;

}

sonst v2=v2;

i--;

}

return(0);

}

Es handelt sich um ein einfaches Fraktal, und dennoch kann ich mich scheinbar nicht auf irgendwelche Elemente im Array beziehen.

Ich möchte in der Lage sein, i++ irgendwie zu inkrementieren und Print (v1); oder drucken Sie den vorherigen Wert vor der 0 oder EMPTY_VALUE.

Wenn ich damit überhaupt in die richtige Richtung gehe.

Ich habe Probleme.

Print (v1): immer == 0 und druckt 0

Ich verstehe das irgendwie, weil es eigentlich eine Schleife bis -1 ist, was == 0 ist.

Wie und wo kann ich die Print-Anweisungen platzieren, damit ich sehen kann, was vor sich geht?

Ich habe eine Vielzahl von Methoden ausprobiert und i=0 neu initialisiert, um eine alternative Schleife zu versuchen, so dass ich mich auf v1-Elemente beziehen könnte, aber alle Versuche sind fehlgeschlagen.

Im Grunde möchte ich die vorherigen Fraktale anzeigen oder sie als A hoch, B niedrig usw. für eine mögliche zukünftige Verwendung in einem ABCD-Schema Typ EA markieren.

Im Moment möchte ich hauptsächlich v1 ausdrucken, damit ich sehen kann, was es tut.

Vielleicht könnte ich etwas entwickeln, um ein vorheriges Fraktal wie A_high und/oder B_low oder ein ähnliches Schema auszuwählen.

Bin ich damit auf dem falschen Weg?

Bitte um Rat

Danke

 

Ich würde stattdessen mit einer FOR-Schleife arbeiten. While-Schleifen können zu Blockierungen führen, wenn Sie vergessen, das i-- einzuschließen. Da Sie die genaue Anzahl der Takte kennen, ist es einfacher zu verwenden, und außerdem wird i niemals < 0 sein. Das hilft, Verwirrung zu vermeiden.

For (int i=Balken-1;i>0;i--) {

// Code

}

Versuchen Sie, alle Array-Werte auf 0 zu setzen, gehen Sie dann zurück und weisen Sie die Indikatorwerte zu. Versuchen Sie auch ein print() direkt nach der Zuweisung Ihres Indikatorwerts. Sehen Sie, ob es überhaupt etwas zurückgibt.

Meiner Meinung nach ist es am besten, dem Array eine bestimmte Größe zuzuweisen. Sagen wir, 1000 Positionen. Es ist unwahrscheinlich, dass Sie so viele benötigen, und es wird die Berechnungen, die Sie durchführen, reduzieren. Alles, was Sie dann tun müssen, ist eine Schleife durch die letzten 999 Bars auf 0 und Werte zuweisen. Ich glaube mich zu erinnern, dass MT4 Probleme mit Array-Initialisierungen und so weiter hat.

 

Array-Fragen

Trader5050-Deployed:
Ich würde stattdessen mit einer FOR-Schleife arbeiten. While-Schleifen können zu Blockierungen führen, wenn Sie vergessen, das i-- einzuschließen. Da Sie die genaue Anzahl der Takte kennen, ist es einfacher zu verwenden, plus die i wird nie < 0. Es hilft, Verwirrung zu vermeiden.

For (int i=Bars-1;i>0;i--) {

// Code

}

Versuchen Sie, alle Array-Werte auf 0 zu setzen, gehen Sie dann zurück und weisen Sie Indikatorwerte zu. Versuchen Sie auch ein print() direkt nach der Zuweisung Ihres Indikatorwerts. Sehen Sie, ob es überhaupt etwas zurückgibt.

Meiner Meinung nach ist es am besten, wenn Sie dem Array eine bestimmte Größe zuweisen. Sagen wir, 1000 Positionen. Es ist unwahrscheinlich, dass Sie so viele benötigen, und es wird die Berechnungen, die Sie durchführen, reduzieren. Alles, was Sie dann tun müssen, ist eine Schleife durch die letzten 999 Bars auf 0 und Werte zuweisen. Ich glaube mich zu erinnern, dass MT4 Probleme mit Array-Initialisierungen und dergleichen hat.

Ok, danke, ich werde es versuchen.

Obwohl die while-Anweisungen gut funktionieren, helfen sie mir nicht dabei, die Array-Elemente zu erhalten, die ich ausdrucken/anzeigen möchte usw.

Ich werde an dem arbeiten, was Sie gesagt haben, und einige Tests durchführen und mich wieder melden.

Danke

 
Trader5050-Deployed:
Ich würde stattdessen mit einer FOR-Schleife arbeiten. While-Schleifen können zu Blockierungen führen, wenn Sie vergessen, das i-- einzuschließen. Da Sie die genaue Anzahl der Takte kennen, ist es einfacher zu verwenden, plus die i wird nie < 0. Es hilft, Verwirrung zu vermeiden.

For (int i=Bars-1;i>0;i--) {

// Code

}

Versuchen Sie, alle Array-Werte auf 0 zu setzen, gehen Sie dann zurück und weisen Sie die Indikatorwerte zu. Versuchen Sie auch, direkt nach der Zuweisung Ihres Indikatorwerts ein print() auszuführen. Sehen Sie, ob es überhaupt etwas zurückgibt.

Meiner Meinung nach ist es am besten, wenn Sie dem Array eine bestimmte Größe zuweisen. Sagen wir, 1000 Positionen. Es ist unwahrscheinlich, dass Sie so viele benötigen, und es wird die Berechnungen, die Sie durchführen, reduzieren. Alles, was Sie dann tun müssen, ist Schleife durch die letzten 999 Bars auf 0 und Werte zuweisen. Ich glaube mich zu erinnern, dass MT4 Probleme mit Array-Initialisierungen und dergleichen hat.

Es wird immer noch nur das Array mit allen 0-Einträgen gedruckt.

Seltsam

 

Argent86,

Es gibt einige Fehler in Ihrem Code:

- Arrays, die Sie verwenden, sind noch keine Arrays (wenn Sie die Array-Größe nicht angeben, wie Sie es im Code getan haben, handelt es sich um ein dynamisches Array und die Array-Größe muss zur Laufzeit verwaltet werden), so dass Sie Arrays der Größe 0 haben (das ist der erste Grund dafür, dass Sie immer 0 haben - es ist die Fehlerbehandlungsroutine von Metatrader, die einen schwerwiegenden Fehler verhindert und in solchen Fällen 0 als Ergebnis zurückgibt - in C/C++ würde das einen Absturz verursachen)

- wenn Sie nicht angeben, dass das Array "serienartig" ist (in "serienartigen" ist das 0. Element das letzte, während in normalen Arrays das 0. Element das erste ist), so ist der Ausdruck i+1 in diesem Fall das nächste Element eines Arrays und nicht das vorherige. Sie können Arrays in der "serienmäßigen" Art und Weise verwenden, aber dann müssen Sie ein paar mehr Dinge tun, damit es zur Laufzeit funktioniert, und selbst dann, wenn sich die Taktnummern ändern, werden Sie kriechenden Code bekommen, also ist es besser, Arrays in ihrem nativen - "C-ähnlichen" Modus zu verwenden

- Stellen Sie außerdem sicher, dass Sie mindestens ab dem 3. Takt auf einem neuen Tick beginnen (dort wird ein neues Fraktal erscheinen, nicht auf einem aktuellen Takt)


Hier ist, was Sie versuchen, ohne diese Probleme zu tun
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

Zugriff aus MQ4 auf eine dll-Funktion mit: Variablen-Argumenten-Listen

Hallo,

weiß jemand, ob es möglich ist, eine DLL-Funktion zu importieren, die als Argument eine Variablen-Argumenten-Liste verwendet?

z.B. vprintf - C++ Referenz

int vprintf ( const char * format, va_list arg );

wenn ja, wie würde man das machen?

Vielen Dank

MJ

 

Wie rufe ich eine Funktion ohne Rückgabewert auf?

Hallo Jungs und Mädels.

An einer Stelle in meinem Programm möchte ich eine Funktion aufrufen.

Allerdings hat die Funktion keinen Rückgabewert (void). Also wie rufe ich die Funktion auf,

so dass der Code innerhalb der Funktion genau an der Stelle ausgeführt wird, an der ich sie aufrufe,

als ob er an dieser Stelle selbst geschrieben worden wäre?

Ich habe einige Beispiel-Code unten.. wo ich einige Parameter zu überprüfen, und wenn Ok, ich möchte die Funktion ausführen...

Hoffe jemand kann mir dabei helfen, tx im Voraus, Jonkie76

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

if (Kurs >= PRICE_CLOSE)

call function ; // An dieser Stelle möchte ich die Funktion aufrufen, wie mache ich das?

sonst

Alert("Nichts tun"); //

//----

return(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNKTIONEN

//===================================================================+

//----------------------- CLOSE ORDER FUNKTION ----------------------+

void subCloseOrder()

{

int

i,

gesamt = 0,

ticket = 0,

err = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<AnzahlDerVersuche;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

sonst

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy-Fehler

{

Sleep(5000);

weiter;

}

sonst //normaler Fehler

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}

 

Es ist sehr einfach. Sie brauchen es nur aufzurufen, da es etwas zurückgeben würde, nur brauchen Sie kein Ergebnis zu speichern, da es beim Typ void überhaupt kein Ergebnis gibt. (gibt nichts zurück) So:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Verwenden Sie stattdessen "void". Zum Beispiel so:

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void bedeutet, dass die Funktion keinen Wert zurückgibt und somit effektiv zu einer Prozedur und nicht zu einer Funktion wird.

Jonkie76:
Hallo Jungs und Mädels.

An einem bestimmten Punkt in meinem Programm möchte ich eine Funktion aufrufen.

Die Funktion hat jedoch keinen Rückgabewert (void). Wie kann ich also die Funktion aufrufen?

so dass der Code innerhalb der Funktion genau an der Stelle ausgeführt wird, an der ich sie aufrufe,

als ob er an dieser Stelle selbst geschrieben worden wäre?

Ich habe einige Beispiel-Code unten.. wo ich einige Parameter zu überprüfen, und wenn Ok, ich möchte die Funktion ausführen...

Hoffe jemand kann mir dabei helfen, tx im Voraus, Jonkie76

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

if (Kurs >= PRICE_CLOSE)

call function ; // An dieser Stelle möchte ich die Funktion aufrufen, wie mache ich das?

sonst

Alert("Nichts tun"); //

//----

return(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNKTIONEN

//===================================================================+

//----------------------- CLOSE ORDER FUNKTION ----------------------+

void subCloseOrder()

{

int

i,

gesamt = 0,

ticket = 0,

err = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<AnzahlDerVersuche;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

sonst

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy-Fehler

{

Sleep(5000);

weiter;

}

sonst //normaler Fehler

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}