Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1098

 
wishmast:

Leute, ich habe mir schon den Kopf zerbrochen. Wie bringe ich den EA dazu, Pending Orders auf Hochs und Tiefs zu platzieren, z.B. 8 Kerzen, mit einem Take Profit von 1/4.

Ich mache das in etwa so:

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0);

double TP=((Vhod1-Vhod2)/4)+Vhod1;


Ich habe versucht, die Parameter zu ändern, aber ich erhalte immer falsche Stopps oder setze den Preis auf 7.00000; es ist unklar, woher das kommt

MitiHighest, iLowest erhalten Sie die Adresse der Kerzenständer, aber nicht den Preis.
 
evillive:
iHighest, iLowest gibt die Adresse der Kerze an, nicht den Preis.

Das ist richtig. Wir brauchen

double Vhod1=iHigh(Symbol(), 0, iHighest(Symbol(),0,MODE_HIGH,8,0));

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0));

 
alvlaf:


Ich habe es falsch eingegeben, aber es hätte trotzdem nicht richtig funktioniert, weil... Denn.) Jedenfalls sollte es so ablaufen:

1) Erstellen Sie eine AllowNewOrders-Variable in der Inite (falls sie nicht existiert)

2) Erstellen Sie eine neue Order, bis diese geschlossen wird, ist OnTick dieses Symbols inaktiv, wird aber OnTick eines anderen Symbols ausgeführt

3) Führen Sie Schritt 2 für die anderen Symbole aus, bis das Limit von MaxOpenOrders erreicht ist.

4) Wenn der Auftrag beendet ist und er einen Verlust oder einen Wert von Null aufweist, verbiete die Eröffnung neuer Aufträge für alle Kopien durch AllowNewOrders

[Hier ist das unmittelbare Problem - wenn die Verlustserie endet, ist AllowNewOrders=1, aber was ist, wenn MaxOpenOrders>1 ist und es mehrere dieser Sitzungen gibt?]

5) Wenn Punkt 4 nicht erfüllt ist, können Sie neue Aufträge eröffnen.

Das Programm MUSS funktionieren, wenn MaxOpenOrders=1 ist. Vielleicht gibt es ein Problem, wenn wir neue Aufträge nach einem unrentablen Auftrag verbieten AllowNewOrders=0 und der nächste OrderSend aus irgendeinem Grund den Auftrag nicht öffnet. Ich werde im Folgenden schreiben, wie ich mich für diesen Fall absichere...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

Ich werde weiter unten schreiben, wie ich mich für diese Eventualität absichere...

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

Wenn die Fehlerbehebung richtig vorausgesehen wird, erhöht sich die Erfolgsquote bei der Eröffnung eines Auftrags.

 
Hallo! Bitte beraten Sie mich, wenn ich die Funktion aus dem Beitrag (jede Bestellung hat ihren eigenen Zauberer) - http://forum.forexpeoples.ru/showthr...=1#post1715092 verwende, wie würde es aussehen, um die letzten Bestellungen für Verkäufe oder Käufe zu finden, oder eine Reihe von Bestellungen zu aktualisieren, wenn nicht jede Bestellung ihren eigenen Zauberer hat, sondern jede Reihe von Bestellungen ihren eigenen Zauberer hat. D.h. es wird davon ausgegangen, dass, wenn eine neue Auftragsserie mit einer eigenen Magie eröffnet wird, die alten Auftragsserien weiterhin ihre eigenen Aufträge mit ihren eigenen Magien eröffnen. Für jede Serie wird ein eigener Gewinn erwartet, und es gibt viele solcher Auftragsserien.

Wie kann sich der nachstehende Code unter solchen Bedingungen ändern?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;

Ich habe den Code so eingestellt, dass beim Öffnen der ersten Aufträge einer Serie ein Zauber erzeugt wird, aber hier ist das Problem beim Öffnen neuer Aufträge in derselben Serie.

Der Code selbst, um die Magie aus dem Beitrag zu generieren:
//+------------------------------------------------------------------+
// get the next magic in the series
int getNextMagicNumber(){
int magic = EMPTY;

if (OrdersTotal() == 0) {
return(startMagicNumber);
}

for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}

if (magic == EMPTY){
magic = startMagicNumber; // erster in der Reihe
} else {
magic++; // nächster in der Reihe
}

return(magic);
}
//+------------------------------------------------------------------+
// keekkenen: Prüfung auf eine Order im Markt mit einer bestimmten magic
int checkMarketByMagic(int magic){
for(int i = 0; i < OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
 
Guten Tag, meine Herren des Forums,
entschuldigen Sie, wenn ich die Themen durcheinander gebracht habe, aber ich habe nicht den richtigen Ort gefunden, um das THEMA zu posten, also treten Sie mich nicht.

Manchmal, wenn ich im Internet nach neuen Expert Advisors suche, stoße ich auf einen, den ich nicht beachtet habe, weil seine Beschreibung Standard ist, von denen es viele gibt.

Wenn ich es nicht bemerkt hätte, wäre mir sein Name entgangen. Vielleicht gibt es einen ähnlichen Berater, der ähnliche Aktionen durchführt.

Ich werde die Bedeutung des Expert Advisors beschreiben (es ist nichts sehr Ausgeklügeltes, was ich jetzt brauche).

Grob gesagt, würde die Aufgabe folgendermaßen aussehen:

1. Eröffnen Sie eine Position manuell, zum Beispiel kaufen.
2. Der Expert Advisor setzt Stop Loss und Take Profit entsprechend den Einstellungen.
3. Die Order wird beim Takeprofit geschlossen - der EA eröffnet sofort einen weiteren Kauf und setzt denselben Stoploss und Takeprofit, bis er den ersten Stoploss auffängt oder es einen ultimativen Takeprofit gibt.
4. Wenn die Position durch Stop Loss geschlossen wird, tut der Roboter nichts mehr. Der Expert Advisor wartet darauf, dass der nächste Auftrag manuell eröffnet wird.

Das ist alles.

Ich wäre Ihnen sehr dankbar.
 
A13ksandr:


Ich habe ihn falsch eingefügt, aber er funktioniert trotzdem nicht richtig, weil... Denn.) Jedenfalls ist es so:

1) Erstellen Sie eine Variable AllowNewOrders im initem (falls sie nicht existiert)

2) Erstellen Sie einen neuen Auftrag, bis er geschlossen wird OnTick dieses Symbols ist inaktiv, aber OnTick des anderen Symbols funktioniert

3) Führen Sie Schritt 2 für die anderen Symbole aus, bis das Limit von MaxOpenOrders erreicht ist.

4) Wenn der Auftrag beendet ist und er einen Verlust oder einen Wert von Null aufweist, verbiete die Eröffnung neuer Aufträge für alle Kopien durch AllowNewOrders

[Hier ist das unmittelbare Problem - wenn die Verlustserie endet, ist AllowNewOrders=1, aber was ist, wenn MaxOpenOrders>1 ist und es mehrere dieser Sitzungen gibt?]

5) Wenn Punkt 4 nicht erfüllt ist, können Sie neue Aufträge eröffnen.

Das Programm MUSS funktionieren, wenn MaxOpenOrders=1 ist. Vielleicht gibt es ein Problem, wenn wir neue Aufträge nach einem unrentablen Auftrag verbieten AllowNewOrders=0 und der nächste OrderSend aus irgendeinem Grund den Auftrag nicht öffnet. Ich werde weiter unten schreiben, wie ich mich für diesen Fall absichern werde.

Danke Alexander, ich werde es morgen überprüfen. (daher das Problem sofort - wenn Verlustserie endet, AllowNewOrders=1, und wenn MaxOpenOrders>1 und es mehrere Sitzungen gibt?] Wenn MaxOpenOrders>1 um einen bestimmten Wert ist, sollte AllowNewOrders=1 auch um den gleichen Wert größer sein. Aber wir brauchen uns damit nicht zu befassen und MaxOpenOrders sollte überhaupt entfernt werden, da in dieser Version des Programms ohnehin nicht mehr als eine Serie geplant ist.
 
alvlaf:
Danke Alexander, ich werde es morgen überprüfen. (daher das Problem sofort - wenn die Verlustserie endet, AllowNewOrders=1, aber wenn MaxOpenOrders>1 und es mehr als eine Sitzung gibt?] Wenn MaxOpenOrders>1 um einen bestimmten Wert ist, sollte AllowNewOrders=1 auch um den gleichen Wert größer sein. Aber ich brauche mich damit vorerst nicht zu befassen und MaxOpenOrders sollte ganz weggelassen werden, da in dieser Version des Programms ohnehin nicht mehr als eine Serie geplant ist.
Ich habe es ausprobiert, die ersten fünf Minuten hat es gut funktioniert, dann habe ich angefangen, mehrere Geschäfte (4) auf einmal zu öffnen und für dasselbe Paar mit größerer Menge. Alexander, ich verstehe nicht ganz, wie die globale Variable in Ihrer Version ihren Wert erhält und ändert?
 

Hallo zusammen!

Hier sehen Sie ein grafisches Objekt in einem Diagramm.

Seine Parameter sind Zeit, Wert und Code. Der Wert entspricht dem Preis, zu dem sich das Objekt befindet.

Gibt es eine Möglichkeit, die Zeit und den Wert zu erhalten (durch eine Funktion oder etwas anderes)?

\\\\\

Oder, in einem breiteren Kontext, gibt es irgendwelche Objekte (abgesehen von Trendlinien, Fibonacci-Linien, Tölpeln), die es uns ermöglichen, ihre Zeit und ihren Preis sofort zu erhalten?

Ich muss einige Marker auf der Karte platzieren und Informationen von ihnen erhalten. Zeichnen von Trendlinien, Fibo, etc... - Es ist furchtbar umständlich und langsam...

Vielen Dank für die Antworten!

PS Habe gerade mit dem Studium begonnen...

 
ilmel:

Hallo zusammen!

Hier ist ein grafisches Objekt in einem Diagramm.

Seine Parameter sind Zeit, Wert und Code. Der Wert entspricht dem Preis, zu dem sich das Objekt befindet.

Gibt es eine Möglichkeit, die Zeit und den Wert zu erhalten (durch eine Funktion oder etwas anderes)?

\\\\\

Oder, in einem breiteren Kontext, gibt es irgendwelche Objekte (abgesehen von Trendlinien, Fibonacci-Linien, Tölpeln), die unmittelbar aus Zeit und Preis abgeleitet werden können?

Ich muss einige Markierungen auf der Karte anbringen und Informationen von ihnen erhalten. Zeichnen von Trendlinien, Fibo, etc... - Es ist furchtbar umständlich und langsam...

Vielen Dank für die Antworten!

PS Habe gerade mit dem Studium begonnen...

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger