Fechamento das posições. No sinal indicador.

 

Boa noite! Surgiu um problema.

Preciso fechar uma posição. Pelo sinal do indicador. Além disso, preciso ser capaz de fechar a posição por Stop Loss ou Take Profit. (Só no caso de o sinal indicador ser muito tarde. - Isto acontece com freqüência):

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

Posteriormente, a fim de fechar as posições em aberto, estipulo:

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) { ... .... ....

No entanto, as posições ainda estão fechadas somente em caso de perda de posição ou lucro. (com uma exceção muito rara - única!)

Embora o indicador no gráfico mostre - que quase todas as posições abertas devem ser fechadas apenas pelo sinal do indicador. Por favor, me diga - onde pode haver um erro ... ?

 

Costumo implementar este tipo de funcionalidade:

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
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);
    }
  }
}
Como você pode ver, são escritas funções que executam ações bastante específicas. E então estas funções são combinadas de modo a implementar as táticas desejadas para trabalhar com posições.
 
Provavelmente algo com Stochast_1, Stochast_0, tudo o resto está bem
 
Obrigado, KIM IV. Vou tentar descobrir.
 
Integer:
Provavelmente algo com Stochast_1, Stochast_0, tudo o resto está bem


Não..... Os estocásticos estão bem. (trabalho sobre preços de abertura)

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);
 
A compra é fechada com uma licitação. Neste caso, o fechamento é acionado somente se uma cotação diferente do spread especificado estiver no último fluxo de cotação. Se tal cotação ainda não tiver conseguido (por idade) deixar a lista de cotações revisadas pelo corretor, então a ordem de fechamento tem uma chance de ser executada.
 

Eu o entendi corretamente? A posição de compra deve fechar

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

E a posição de Venda deve ser fechada:

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

Eu o entendi corretamente?

Em geral, você acertou.

 
Exatamente! O problema está em Ask
 

Ainda não querem fechar posições por estocástico! Eu fiz bem! Eu inseri um interruptor nos parâmetros externos. No final do código - bloco separado para posições de fechamento! Eu providenciei um triângulo verde para fechamento.

A tática é simples: cruzar as fronteiras do canal formado por MAs lentos com desvios para cima e para baixo. O código é muito simples. O Expert Advisor é baixado abaixo.

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

Alguém pode dar uma olhada nisso? E diga-me o que está errado....

Talvez quando se abre um pedido, as licitações e os askchi não estejam bem definidos... Sempre me confundi com isto:

ticket=OrderSend(Symbol(),... ....
Arquivos anexados:
 
Eu não olhei para o código.
Mas uma coisa é certa: em vez de "if(Stochast_1>75 && Stochast_0<75)" eu faria "if(Stochast_1>75 && Stochast_0<=75)".
Razão: