Wie programmiert man? - Seite 293

 
lincoln2012:
Ich versuche, MQ4 zu lernen. Mein erstes einfaches Programm soll einen Alarm auslösen, wenn sich 2 MAs kreuzen. Ich kann nicht herausfinden, warum

dieser Code funktioniert nicht.

Jede Hilfe wird wirklich geschätzt werden! Vielen Dank im Voraus.

extern int Zeitraum_MA1 = 5;

extern int Zeitraum_MA2 = 1;

double MA1;

double MA2;

int init()

{

return(0);

}

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

int deinit()

{

return(0);

}

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

int start()

{

//--------------------------------------------------------------------

MA1=iMA(NULL,0,Zeitraum_MA1,0,MODE_SMA,PREIS_SCHLIESSEN,0);

MA2=iMA(NULL,0,Zeitraum_MA2,0,MODE_SMA,KURS_SCHLIESSEN,0);

//--------------------------------------------------------------------

wenn (MA2 == MA1 )

Alert("Preis ist derselbe(",Zeitraum_MA2,").");// Alert

zurück;

}

Hallo Lincoln2012,

Ich würde mir gerne den Code dieses Ma Cross anschauen.

Dateien:
macross-1.mq4  7 kb
 
lincoln2012:
Ich versuche, MQ4 zu lernen. Mein erstes einfaches Programm soll einen Alarm auslösen, wenn sich 2 MAs kreuzen. Ich kann nicht herausfinden, warum

dieser Code funktioniert nicht.

}

Der Schlüssel zum Code einer Kreuzung von 2 beliebigen Indikatorlinien ist dieses Konzept:

1. Wenn der aktuelle Balken Linie1>Linie2 und der vorherige Balken Linie1<Linie2 ist, dann gibt es ein Up Cross.

2. Wenn aktueller Balken Linie1Linie2, dann gibt es ein Down-Kreuz.

 
mj10:
Hallo

Nun, ich war dabei wenig Programmierung in der Mt4 sein Spaß, aber ich m nicht pro nur einfache Bearbeitung von alten Indikator. Ok ich möchte einen einfachen Indikator zu machen, aber nicht wissen, wie man es tun.

seine einfache Indikator es einfach überprüfen, für den Wert, wenn der Wert der alle varible gleich sind es zeichnen, dass Punkt, wo der Wert der alle die Variable übereinstimmen.

Meine einfache Lösung

Nehmen wir an, wir haben Variablen

double movingavg1;

double movingavg12;

double movingavg13;

double movingavg14;

double movingavg15;

double movingavg16;

double movingavg17;

double movingavg18;

double movingavg19;

double movingavg10;

double movingavgall;

wir deklarieren die Variable ich gebe nur ein Beispiel ich benutze iStochastic(1), aber wir können für jeden Indikator verwenden.

movingavg12=iStochastic(1)

movingavg13=iStochastic(2)

.

.

.

und so weiter

jetzt

if (movingavg12=movingavg13=movingavg14,....) (Wert in Variable "movingavgall" eintragen) //den Wert eintragen, der für vria gleich ist

movingavgall auf Balken zeichnen

Anwendung

Nehmen wir an, ich möchte überprüfen, wo der gleitende Durchschnitt 3 und der gleitende Durchschnitt 5 den gleichen Wert haben

auch dieser Indikator kann mit RSI verwendet werden, wenn der RSI 1 und RSI 2 Wert = 80

und viele mehr

sogar wenn wir MTF hinzufügen, wird das ein zusätzlicher Bonus sein

Sieht einfach aus, aber ich konnte die Lösung nicht finden, ich hoffe jemand kann helfen.

ich hoffe ihr versteht was ich meine

danke

Sobald Sie Werte zum Vergleichen haben, würden Sie einen Code ähnlich dem folgenden verwenden.

Um zuprüfen, ob die Werte gleich sind, verwendet man ==. Ein einzelnes = wird verwendet, um einer Variablen einen Wert zuzuweisen.

Bei der Überprüfung von mehr als 1 Satz muss && verwendet werden, um AND zu bedeuten

movingavgall = 0;

if ((a == b) && (b == c) && (c == d)) movingavgall = a;

Sie können dann prüfen, ob movingavgall einen Wert hat mit

if (movingavgall != 0)

{

// hier etwas tun

}

Suchen Sie mit Google nach Metatrader-Programmierung.

Sie sollten mehrere gute Tutorials für die Programmierung in MT4 finden.

Ein gutes Buch über C-Programmierung wird Ihnen ebenfalls helfen.

Robert Hill alias MrPip

 

diesen Code vereinfachen

Hallo zusammen!

ich versuche, diesen Code zu vereinfachen, indem ich den Befehl Stringconcatenate aus dem Folgenden verwende:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

zu diesem:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%","/\\ ", uitog2v, "%","/\\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Ich hoffe, jemand kann mir helfen.

Mit freundlichen Grüßen

doc

trend_alexcud_v_2men.mq4

Dateien:
 

...

Doku

Wenn Sie alle diese Elemente benötigen, gibt es keinen einfacheren Weg, sie zu schreiben

dr.house7:
Hallo zusammen!

Ich versuche, diesen Code zu vereinfachen, indem ich den Stringconcatenate-Befehl von hier aus verwende:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

zu diesem:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%","/\\ ", uitog2v, "%","/\\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Ich hoffe, jemand kann mir helfen.

Mit freundlichen Grüßen

doc

trend_alexcud_v_2men.mq4
 

So geht's: Alarmierung alle 60 Sekunden

Wie kann ich einen Code erstellen, der mir z.B. alle 60 Sekunden einen Alarm ausgibt?

Ich habe diesen Code unten erstellt, aber es gibt mir eine Warnung jede Minute aus, wenn ich es an den Chart anhängen und ich möchte, dass es die Broker-Zeit zu folgen, so dass es mich für z.B. alle 60 Sekunden alarmieren.

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
Doc Wenn Sie all diese Elemente benötigen, gibt es keinen einfacheren Weg, sie zu schreiben

Ähm, diesmal Pech gehabt, trotzdem danke.

Mit freundlichen Grüßen

doc

 

Es gibt ein Problem mit dem zweiten StringConcatenate-Aufruf.

Sie addieren 3 verschiedene Schriftartennamen und das Ergebnis ist kein gültiger Name.

Robert

dr.house7:
Hallo zusammen!

Ich versuche, diesen Code zu vereinfachen, indem ich den StringConcatenate-Befehl von hier aus verwende:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

zu diesem:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%","/\\ ", uitog2v, "%","/\\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Ich hoffe, jemand kann mir helfen.

Mit freundlichen Grüßen

doc

trend_alexcud_v_2men.mq4
 

Brauche Hilfe mit EA ... Geschäfte werden im Tester nicht geschlossen

Ich arbeite an einem EA, aber egal was ich tue, ich kann ihn nicht dazu bringen, Trades zu schließen. Er öffnet sie problemlos, aber wenn ich sie schließen will, schließt der EA sie nicht.

Ich werde einen Teil meines EA-Codes posten, damit vielleicht einer von euch erfahrenen Programmierern herausfinden kann, warum ich dieses Problem habe. Die Variablen 'buyTrade' und 'sellTrade' sind global für den gesamten EA.

HINWEIS: Ich möchte nur EINEN Handel zu einem bestimmten Zeitpunkt offen haben, entweder long oder short. Die Trades sind "always in", wenn also ein Long-Signal kommt, sollte der bestehende Short geschlossen werden und umgekehrt.

Dies wird NICHT gemacht. Was es tut, ist das Öffnen von Trades und dann öffnet mehr Trades ... und öffnet mehr ... und hält sie offen, bis sie schließlich alle ihre Stops treffen.

Vielen Dank im Voraus

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

Da es sich um einen Teilcode handelt: Versuchen Sie, symBid durch symAsk beim Schließen des Verkaufsauftrags und symAsk durch symBid beim Schließen des Kaufauftrags zu ersetzen (kehren Sie die Schlusskurse um, Sie können einen Verkauf nicht zum Geldkurs und einen Kauf nicht zum Briefkurs schließen)

outofdebt:
Ich arbeite an einem EA, aber egal was ich tue, ich kann ihn nicht dazu bringen, Trades zu schließen. Es öffnet sie einfach gut, aber wenn ich sie schließen möchte, wird der EA sie nicht schließen.

Ich werde einen Teil meines EA-Codes posten, damit vielleicht einer von euch erfahrenen Programmierern herausfinden kann, warum ich dieses Problem habe. Die Variablen 'buyTrade' und 'sellTrade' sind global für den gesamten EA.

HINWEIS: Ich möchte nur EINEN Handel zu einem bestimmten Zeitpunkt offen haben, entweder long oder short. Die Trades sind "always in", wenn also ein Long-Signal kommt, sollte der bestehende Short geschlossen werden und umgekehrt.

Dies wird NICHT gemacht. Was es tut, ist das Öffnen von Trades und dann öffnet mehr Trades ... und öffnet mehr ... und hält sie offen, bis sie schließlich alle ihre Stops treffen.

Vielen Dank im Voraus

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);