![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Kann mir jemand sagen, was ich falsch gemacht habe, der untenstehende Code ist 2 EMA cross over mit alerts.It weigern zu arbeiten.Pls kann jemand helfen, zu kompilieren und arbeiten auf mt4 build 600 +:
#Eigenschaft Copyright "wnk"
#property link "www.wnk.com"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Kalk
#property indicator_color2 Rot
//--- Puffer
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//externe Variable......
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Initialisierungsfunktion |
//+------------------------------------------------------------------+
int init()
{
//---- Indikatoren
SetIndexStyle(0,DRAW_ARROW);
SetIndexPfeil(0,217);
SetIndexPuffer(0,ExtMapPuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexPfeil(1,217);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Benutzerdefinierte Funktion zur Deinitialisierung des Indikators |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
int start()
{
static datetime LastAlertTime = TimeCurrent();
int gezählte_Balken=IndicatorCounted(),
Grenze;
if(gezählte_Balken<0)
return(-1);
if(gezählte_Balken>0)
gezählte_Balken--;
limit=Balken-gezählt_Balken;
while(limit)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
double ema5=iMA(NULL,0,5,0,MODE_EMA,PREIS_SCHLIESSEN,0);
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PREIS_SCHLIESSEN,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PREIS_SCHLIESSEN,1);
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0);
double b4mom=iMomentum(NULL,0,14,PREIS_SCHLIESSEN,1);
//Aufwärtswarnungen
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limit]=High[limit]+5*Point;
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price UP");
//Verkaufswarnungen
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point;
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price Down");
}
return(0);
}
//+------------------------------------------------------------------+Mastercash
Probieren Sie es jetzt aus
Axel
Es ist machbar.
Einfach die offenen Orders nach dem gewünschten Typ durchsuchen und ihre offenen Preise mit dem gewünschten neuen Eröffnungskurs vergleichen oder die Bars, an denen sie geöffnet wurden, mit dem Bar vergleichen, der als Kriterium für die Öffnung dientEDIT: Es scheint, dass ich vergessen habe, die Funktion hinzuzufügen.
Würde es funktionieren, eine Funktion wie die folgende 20 Mal oder so für verschiedene "i=OrdersTotal()-1" zu schreiben und dann alle Funktionen aufzurufen und sie mit dem neuen Eröffnungspreis abzugleichen?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}
EDIT: Es scheint, als hätte ich vergessen, die Funktion hinzuzufügen.
Würde es funktionieren, eine Funktion wie die folgende 20 Mal oder so für verschiedene "i=OrdersTotal()-1" zu schreiben und dann in allen Funktionen aufrufen und sie mit dem neuen Eröffnungspreis abgleichen?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}Versuchen Sie etwas wie dies:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Sie müssen den Preis, zu dem die Order eröffnet werden soll, und die maximale Abweichung (ein absoluter Wert: z.B. nicht 5 für fünf Punkte, sondern 5*_Point) von diesem Preis eingeben. Wenn die Differenz kleiner oder gleich dieser Preisabweichung ist, wird der Preis der Order zurückgegeben, die zu diesem ungefähren Preis eröffnet wurde. Andernfalls wird -1 als Ergebnis zurückgegeben (was in diesem Fall bedeutet, dass es keine Aufträge mit ähnlichen Preisen gibt)
Versuchen Sie etwas wie dies:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Sie müssen den Preis, zu dem die Order eröffnet werden soll, und die maximale Abweichung (ein absoluter Wert: z.B. nicht 5 für fünf Punkte, sondern 5*_Point) vom Preis eingeben. Wenn die Differenz kleiner oder gleich dieser Preisabweichung ist, wird der Preis der Order zurückgegeben, die zu diesem ungefähren Preis eröffnet wurde. Andernfalls wird -1 als Ergebnis zurückgegeben (was in diesem Fall bedeutet, dass es keine Aufträge mit ähnlichen Preisen gibt)Wenn ich also prüfen möchte, ob es offene Aufträge gibt, die 2 Pips von dem Preis abweichen, zu dem ich kaufen möchte, rufe ich diese Funktion auf :
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
break;
}
}
return(TempOrderPrice);
}
Und dann eine weitere für Shorts erstellen?
Wenn ich also prüfen möchte, ob es offene Aufträge gibt, die 2 Pips von dem Preis abweichen, zu dem ich kaufen möchte, rufe ich diese Funktion auf:
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
break;
}
}
return(TempOrderPrice);
}
Und dann noch eine für kurze Hosen?Nein
Sie rufen die Funktion wie folgt auf:
if (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) erlaubt Long-Positionen und
if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) erlaubt shorts
Der Aufruf sollte von Ihrem Codeteil aus erfolgen, in dem Sie eine Logik zur Eröffnung einer Order haben.
Aber dann muss die Funktion anders sein (wie hier):
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Die Funktion deckt jetzt beide Fälle ab und Sie sollten den Code innerhalb der Funktion nicht ändern
___________________
PS: Die _Point Variable existiert nicht in älteren Versionen von Metatrader 4. Das obere Beispiel ist für den neuen metatrader4 geschrieben. Wenn Sie ältere Builds (509 oder früher) verwenden, dann sollte "_Point" "Point" sein.
Nein
Sie rufen die Funktion wie folgt auf:
Der Aufruf sollte von Ihrem Codeteil aus erfolgen, in dem Sie eine Logik zum Öffnen einer Bestellung haben.
Aber dann muss die Funktion anders aussehen (wie hier):
Die Funktion deckt nun beide Fälle ab und Sie sollten den Code innerhalb der Funktion nicht ändern
___________________
PS: Die _Point-Variable existiert nicht in älteren Versionen von metatrader 4. Das obere Beispiel ist für den neuen metatrader4 geschrieben. Wenn Sie ältere Builds (509 oder früher) verwenden, sollte "_Point" "Point" sein.Ich danke Ihnen. Ich habe die Funktion in den EA kopiert und so aufgerufen, wie Sie es geschrieben haben, aber aus irgendeinem Grund öffnet sie Positionen, obwohl es andere innerhalb der Abweichung des neuen Preises gibt. Prüft diese Funktion alle offenen Preise oder nur den letzten?
Einschließlich des EA unten.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Ich danke Ihnen. Ich habe die Funktion in den EA kopiert und so aufgerufen, wie Sie es geschrieben haben, aber aus irgendeinem Grund öffnet sie Positionen, obwohl es andere innerhalb der Abweichung des neuen Preises gibt. Prüft diese Funktion alle offenen Preise oder nur den letzten?
Einschließlich des folgenden EA.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Es gibt einen Fehler in diesem Funktionscode. Ich nahm an, dass die OrderSelect() auf Position gearbeitet und nicht überprüfen. Verwenden Sie diese:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Es sollte jetzt richtig funktionieren
Es gibt einen Fehler in diesem Funktionscode. Ich bin davon ausgegangen, dass OrderSelect() auf Position arbeitet und habe es nicht überprüft. Verwenden Sie diese Funktion:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Und das tut sie auch. Nochmals vielen Dank für deine großartige Arbeit, Mladen.
Hallo Mladen ,
könnten Sie bitte einen Blick auf diesen Code werfen? Ich versuche, den letzten Auftrag auszuwählen und zusätzliche Aufträge auf der Grundlage des letzten offenen Preises zu öffnen. Alles scheint zu funktionieren, außer dass
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
sich gegenseitig zu stören scheinen, wenn ich eine der beiden wie unten kommentiere, wird die Bestellung gut funktionieren.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
können Sie mir sagen, was ich falsch mache.
Hallo Mladen ,
Könnten Sie bitte einen Blick auf diesen Code werfen? Ich versuche, den letzten Auftrag auszuwählen und zusätzliche Aufträge auf der Grundlage des letzten offenen Preises zu öffnen. Alles scheint zu funktionieren, außer dass
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
sich gegenseitig zu stören scheinen, wenn ich eine der beiden wie unten kommentiere, wird die Bestellung gut funktionieren.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
kannst du mir sagen, was ich falsch mache.sulaimoney
Ich denke, dass das Problem nicht in diesen beiden Funktionen lag, sondern in der Art und Weise, wie der neue Metatrader 4 auf boolesche Bedingungen prüft (falls Sie einige der neuen Builds von Metatrader 4 verwenden). Ich habe den Code ein wenig vereinfacht und die eine Stelle gelöst, an der boolesche Bedingungen streng definiert werden mussten. Probieren Sie es aus