Schließung von Positionen. Anzeigesignal. - Seite 2

 

In meinem Fall war es "<=", aber die Stochastik-Werte ändern sich auch bei jedem Tick sehr stark - es gibt vier Nachkommastellen mehr, d.h. bei einem Tick können sich die Werte von (z.B.) 75,0003 auf 74,0900 ändern.

Das Zeichen "=" kann also getrost weggelassen werden. Aber natürlich, um nicht zu denken - ich denke, ich werde.

 
Ich habe mir den Experten angesehen - alles scheint korrekt zu sein. Ich konnte es nicht überprüfen - keine Anzeige.
Versuchen Sie, Print vor OrderClose hinzuzufügen und sehen Sie, ob das Close-Signal erscheint.
 

Erledigt. Hinzugefügt. Nein, .....! Die Abschlussmeldung erscheint nicht im Logbuch.

//********* Закрытие позиций ****************************************
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()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=75 && Stochast_0<75)     {
         Print ( OrderClose(OrderTicket(),OrderLots(),Bid,3,Green)); // закрываем позицию
                 return(0); // выходим
         
              }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=25 && Stochast_0>25)    {
               Print  (OrderClose(OrderTicket(),OrderLots(),Ask,3,Green)); // закрываем позицию
                 return(0); // выходим
       
              }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************

Ich verstehe das nicht! Ich habe diesen Block in einen anderen EA eingebaut. Und eine dritte. ... . Aber die Situation hat sich nicht geändert! Die Stellen sind nicht geschlossen. Obwohl selten, selten (ein- oder zweimal in der Geschichte = 1 Jahr) und blinkt ein grünes Dreieck schließen auf dem visuellen Diagramm. Aber so sollte es nicht sein! Nach dem Code zu urteilen, sollten die Positionen wie ein Nähmaschinenschiffchen schließen!

NOnLagMA-Indikator im Download

Dateien:
 

Vielleicht sollte dieser Block nicht funktionieren? Schließlich haben wir bei der Eröffnung Stopps im Code: - Stoploss und Takeprofit. Und vielleicht werden aus diesem Grund alle anderen Abschlussbedingungen ignoriert?

ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point, NULL,MagicNum, 0,CLR_NONE);

Ich werde mich auf andere Weise damit befassen müssen.

 
rid:

Ich verstehe gar nichts!

Der Positionsschließblock befand sich innerhalb der Klausel "if(OrdersTotal() == 0)".
Sie sollten aufmerksamer sein.)

Hier ist die start()-Funktion der Testvariante (ohne SL und TP, mit korrekten Meldungen und ohne unnötigen Schlupf):
int start()
  {
 
 if(Time[0] <= prevtime) 
       return(0);
 prevtime = Time[0];
  if (UseTrailing) TrailPositions();   
//----
   double NLg_Signal_0 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,0); 
   double NLg_Signal_1 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,1); 
   double NLg_long0    =iCustom(NULL,0,"NonLagMA_v5",0,NLg_buy,0,0,0,0,DV_buy,0,0);
   double NLg_short0   =iCustom(NULL,0,"NonLagMA_v5",0,NLg_sell,0,0,0,0,DV_sell,0,0);
 
  if (OrdersTotal()   == 0)//если нет открытых позиций
  { 
//---------проверяем условие на покупку-----------------      
       if   ( 
              (NLg_Signal_1<=NLg_long0)  &&
              (NLg_Signal_0>NLg_long0)  )
       { 
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера BUY" ); prevtime = Time[1]; }
       }
    //---------проверяем условие на продажу----------------- 
         if  (   
              (NLg_Signal_1>=NLg_short0)  &&
              (NLg_Signal_0<NLg_short0)  )
       { 
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера SELL" ); prevtime = Time[1]; }
       }
   }
//------------------------------------------------------------------
//********* Закрытие позиций ****************************************
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()==MagicNum)   { 
    //-----------------------------------------------------                  
    if (OrderType() == OP_BUY) { 
          if(Stochast_1>75 && Stochast_0<75)     {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                     return(0); // выходим
                    }       
         }  
     //--------------------------------------------------------
    if (OrderType() == OP_SELL) { 
          if(Stochast_1<25 && Stochast_0>25)    {
                     OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                     return(0); // выходим
                    }       
         }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************   
   return(0);
      }



Aber an Ihrer Stelle würde ich diesen EA nicht auf einem echten Konto verwenden. Es sollte in Ordnung gebracht werden, oder in "Bereitschaft", wenn Sie wollen ;)
 

Ja, natürlich. Vielen Dank für Ihre Hilfe! Ich verstehe Ihren Kommentar zu meinem Fehler.

Und ich habe Ihre Empfehlungen zur Kenntnis genommen. Bis zu einem echten Handel ist es noch ein weiter Weg...

p.s/ Alles funktioniert.... ! Und wie es funktioniert hat!

 
Die Gewinne werden durch solche Schließungen verständlicherweise nicht erhöht. Aber die Absenkung..... Oftmals sinkt sie erheblich.
 
komposter:
Ich habe mir den Code nicht angesehen.
Aber eines ist sicher: Anstelle von "if(Stochast_1>75 && Stochast_0<75)" würde ich "if(Stochast_1>75 && Stochast_0<=75)" machen.

Ein besserer Weg wäre: if(Stochast_1-75.0>0 && Stochast_0-75.0<=0), um unnötige Umwandlungen der Typen int und double zu vermeiden.
 
Und wie können wir unnötige int und double vermeiden. ? Außerdem können wir die Zahlen durch externe Parameter ersetzen - extern int Up_lim = 80; extern int Low_lim = 20;
 
rid:
Und wie können wir unnötige int und double vermeiden. ? Ich kann es nicht herausfinden. Außerdem können wir anstelle von Zahlen externe Parameter verwenden: extern int Up_lim = 80; extern int Low_lim = 20;

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

Vergleich von reellen Zahlen".