Sie müssen die Berufe filtern. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; // These else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); // Execute only on Symbol orders. double lots = NormalizeDouble(OrderLots() * Multiplier, 2); // This and below are always executed if (OrderType() == OP_BUY) // Symbol is irrelevant.
Mit geschweiften Klammern. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { // Rest of code executes only on Symbol orders. if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderType() == OP_BUY) : }
Bei einem 4-stelligen Broker, Punkt = 0,0001 if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
Fixiert und vereinfacht. PointValue = MarketInfo(OrderSymbol(), MODE_POINT); if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;
- Da alles innerhalb der geschweiften Klammern Symbol() ist, kann jede MarketInfo durch vordefinierte Variablen ersetzt werden
Zahlen nicht hart codieren. Prüfen Sie Ihre RückgabewerteWas sind Funktionsrückgabewerte? Wie verwende ich sie? -MQL4-Forum und häufige Fehler in MQL4-Programmen und wie man sie vermeidet - MQL4-Artikel | result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue); |
1. vielen Dank für Ihre Hilfe. Ich habe eine Klammer hinzugefügt, wie vorgeschlagen, aber der EA öffnet immer noch nur einen Handel auf einem Währungspaar. Es wird nicht öffnen einen Handel auf einem der anderen Charts, obwohl die Kaufbedingung erfüllt wurden. Ich habe auf diese für Wochen stecken, können Sie bitte einen anderen Blick.
2 EDIT: Nicht mehr erforderlich
3 Mein Code sieht jetzt wie folgt aus
int start() { { if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } for(int i=OrdersTotal()-1; i>=0; i--) { //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError());Wenn ein Auftrag für ein beliebiges Paar geöffnet ist, wird kein weiterer Auftrag geöffnet, bis OrdersTotal()==0 ist.
Wenn eine Order für ein beliebiges Paar geöffnet ist, wird keine weitere Order geöffnet, bis OrdersTotal()==0 ist.
Ich danke Ihnen für Ihre Hilfe. Ich muss die erste ursprüngliche Order auf nur einen Handel begrenzen. Ich möchte nicht, dass der EA weiterhin Orders öffnet, wenn die Kaufbedingung erfüllt ist. Also habe ich Orderstotal hinzugefügt, um dies zu begrenzen. Dieser Code scheint jedoch mit dem Code hier zu kollidieren
else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) //<---------- result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError());
Hier möchte ich, dass der EA nur eine Absicherung pro offenem Handel öffnet, daher OrderTotal ==1
Wie kann ich also die Anzahl der Trades am besten begrenzen, d. h. einen ursprünglichen Trade und einen Hedge-Trade? Vielen Dank
Trader3000: Wie kann man nun die Anzahl der Trades am besten begrenzen, d.h. ein Original-Trade und ein Hedge-Trade? |
|
Vielen Dank für die Hilfe von allen. Ich habe das Problem gelöst und der EA öffnet jetzt einen Handel auf allen Charts, wenn die Kaufbedingung erfüllt ist, aber nichts darunter funktioniert jetzt. Der EA ruft die Trailingstop- oder Hedge-Funktionen nicht auf. Könnte bitte jemand einen Blick darauf werfen und mich wissen lassen, was ich falsch gemacht habe, denn ich kann es nicht herausfinden.
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
Ich weiß nicht genau, was Sie tun, aber ich schlage vor, dass Sie es vermeiden, 2 Variablen zu benennen, deren einziger Unterschied ein Großbuchstabe ist. Es ist leicht, die beiden zu verwechseln, besonders wenn andere, die Ihren Code lesen, die Konvention übernommen haben, dass Variablen, die mit einem Großbuchstaben beginnen, Globalscope sind.
Es wurde keine Reihenfolge ausgewählt, also könnte OrderLots() alles Mögliche sein
if (OrderType() == OP_BUY)
Dies würde die Werte der zuletzt in der vorangegangenen Schleife ausgewählten Bestellung verwenden, wobei es sich möglicherweise nicht um die richtige magische Zahl oder das richtige Symbol handelt.
Vielen Dank für Ihre Antwort. Was ich versuche zu tun ist, haben die EA öffnen die erste ursprüngliche Handel wherethe Losgröße ist ein Prozentsatz von meinem Eigenkapital. Wenn der Handel geht gegen
Bei mir muss der EA eine Absicherung in die entgegengesetzte Richtung öffnen, aber hier muss die Lotsize das Dreifache der ursprünglichen Lotsize sein (OrderLots). Auch wenn es so aussieht, als ob keine
Ich habe jetzt die Lots direkt in die OrderSend-Funktion gesetzt, aber weder der Trailingstop noch die
die Absicherung ausgelöst wird, wenn sie sollten. Beide funktionierten perfekt, bevor ich dies hinzufügen
total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; }
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
Ich glaube, meine geschweiften Klammern {} sind nicht an der richtigen Stelle
Vielen Dank für die bisherige Hilfe. Ich mache Fortschritte. Ich habe es jetzt so hinbekommen, dass alles so zu funktionieren scheint, wie es sollte, außer dass der EA die Bedingung für die Eröffnung eines Hedge Trades ignoriert. Er öffnet manchmal (aber nicht immer) einen Hedge-Trade, auch wenn die Bedingungen nicht erfüllt sind. Auch der TrailingStop greift nicht immer. Ich glaube, mir fehlen noch irgendwo die geschweiften Klammern {}. Mein Code sieht jetzt so aus. Könnte bitte jemand für mich einen Blick darauf werfen. Danke.
int start() { total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK) if(total == 1) { result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); } } // else if (OrderType() == OP_SELL) // ...
GumRai:
This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo zusammen, ich habe alle Ratschläge, die ich in diesem Forum finden kann, ausprobiert, aber keiner scheint zu funktionieren. Kann mir bitte jemand helfen? Ich glaube, das Problem liegt an meiner OrderTotal-Funktion. Ich handele mit 10 Währungspaaren, d.h. ich habe den EA auf 10 Charts geöffnet. Es handelt sich um eine einfache Hedging-Strategie. Ich möchte, dass der EA je nach Signal einen Handel (long oder short) eröffnet. Wenn der Handel in meine Richtung geht, Trailingstop oder Take Profit. Wenn der Handel jedoch gegen mich geht, möchte ich, dass er einen Handel in die entgegengesetzte Richtung eröffnet. Der Code, den ich verwende, scheint zu funktionieren, aber dann bleibt er manchmal stecken, d.h. er eröffnet keinen Handel mehr. Außerdem, wenn ein oder zwei Handel auf einem Paar geöffnet sind, scheint er keinen Handel auf anderen Paaren eröffnen zu wollen.
Hier ist mein Code