Fechamento das posições. No sinal indicador. - página 5

 
komposter:
livrar:

O resultado ainda é o mesmo! Com a última variante, apenas a última posição aberta é fechada!

Agora retire o retorno após o OrderClose, e observe o resultado ;)

//----------------------------------------------------------------------
 // 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_ 
 //****************************************************************************
Eu o fiz conforme as instruções. E um milagre aconteceu. Todas as posições abertas são fechadas pelo sinal do indicador! Mas por quê?
 
rid:
komposter:
livrar:

O resultado ainda é o mesmo! Com a última variante, apenas a última posição aberta é fechada!

Agora retire o retorno após o OrderClose, e observe o resultado ;)

//----------------------------------------------------------------------
 // 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_ 
 //****************************************************************************
Eu o fiz conforme as instruções. E um milagre aconteceu. Todas as posições abertas foram fechadas de acordo com o sinal indicador! Mas por quê?
Seu retorno interrompeu o ciclo de processamento.
 
Entendi. Obrigado a todos que responderam!
 
KimIV:

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 de trabalhar com posições.
Por favor, Igor, descreva sua funcionalidade com um pouco mais de detalhe. Eu quero compreendê-la, mas devido ao meu modesto conhecimento, perco minha linha de pensamento logo no início.
 
rid писал (а):
Por favor, Igor, descreva sua função com mais detalhes. Quero compreendê-lo, mas por causa de meu modesto conhecimento posso perder meu trem de pensamento logo no início.

Este foi um exemplo tirado de um EA em funcionamento. Atribuição de funções:

  1. Função GetTradeSignal() preenche a matriz ms[] com sinais comerciais. Cada especialista tem seu próprio recheio da função GetTradeSignal(), é claro.
  2. Função ExistPosições() retorna a bandeira de presença de posição.
  3. Função ClosePositions() fecha uma ou mais posições em presença de um sinal correspondente em ms[] array. Antes de fechar, a presença de uma posição é verificada pela condição se (ExistPositions("", -1, Magic)).
  4. Função OpenPosition() abre uma posição ao preço atual na presença de um sinal correspondente na matriz ms[]. A posição só pode ser aberta se não houver sinal.

Táticas:

  1. Se houver posições e houver um sinal para fechar, então feche as posições.
  2. Se não houver posições e houver um sinal para abrir uma posição, então abra uma posição.

Você vê como é fácil? :-)

 
Sim, obrigado. Vou ver o que posso descobrir.
 

Olá a todos! Feliz Natal!

Outro problema surgiu. Eu procurei na teoria, mas ainda não encontrei uma saída. Por algum motivo, preciso fechar posições abertas em meu consultor especializado usando a função em vez de usar paradas (Stop Loss e Take Profit). Já o fiz. Funcionou! No entanto...

Ao tentar inserir em um Expert Advisor a biblioteca para calcular lotes (B-lots), descobri que ela começou a trabalhar de uma maneira desconhecida! Se eu não tivesse usado MM, a curva de equilíbrio (após a otimização) subiu constantemente com um drawdown quase imperceptível, depois de adicionar MM eu de repente tive uma queda brusca! Além disso! Mesmo que removamos a biblioteca de lots B e simplesmente aumentemos o tamanho do lote de 0,1 para 0,2, vemos mais uma vez uma forte arrancada. Mesmo quando o depósito inicial é aumentado em várias vezes ..... Ou seja, não é a biblioteca nem o tamanho do depósito - o saque foi miserável para começar... . Eu entro no mercado assim:

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
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);}
              }
              }
Tudo é claro e compreensível aqui. Então eu fecho posições usando a função OrderClose(. ...). Assim:
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);}
                               }
}}}
Quando eu inicialmente configuro o lote=0,1, o projeto funciona bem! Quando eu tento mudar o tamanho do lote (aumentar) ou quando eu tento habilitar a biblioteca MM, a operação é quebrada! Eu não consigo entender por quê? Eu usei "Muito" em vez de OrderLots(), mas nada mudou. Por favor, me diga.
 
rid:
Com o lote inicial=0,1 o projeto funciona bem! Quando tento mudar o tamanho do lote (aumentar) ou quando tento ativar a biblioteca MM - a operação é quebrada! Eu não consigo entender por quê? Eu usei "Muito" em vez de OrderLots(), mas nada mudou. Por favor, aconselhar?
Temos que ver como a EA age de forma diferente.
As ordens são abertas/fechadas ao mesmo tempo que antes?
 

Não. Aumentando o lote de 0,1 para 0,2 comércios começa a ocorrer com mais freqüência, mais do dobro da freqüência ! Com os mesmos parâmetros externos ... É estranho, mas eu não era muito preguiçoso! Eu o fiz assim:

Eu removi o fechamento de posições usando a função OrderClose, e providenciei o fechamento normal por Stop Loss e Take Profit na funçãoOrderSend(... ... ...). Neste caso, o bloco MM funcionou como deveria! Parece que é tudo uma questão de função

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
Talvez o valor do "tp" deva ser alterado de acordo com o aumento do lote?
 
Estamos apontando dedos para o céu? ;)

O erro está no código. Onde - não sei, porque não há sequer um código. Chamar os clarividentes do próximo ramo ;)