Wie programmiert man? - Seite 296

 

Ist es möglich, Farbe, Stil und Gewichtung zu Indikatorstufenlinien hinzuzufügen?

Hallo,

Ich frage mich, ob mir jemand sagen kann, ob es möglich ist, Farbe, Stil und Gewichtung zu den Indikatorlinien hinzuzufügen?

Zunächst möchte ich sowohl den Stil als auch die Farbe der RSI-Levels festlegen und frage mich, ob man dies tun kann, indem man z.B. der Zeile mehr Code hinzufügt: #property indicator_level1 70 ?

Wenn möglich, wäre ich sehr dankbar, wenn mir das jemand zeigen könnte.

Vielen Dank!

Laurus

 

...

Ja, Sie können

die folgenden Eigenschaften verwenden:

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
Hallo,

Ich frage mich, ob mir jemand sagen kann, ob es möglich ist, Farbe, Stil und Gewichtung zu den Linien der Indikatorstufen hinzuzufügen?

Zunächst möchte ich sowohl Stil als auch Farbe für die RSI-Levels festlegen und frage mich, ob man dies tun kann, indem man zum Beispiel der Zeile mehr Code hinzufügt: #property indicator_level1 70 ?

Wenn möglich, wäre ich sehr dankbar, wenn mir das jemand zeigen könnte.

Vielen Dank!

Laurus
 

Vielen Dank für Ihre Antwort, Mladen, ich weiß Ihre Hilfe immer sehr zu schätzen.

Was Sie geschrieben haben, ist genau das, was ich befürchtet habe. Was die Funktionen angeht, ist mir das noch zu hoch.

Wenn Sie einen Blick auf das Bild werfen, sehen Sie, wie ich es gerne hätte. Als Kompromiss habe ich normale horizontale Linien verwendet, aber da ich Trendlinien mit dem Indikator selbst zeichne, ist das keine gute Lösung.

Vielen Dank!

Laurus

Dateien:
 

...

Wenn man sich Ihr Bild ansieht, scheint dies die einzige Lösung zu sein, die Sie anwenden können (mit Objekten). Die Verwendung von Zeichenpuffern würde einfach Ihre Zeichenpuffer aufbrauchen und Sie könnten nicht alle Werte zeichnen, die Sie für diesen Indikator verwenden. Manchmal "bezahlen" wir immer noch für die Entscheidung des Metatraders 4, nur 8 Zeichenpuffer zu haben.

Laurus12:
Vielen Dank für Ihre Antwort, Mladen, ich weiß Ihre Hilfe immer sehr zu schätzen.

Was Sie geschrieben haben, ist genau das, was ich befürchtet habe. Was den Teil mit den Funktionen angeht, ist mir das immer noch zu hoch.

Wenn Sie einen Blick auf das Bild werfen, sehen Sie, wie ich es gerne hätte. Als Kompromiss habe ich normale horizontale Linien verwendet, aber da ich Trendlinien mit dem Indikator selbst zeichne, ist das keine gute Lösung.

Danke, Mladen,

Laurus
 

Externe DLL liefert seltsame Ergebnisse

Hallo!

Nachfolgend ein sehr einfaches Beispiel für einen Aufruf einer externen DLL. Das Journalprotokoll sollte steigende Zahlen, beginnend bei 0, anzeigen, wenn es mit dem Strategietester verwendet wird.

Das Ergebnis ist jedoch ziemlich seltsam. Die erste Zeile im Journalprotokoll zeigt eine große Zahl an (z. B. 18472) und steigt dann eine Zeit lang ordnungsgemäß an, bis sie anfängt, etwa 10, manchmal über 100, Schritte auf einmal zu springen.

Kann mir jemand erklären, woran das liegt und wie man es korrigieren kann?

Vielen Dank!

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

Interessantes Code-Problem für Indikator

Hallo Leute,

Ich versuche, MT4-Programmierung zu lernen, und gerade jetzt entwickle ich einen PinBar-Erkennungsindikator, der mir sagt, zu kaufen oder zu verkaufen. Ich habe diesen Indikator speziell für den 4-Stunden-Chart entwickelt, wegen der speziellen Regeln für Kauf oder Verkauf. Die Regel für die Erkennung ist wie folgt:

Körper der Kerze <= 35% der Kerzenlänge.

Mindestens 1 Docht der Kerze >= 50 % der Kerzenlänge.

Bis jetzt habe ich keine Probleme, diese Balken mit dem Indikator zu erkennen.

Die nächste Regel sagt mir jedoch, dass ich kaufen oder verkaufen soll.

Ich zoome in den 1-Stunden-Chart und betrachte die 4 Bars, die den Pinbar im 4-Stunden-Chart erzeugt haben.

Ich habe die Funktion iClose verwendet, um den Wert des Abschlusses des ersten und des letzten Balkens dieser Formation auf dem 1-Stunden-Balken zu übernehmen.

Aber wie jetzt programmiert, schaue ich immer auf die erste und letzte Kerze im 1-Stunden-Chart selbst. Und das ist nicht in Ordnung. Es muss der erste und letzte Balken der Formation sein und nicht der des Charts.

Hier ist der Code, den ich jetzt habe, mit den falschen iClose-Funktionen darin.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4))

{

Buy = Close;

SetLevel(true,i+1,Close);

}

Ich war nicht in der Lage, die richtigen 1-Stunden-Kerzen im Hintergrund für diese spezielle 4-Stunden-Kerze zu finden.

Gibt es jemanden, der mir die Antwort auf mein Problem geben kann?

Ich habe es behoben:

datetime H4BarTime;

int H1BarNumber;

H4BarTime = Time;

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);

tx vielmals!

Jakob

 
mladen:
Wenn ich mir dein Bild ansehe, scheint das die einzige Lösung zu sein, die du anwenden kannst (mit Objekten). Die Verwendung von Zeichnungspuffern würde einfach Ihre Zeichnungspuffer aufbrauchen und Sie könnten nicht alle Werte zeichnen, die Sie für diesen Indikator verwenden. Manchmal sind wir immer noch "zahlen" für metatraders 4 Entscheidung zu haben, nur 8 Zeichnung Puffer

Entschuldigen Sie meine späte Antwort, Mladen, und vielen Dank für die Klärung der Angelegenheit. Was Sie geschrieben haben, weiß ich jetzt wenigstens mit Sicherheit.

Ich danke dir,

Laurus

 

Hilfe bei Einstiegskriterien

Hallo Leute,

Ich versuche, ein Einstiegskriterium mit MA zu erstellen. Mein Einstiegskriterium ist einfach, ich möchte einen Long-Trade eingehen, wenn der Fast MA den Slow MA am Kerzenschluss nach oben kreuzt und nicht die aktuelle Kerze und umgekehrt.

Meine aktuelle Situation ist, dass mein EA einen langen Handel auslösen wird, wenn die Fast MA Slow MA nach oben und umgekehrt kreuzt, aber diese Kerze hat noch nicht schließen, und manchmal, wenn die Kerze schließt, die endgültige MA möglicherweise nicht nach oben kreuzt so, ich sollte nicht ausgelöst haben, dass bestimmte Handel, und doch das System ausgelöst, weil es nach oben einmal und zurück gekreuzt hat. Dies gilt auch für Short-Trades.

Ich habe über diese für ein paar Tage bereits ohne jeden Fortschritt gegangen. Kann mir jemand sagen, wie ich vorgehen muss, um dieses Problem zu lösen? Danke!

//--- Eingabeparameter

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| Experten-Initialisierungsfunktion |

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

int init()

{

//----

//----

return(0);

}

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

//| Experten-Deinitialisierungsfunktion |

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

int deinit()

{

//----

//----

return(0);

}

int Gekreuzt (double line1 , double line2)

{

static int letzte_Richtung = 0;

static int aktuelle_Richtung = 0;

if(line1>line2)current_dirction = 1; //oben

if(line1<line2)current_dirction = 2; //abwärts

if(current_dirction != last_direction) //geändert

{

last_direction = current_dirction;

return (letzte_Richtung);

}

sonst

{

return (0);

}

}

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

//| Expertenstartfunktion |

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma;

if(Bars<100)

{

Print("Balken weniger als 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit kleiner als 10");

return(0); // TakeProfit prüfen

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Gekreuzt (shortEma,longEma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Mein EA",12345,0,Grün);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der BUY-Order : ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "Mein EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der SELL-Order : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Vielen Dank und herzliche Grüße

Terrance

 

...

Terrance

Versuchen Sie, diese Zeilen zu ändern:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

Auf diese Weise brauchen Sie nicht einmal die Funktion "crossed", und es wird bei einem geschlossenen Balken nach Kreuzen gesucht.

tkuan77:
Hallo Leute,

Ich versuche, ein Einstiegskriterium mit Hilfe von MA zu erstellen. Meine Einstiegskriterien sind einfach: Ich möchte einen Long-Trade eingehen, wenn der Fast MA den Slow MA am Ende der Kerze nach oben kreuzt und nicht die aktuelle Kerze und umgekehrt.

Meine aktuelle Situation ist, dass mein EA einen langen Handel auslösen wird, wenn die Fast MA Slow MA nach oben und umgekehrt kreuzt, aber diese Kerze hat noch nicht schließen, und manchmal, wenn die Kerze schließt, die endgültige MA möglicherweise nicht nach oben kreuzt so, ich sollte nicht ausgelöst haben, dass bestimmte Handel, und doch das System ausgelöst, weil es nach oben einmal und zurück gekreuzt hat. Dies gilt auch für Short-Trades.

Ich habe über diese für ein paar Tage bereits ohne jeden Fortschritt gegangen. Kann mir jemand sagen, wie ich vorgehen muss, um dieses Problem zu lösen? Danke!

//--- Eingabeparameter

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| Experten-Initialisierungsfunktion |

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

int init()

{

//----

//----

return(0);

}

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

//| Experten-Deinitialisierungsfunktion |

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

int deinit()

{

//----

//----

return(0);

}

int Gekreuzt (double line1 , double line2)

{

static int letzte_Richtung = 0;

static int aktuelle_Richtung = 0;

if(line1>line2)current_dirction = 1; //oben

if(line1<line2)current_dirction = 2; //abwärts

if(current_dirction != last_direction) //geändert

{

last_direction = current_dirction;

return (letzte_Richtung);

}

sonst

{

return (0);

}

}

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

//| Expertenstartfunktion |

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma;

if(Bars<100)

{

Print("Balken weniger als 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit kleiner als 10");

return(0); // TakeProfit prüfen

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Gekreuzt (shortEma,longEma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Mein EA",12345,0,Grün);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der BUY-Order : ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "Mein EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der SELL-Order : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Dank und Grüße

Terrance
 
mladen:
Terrance

Versuche diese Zeilen zu ändern:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

Auf diese Weise brauchen Sie nicht einmal die Funktion "Kreuzen" und es wird bei einem geschlossenen Balken auf Kreuze geprüft.

Hallo Mladen, ich habe ausprobiert, was du mir gesagt hast, und es hat wunderbar funktioniert. Allerdings verstehe ich die Logik hinter den Codes nicht ganz. Warum setzt du die Verschiebung von iMA auf 1 und 2 und warum codierst du das: (diff1*diff2)<0) auch noch? Tut mir leid, aber ich bin derzeit noch in der Lernphase.

Vielen Dank und Grüße

Terrance