[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 190

 

Sergey Dubakin hat mir freundlicherweise die CloseBy-Funktion angeboten, aber leider erfüllt sie nicht die für mich wichtige Bedingung, eine Position mit maximalem Verlust mit der gegenüberliegenden Position mit maximalem Gewinn zu schließen:


Avatar
19
Diubakin 25.02.2013 23:26
borilunad:
Uv. pro! Wo kann ich die Funktion СloseBy() finden, die im manuellen Modus funktioniert? Ich möchte es in meine Eule einzufügen, um in der Lage sein, nicht manuell, sondern automatisch nach den Bedingungen, um die Position mit einem maximalen Minus das Gegenteil mit einem maximalen Plus zu schließen. Ich konnte sie in der Codebase nicht finden. Ich habe sie in der Codebase nicht gefunden. Vielen Dank!

Versuchen Sie diese Variante:

bool LockOFF(int posit, int oppos, color arrow_color) {
double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }

Ich habe Funktionen erstellt, die maxloss GetMaxLoss() und maxprofit GetMaxProfit() definieren, aber ich kann LockOFF() nicht dazu bringen, ein von mir angegebenes Paar anstelle eines der beiden auszuwählen. Bitte zeigen Sie mir, an welcher Stelle meine Maxima zu setzen, und vielleicht brauche ich mehr Funktionen, um das Ticket oder Index dieser Positionen zu bestimmen, dann ist es kein Problem für mich, aber wo es alle in diesem LockOFF() setzen? Danke!

 
borilunad:

Sergey Dubakin hat freundlicherweise die Funktion CloseBy angeboten, aber leider erfüllt sie eine für mich wichtige Bedingung nicht, nämlich das Schließen einer Position mit maximalem Verlust durch eine gegenüberliegende Position mit maximalem Gewinn.

Hallo, diese Funktion schließt eine Position mit einem maximalen Verlust mit der gegenüberliegenden Position mit einem maximalen Gewinn. Hier ist ein Test-EA für den Tester:

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

Er eröffnet abwechselnd Kauf- und Verkaufspositionen, wenn ein neuer 4-Stunden-Balken erscheint, und schließt eine entgegengesetzte Position, wenn ein neuer Tag beginnt.

 
Diubakin:

Hallo, die Funktion schließt die Position mit dem maximalen Verlust mit der gegenüberliegenden Position mit dem maximalen Gewinn. Hier ist ein Test-EA für den Tester:

Er eröffnet abwechselnd Kauf- und Verkaufspositionen, wenn ein neuer 4-Stunden-Balken erscheint, und schließt eine entgegengesetzte Position, wenn ein neuer Tag beginnt.

Hallo Sergey, ich habe einen anderen Algorithmus! Das Problem ist, dass diese Funktion schließt, was sie hat, und ich brauche sie, um das Maximum zu schließen, nicht irgendeine! Nun, nichts, ich werde es selbst beenden, wenn mir niemand hilft! Ihre Version ist nur für den Tester gut, so dass die Kopfzeile nach den Regeln hinzugefügt. Funktioniert fehlerfrei, wählt aber nicht das Maximum! Trotzdem danke ich Ihnen für Ihre Hilfe!
 
alsu:

OK, jetzt habe ich es. Wenn der Kurs des aktuellen Balkens Open[0] + 30 erreicht, wird eröffnet. Wenn der Balken beendet wurde, hat sich Open[0] geändert und der Open Level wird entsprechend verschoben. Es sollte nur einen Handel auf dem Markt geben, richtig?

Dann ist es so:

Es ist nicht notwendig, den neuen Balken zu verfolgen, denn wenn er gebildet wird, fügt das System automatisch einen neuen Wert zu Open[0] hinzu, so dass das neue Niveau korrekt berechnet wird. Bitte beachten Sie, dass das BUY-Geschäft zum aktuellen Ask-Kurs eröffnet wird, während es zum Bid-Kurs geschlossen wird (TP und SL). Darüber hinaus sollten die Preiswerte normalisiert werden.


Herzlichen Dank für Ihre Hilfe.

Eröffnet aber im Tester bei jeder Minutenkerze den Handel. Die Informationen finden Sie unter diesem Link http://clip2net.com/s/2T98Y

Ich möchte, dass eine Order bei einer Fünf-Minuten-Kerze eröffnet wird, aber nicht bei jeder Kerze.

Aber nur, wenn die aktuelle Fünf-Minuten-Kerze > oder = 30 Pips ist (vom Eröffnungskurs bis zu seinem Maximum).

D.h., eröffnen Sie eine Marktorder zum dreißigsten Punkt ab dem Eröffnungskurs der Null=aktuellen Fünf-Minuten-Kerze.

Und wenn die aktuelle Fünf-Minuten-Periode vom Eröffnungskurs bis zu seinem Maximum weniger als 30 Punkte beträgt, sollten wir keine Marktorder eröffnen.

D.h. die Aufträge werden ein wenig, ich habe in Excel gezählt, seit 1999 - ein wenig mehr als 3000 auf Euro-Dollar in beide Richtungen sein.

Wir wechseln zur nächsten Fünf-Minuten-Periode und wenn sie, d.h. die aktuelle Fünf-Minuten-Periode > oder = 30 Pips ist, dann eröffnen wir bei den dreißigsten Pips, wenn weniger, wechseln wir zur nächsten Fünf-Minuten-Periode ... und so weiter bis zum Ende des Charts.

Aber die Sache ist die, dass nach einer groben Schätzung die meisten Fünf-Minuten-Pläne, die > oder = 30 Punkte sind, viel häufiger über 15 Punkte hinausgehen als bei 30 Punkten geschlossen werden.

Sie haben eine Bedingung - wenn es keine offenen Aufträge gibt

In meinem System können jedoch zwei Fünf-Minuten-Perioden mit den oben beschriebenen Parametern hintereinander gebildet werden, und wenn der Auftrag aus der vorherigen Fünf-Minuten-Periode nicht geschlossen wird, dann wird in der zweiten Fünf-Minuten-Periode kein Auftrag eröffnet.

Ich möchte, dass in jeder Fünf-Minuten-Periode ein Auftrag mit den oben beschriebenen Parametern eröffnet wird, unabhängig davon, ob es Aufträge im Handel gibt oder nicht.

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

Das war's, jetzt habe ich es. Wenn der Kurs des aktuellen Balkens Open[0] + 30 erreicht, wird eröffnet. Wenn der Balken beendet wurde, hat sich Open[0] geändert, und das Eröffnungsniveau wird entsprechend verschoben. Es sollte nur einen Handel auf dem Markt geben, richtig?

Dann ist es so:

Es ist nicht notwendig, den neuen Balken zu verfolgen, denn wenn er gebildet wird, fügt das System automatisch einen neuen Wert zu Open[0] hinzu, so dass das neue Niveau korrekt berechnet wird. Bitte beachten Sie, dass das BUY-Geschäft zum aktuellen Ask-Kurs eröffnet wird, während es zum Bid-Kurs geschlossen wird (TP und SL). Darüber hinaus sollten die Preiswerte normalisiert werden.


Und Sie haben auch eine zweite Bedingung - wenn der Schlusskurs der aktuellen fünf Minuten >= Eröffnungskurs des Auftrags.

Aber in meiner Idee kann der Schlusskurs der aktuellen 5-Minuten-Periode ein beliebiger Kurs sein, solange sein Hoch > oder = 30 Pips ist.


Close[0]>=Price

 
borilunad:
Hallo Sergei, ich habe einen anderen Algorithmus! Das ist die Sache, diese Funktion schließt, was sie hat, und ich will, dass sie die maximalen schließt, nicht irgendwelche! Nun, nichts, ich werde es selbst beenden, wenn mir niemand hilft! Ihre Version ist nur für den Tester gut, so dass die Kopfzeile nach den Regeln hinzugefügt. Funktioniert fehlerfrei, wählt aber nicht das Maximum! Trotzdem danke ich Ihnen für Ihre Hilfe!

Wie wollen Sie es haben? Das von mir gepostete Modell ermittelt die unrentabelste Position in der Einzahlungswährung(in Geld), ermittelt dann die rentabelste Gegenposition ebenfalls in der Einzahlungswährung und führt eine Gegenposition aus.

borilunad:

Ich habe Funktionen implementiert, die den maximalen Verlust GetMaxLoss() und den maximalen Gewinn GetMaxProfit() bestimmen, aber ich kann die Funktion LockOFF() nicht dazu bringen, ein von mir angegebenes Paar auszuwählen und nicht irgendeines von ihnen. Bitte zeigen Sie mir, an welcher Stelle meine Maxima zu setzen, und vielleicht brauche ich mehr Funktionen, um das Ticket oder Index dieser Positionen zu bestimmen, dann ist es kein Problem für mich, aber wo es alle in diesem LockOFF() setzen? Danke!

Die Funktion hat es in sich - sie definiert den maximalen Verlust, den maximalen Gewinn und auch das Ticket.

 
Diubakin:

Wie wollen Sie es haben? Die von Ihnen gepostete Position ermittelt die unrentabelste Position in der Einzahlungswährung (in Geld), ermittelt dann die rentabelste Gegenposition ebenfalls in der Einzahlungswährung und führt eine Gegenposition durch.

Die Funktion hat alles - sie definiert den maximalen Verlust, den maximalen Gewinn und auch das Ticket ist definiert.

Sie irren sich! Wahrscheinlich haben Sie das einzige Paar von gegensätzlichen Positionen, während ich mehr haben kann. Deshalb habe ich alle Daten in den Kommentaren und sehen, dass es schließt nicht maxiLoss maxiProfit, aber einer der ersten, die ich komme über. Und meine Funktionen zeigen deutlich Positionsindizes mit maximalem Verlust und Gewinn. Es bleibt nur noch, diese Prüfungen zu LockOFF() hinzuzufügen!
 
borilunad:
Sie irren sich! Sie haben wahrscheinlich das einzige Paar entgegengesetzter Positionen, während ich vielleicht mehr habe, weil ich alle Daten in den Kommentaren angezeigt habe und sehe, dass es nicht maxiLoss maxiProfit schließt, sondern eine der ersten, die in der Suche auftauchen. Und meine Funktionen zeigen deutlich Positionsindizes mit maximalem Verlust und Gewinn. Ich muss nur diese Prüfungen zu LockOFF() hinzufügen!
Haben Sie den Test-EA für diese Funktion im Tester gesehen? Er schließt genau den maximalen Verlust mit dem maximalen Gewinn ab, egal wie viele Aufträge es gibt - zwei oder zwanzig.
 
Vinin:

https://www.mql5.com/ru/code/7835 Nur dies ist ein Indikator. Sie müssen Objekte in einem EA verwenden.
Es ist der Expert Advisor, an dem ich interessiert bin, Objekte - soll ich selbst eine Kerze zeichnen?
 
Diubakin:
Haben Sie sich den Test EA für die Funktion im Tester angesehen? Er schließt genau den maximalen Verlust mit dem maximalen Gewinn, egal wie viele Aufträge es gibt - zwei oder zwanzig.
Natürlich, das habe ich! Stimmt, ich habe nicht mehr als drei. Ich habe überall nachgeschaut, im Tester in den Ergebnissen und im Journal, auf der Demo und auch in der Tabelle! Wenn ich das tue, zeige ich es dir!
Grund der Beschwerde: