Schließung von Positionen. Anzeigesignal. - Seite 3

 
goldtrader:

Erstens ist es falsch, reale Stochast_ und ganze Zahlen 75 zu vergleichen, und zweitens ist es richtiger, ihre Differenz mit Null zu vergleichen.

Ich denke, dass in dieser Situation ein Fehler von 8 Dezimalstellen keinen Einfluss auf das Ergebnis haben wird.
 

Ein weiteres Problem tritt bei der Positionsschließungssperre auf. Ich habe diesen Block in meinen bevorzugten Expert Advisor eingebaut. Es eröffnet nur Geschäfte, die strikt in Richtung des Trends gehen (dazu gratuliere ich ihm...)

Aber je nach Stärke des Trends ist der Expert Advisor in der Lage (und tut es auch!), immer wieder mehrere Geschäfte zu eröffnen, - eines nach dem anderen! Hier benötige ich den Block der Schlusspositionen auf das Signal des Indikators. Aber hier liegt das Problem: Wenn mehrere Positionen innerhalb eines Trends eröffnet werden und eine Korrektur gegen den Trend einsetzt, gibt der Indikator im Block ein Signal zum Schließen. Wie ich es brauche.

Aus irgendeinem Grund werden jedoch nicht alle offenen Positionen geschlossen. Im Grunde nur die früheste. Diejenigen, die später geöffnet wurden, reagieren nicht auf das Schließsignal, sondern bewegen sich weiter. Und weiter, - "Geschichte wiederholt sich wie eine Farce"! Bei jedem Schließsignal wird nur eine, die am frühesten geöffnete Position geschlossen, und die anderen bewegen sich weiter! Das Los aller Positionen ist konstant.

Hier ist das Diagramm für den visuellen Modus. Das Schließen durch das Signal des Indikators wird mit einem grünen Dreieck gekennzeichnet. Es ist deutlich zu erkennen, dass durch das Signal jedes Mal nur eine Position geschlossen wird. Ich möchte, dass alle offenen Stellen geschlossen werden! Bitte teilen Sie mir mit, was der Grund dafür ist.

Eine Erinnerung an den Code :

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

Ein weiteres Problem ergibt sich mit dem Closing Block...

Wo befindet sich die Schleife von OrdersTotal()?
 
granit77:
Wo befindet sich die Schleife von OrdersTotal()?
Selbst wenn es eine gibt, ist sie von 0 bis OrdersTotal()-1, und es sollte umgekehrt sein ;)
 

Nein, das ist hier nicht der Fall. Aufträge werden - unterschiedlich - definiert:

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

Und diese Version des Codes ist für mich viel bequemer! Denn meine Long- und Short-Positionen werden unabhängig voneinander eröffnet.

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

Mit dem Standardverschluss ist es aber immer noch dasselbe. ...

if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

Mit dem Standardverschluss ist es aber immer noch dasselbe. ...

if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Versuchen Sie, eine umgekehrte Schleife von OrdersTotal bis 0 zu machen. Das sollte helfen.
 

Wie kann man das tun? Bitte schreiben Sie mir, wenn es Sie nicht zu sehr belastet. Hier ist übrigens der Chart - mit dem obigen "Standard": Alles ist gleich - nur eine Position schließt auf das Signal des Indikators -

 
rid:

Wie macht man das?

Nach Komposter und Vinin, statt:
for (int v=0; v<OrdersTotal(); v++)

schreiben:
for (int v=OrdersTotal()-1; v>0; v--)

Das funktioniert bei mir.
 
granit77:
los:

Wie machen Sie das?

Wenn man Komposter und Vinin Glauben schenkt, dann eher nicht:
for (int v=0; v<OrdersTotal(); v++)

schreiben:
for (int v=OrdersTotal()-1; v>0; v--)

Das funktioniert bei mir.

Sie haben völlig Recht. Obwohl KimV über Skripte und Bibliotheken verfügt, die all dies implementieren. Vielleicht sollten Sie in seinem Forum danach suchen.
Grund der Beschwerde: