Hilfe bei der Codierung - Seite 242

 
Mastercash:
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

Dateien:
_test_mc.mq4  3 kb
 
mladen:
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 dient

EDIT: 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);

}

 
BlackCoq:
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 OpenOrderPrice(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();

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)

 
mladen:
Versuchen Sie etwas wie dies:
double OpenOrderPrice(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();

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?

 
BlackCoq:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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.

 
mladen:
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.

//+------------------------------------------------------------------+//| expert start function |

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

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)

//----
 
BlackCoq:
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.

//+------------------------------------------------------------------+//| expert start function |

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

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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

 
mladen:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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);

}

Jetzt sollte es richtig funktionieren

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.

Dateien:
564.mq4  10 kb
 
sulaimoney:
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

Dateien:
564_1.mq4  10 kb
Grund der Beschwerde: