Schließung von Positionen. Anzeigesignal. - Seite 5

 
komposter:
los:

Das Ergebnis ist immer noch dasselbe! Bei der letzten Variante wird nur die letzte offene Position geschlossen!

Entfernen Sie nun return nach OrderClose, und beobachten Sie das Ergebnis ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Ich habe es wie angewiesen getan. Und ein Wunder geschah. Alle offenen Positionen werden durch das Signal des Indikators geschlossen! Aber warum?
 
rid:
komposter:
los:

Das Ergebnis ist immer noch dasselbe! Bei der letzten Variante wird nur die letzte offene Position geschlossen!

Entfernen Sie nun return nach OrderClose, und beobachten Sie das Ergebnis ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Ich habe es wie angewiesen getan. Und ein Wunder geschah. Alle offenen Positionen wurden entsprechend dem Indikatorsignal geschlossen! Aber warum?
Ihre Rückkehr hat den Bearbeitungszyklus unterbrochen.
 
Ich hab's. Vielen Dank an alle, die geantwortet haben!
 
KimIV:

Normalerweise implementiere ich diese Art von Funktionalität:

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
Wie Sie sehen können, werden Funktionen geschrieben, die ganz bestimmte Aktionen ausführen. Und dann werden diese Funktionen so kombiniert, dass die gewünschte Taktik für die Arbeit mit Positionen umgesetzt wird.
Bitte, Igor, beschreibe deine Funktionsweise etwas ausführlicher, ich möchte sie verstehen, aber aufgrund meiner bescheidenen Kenntnisse verliere ich gleich am Anfang den Faden.
 
rid писал (а):
Bitte, Igor, beschreiben Sie Ihre Funktion ausführlicher. Ich möchte es verstehen, aber aufgrund meiner bescheidenen Kenntnisse verliere ich vielleicht schon am Anfang den Faden.

Dies war ein Beispiel aus einem funktionierenden EA. Funktionszuweisung:

  1. Die Funktion GetTradeSignal() füllt das Array ms[] mit Handelssignalen. Jeder Experte hat natürlich seine eigene Ausgestaltung der Funktion GetTradeSignal().
  2. Die Funktion ExistPositions() gibt das Kennzeichen für das Vorhandensein von Positionen zurück.
  3. Die Funktion ClosePositions() schließt eine oder mehrere Positionen bei Vorliegen eines entsprechenden Signals im ms[]-Array. Vor dem Schließen wird das Vorhandensein einer Position durch die Bedingung if (ExistPositions("", -1, Magic)) geprüft.
  4. Die Funktion OpenPosition() öffnet eine Position zum aktuellen Preis, wenn ein entsprechendes Signal im ms[]-Array vorhanden ist. Die Position kann nur geöffnet werden, wenn es kein Signal gibt.

Taktik:

  1. Wenn es Positionen gibt und es ein Signal zum Schließen gibt, dann schließen Sie die Positionen.
  2. Wenn keine Positionen vorhanden sind und ein Signal zur Eröffnung einer Position vorliegt, dann eröffnen Sie eine Position.

Siehst du, wie einfach es ist? :-)

 
Ja, ich danke Ihnen. Ich werde sehen, was ich herausfinden kann.
 

Hallo zusammen! Frohe Weihnachten!

Ein weiteres Problem ist aufgetaucht. Ich habe die Theorie durchgesehen, aber noch keinen Ausweg gefunden. Aus irgendeinem Grund muss ich geöffnete Positionen in meinem Expert Advisor mit dieser Funktion schließen, anstatt Stops (Stop Loss und Take Profit) zu verwenden. Ich habe es getan. Es hat geklappt! Aber...

Als ich versuchte, die Bibliothek zur Berechnung von Lots (B-Lots) in einen Expert Advisor einzufügen, stellte ich fest, dass sie auf eine unbekannte Weise zu funktionieren begann! Hätte ich MM nicht verwendet, wäre die Bilanzkurve (nach der Optimierung) stetig nach oben gegangen mit einem kaum merklichen Drawdown, nach dem Hinzufügen von MM kam es zu einem starken Einbruch! Außerdem! Auch wenn wir die B-Lots-Bibliothek entfernen und einfach die Losgröße von 0,1 auf 0,2 erhöhen, sehen wir wieder einen starken Rückgang. Auch wenn die anfängliche Einlage mehrmals erhöht wird ..... Das heißt, es liegt weder an der Bibliothek noch an der Höhe der Einlage - die Inanspruchnahme war von Anfang an miserabel... . Ich betrete den Markt auf diese Weise:

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
Hier ist alles klar und verständlich. Dann schließe ich die Positionen mit der Funktion OrderClose(. ...). Zum Beispiel so:
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
Wenn ich anfangs die Losgröße=0,1 einstelle, funktioniert der Entwurf einwandfrei! Wenn ich versuche, die Losgröße zu ändern (zu erhöhen) oder wenn ich versuche, die MM-Bibliothek zu aktivieren, wird der Vorgang abgebrochen! Ich verstehe nicht, warum? Ich habe "Lots" anstelle von OrderLots() verwendet, aber es hat sich nichts geändert. Bitte, sagen Sie es mir.
 
rid:
Wenn ich versuche, die Losgröße zu ändern (zu erhöhen) oder wenn ich versuche, die MM-Bibliothek zu aktivieren, funktioniert der Vorgang nicht! Ich verstehe nicht, warum? Ich habe "Lots" anstelle von OrderLots() verwendet, aber es hat sich nichts geändert. Bitte um Rat?
Wir müssen uns ansehen, wie der EA anders agiert.
Werden die Aufträge zur gleichen Zeit wie zuvor geöffnet/geschlossen?
 

Nein. Durch die Erhöhung des Lots von 0,1 auf 0,2 treten die Trades häufiger auf, mehr als doppelt so häufig! Mit denselben externen Parametern ... Es ist seltsam, aber ich bin nicht zu faul! Ich habe es so gemacht:

Ich habe das Schließen von Positionen mit der Funktion OrderClose entfernt und für das normale Schließen durch Stop Loss und Take Profit in der Funktion ticket=OrderSend(... ... ...) gesorgt. In diesem Fall hat der MM-Block funktioniert, wie er sollte! Es scheint, dass es auf die Funktion ankommt

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
Vielleicht sollte der Wert von "tp" entsprechend geändert werden, wenn die Menge erhöht wird?
 
Zeigen wir mit dem Finger in den Himmel? ;)

Der Fehler liegt im Code. Wo - das weiß ich nicht, denn es gibt nicht einmal einen Code. Rufen Sie die Hellseher der nächsten Filiale an ;)