Schließung von Positionen. Anzeigesignal.

 

Guten Abend, es ist ein Problem aufgetreten.

Ich muss eine Position schließen. Durch das Signal des Indikators. Außerdem muss ich in der Lage sein, die Position durch Stop Loss oder Take Profit zu schließen. (Nur für den Fall, dass das Blinkersignal zu spät kommt. - Dies geschieht häufig):

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

Anschließend lege ich fest, dass die offenen Positionen geschlossen werden sollen:

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>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

Die Positionen werden jedoch nach wie vor nur bei Stop-Loss oder Take-Profit geschlossen. (mit einer sehr seltenen - einzigen Ausnahme!)

Obwohl der Indikator auf dem Chart anzeigt, dass fast alle offenen Positionen nur durch das Signal des Indikators geschlossen werden sollten. Bitte sagen Sie mir, wo es einen Fehler geben könnte ... ?

 

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.
 
Wahrscheinlich etwas mit Stochast_1, Stochast_0, alles andere ist in Ordnung
 
Vielen Dank, KIM IV. Ich werde versuchen, es herauszufinden.
 
Integer:
Wahrscheinlich etwas mit Stochast_1, Stochast_0, alles andere ist in Ordnung


Nein..... Die Stochastik ist in Ordnung. (Arbeit an den Eröffnungspreisen)

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);
 
Der Kauf wird mit einem Gebot abgeschlossen. In diesem Fall wird der Close nur dann ausgelöst, wenn sich im aktuellen Quote-Stream ein Quote befindet, der von der angegebenen Spanne abweicht. Wenn ein solcher Quote die Liste der vom Broker geprüften Quotes noch nicht (aus Altersgründen) verlassen hat, hat der Close-Auftrag eine Chance, ausgeführt zu werden.
 

Habe ich Sie richtig verstanden? Die Kaufposition sollte geschlossen werden

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

Und die Verkaufsposition muss geschlossen werden:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); ?
 
rid:

Habe ich Sie richtig verstanden?

Im Großen und Ganzen haben Sie es richtig gemacht.

 
Ganz genau! Das Problem liegt in Ask
 

Ich will immer noch keine Positionen durch Stochastik schließen! Ich habe es richtig gemacht! Ich habe bei den externen Parametern einen Schalter eingebaut. Am Ende des Codes - separater Block für das Schließen von Positionen! Ich habe ein grünes Dreieck zum Schließen vorgesehen.

Die Taktik ist einfach: Überschreiten der durch langsame MAs gebildeten Kanalgrenzen mit Abweichungen nach oben und unten. Der Code ist sehr einfach. Nachfolgend finden Sie einen Expert Advisor.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
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_

Kann jemand einen Blick darauf werfen? Und sag mir, was falsch ist....

Vielleicht sind bei der Eröffnung einer Bestellung die Gebote und Askchi ungenau eingestellt? Das hat mich schon immer verwirrt:

ticket=AuftragSenden(Symbol(),... ....
Dateien:
 
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.