Encerrar posição - página 3

 
Vinicius de Oliveira #:
//=== ESCOPO GLOBAL bool     flagStopDiario = false; datetime DiaAtual = 0;

cara perfeito, deu certo aqui, fazer mais alguns teste, mas ate o momento deu bom, e vou analisar toda essas modificações para futuros EAS
muito obrigado a todos

 
Na Onda #cara perfeito, deu certo aqui, fazer mais alguns teste, mas ate o momento deu bom, e vou analisar toda essas modificações para futuros EAS muito obrigado a todos

De nada! 👍

 
Na Onda #:

opa,coloquei esse codigo e mudei tudo para TimeTradeServer, porem continua a mesma coisa, 1 dia opera no outro nao opera , tenho medo disso implicar na conta real, caso eu venha a coloca ele para opera em uma vps

Provavelmente, voce esta com a chamada do HorarioFechamento dentro do OnTick() em uma escala de tempo que não permite seu robo verificar em tempo habil a condição ou não teve negocio durante o periodo, uma outra forma seria colocar no OnTimer() esse reset na variavel que dai por um intervalo ocnfigurado o codigo executa mesmo que não tenha negocio no periodo. Isso afeta o testador que mesmo entre os dias (com o mercado fechado) o codigo pode ser executado.
 
Ricardo Rodrigues Lucca #:
Provavelmente, voce esta com a chamada do HorarioFechamento dentro do OnTick() em uma escala de tempo que não permite seu robo verificar em tempo habil a condição ou não teve negocio durante o periodo, uma outra forma seria colocar no OnTimer() esse reset na variavel que dai por um intervalo ocnfigurado o codigo executa mesmo que não tenha negocio no periodo. Isso afeta o testador que mesmo entre os dias (com o mercado fechado) o codigo pode ser executado.

entende, vou analisar isso

obrigado

 
Galera como o topico estar encerrar posição, vou aproveita esse aqui mesmo beleza

no meu operacional usso bolinger, a condição de entrada e 
   for(int i=0;i<levels_values.Size();i++){
      if( rates[2].open<BufferBandDN[2] && rates[2].close<BufferBandDN[2] &&  rates[1].close>BufferBandDN[1] && BBrompimentoinverso==true){// rompimento Compra
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         break;
      }
      
      
      if( rates[2].open>BufferBandUP[2] && rates[2].close>BufferBandUP[2] && rates[1].close<BufferBandUP[1] && BBrompimentoinverso==true){// rompimento venda
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         break;
      }
   }   

apos a entrada, quando ele esta na operação, caso ele esteja vendido e venha tocar/encostar na banda superior quero que ele saia da operação, a mesma coisa se ele estiver comprado e tocar/encostar na banda inferior quero que ele saia da operação
pensando assim fiz esse codigo porem ele funciona a 1x e depois para, 

eu coloquei ele em ontick

// ...

   bool positionOpen = false;
   for (int i = PositionsTotal() - 1; i >= 0; i--)
   {
      string symbol = PositionGetSymbol(i);
      if (symbol == _Symbol)
      {
         positionOpen = true;
         break;
      }
   }

   if (rates[0].high >= BufferBandUP[0] && rates[0].low <= BufferBandUP[0] && Saida_BB && positionOpen && MathAbs(rates[0].close - BufferBandUP[0]) <= 5 * _Point)
   {
      CloseAllPositionsA();
   }



// ...

se alguem puder me ajudar


desde ja agradecido

 
Vinicius de Oliveira #:

De nada! 👍

se puder me ajudar em mais essa 👍

 
Na Onda #:
Galera como o topico estar encerrar posição, vou aproveita esse aqui mesmo beleza

no meu operacional usso bolinger, a condição de entrada e 

apos a entrada, quando ele esta na operação, caso ele esteja vendido e venha tocar/encostar na banda superior quero que ele saia da operação, a mesma coisa se ele estiver comprado e tocar/encostar na banda inferior quero que ele saia da operação
pensando assim fiz esse codigo porem ele funciona a 1x e depois para, 

eu coloquei ele em ontick

se alguem puder me ajudar


desde ja agradecido

Como já lhe dito e acredito que o codigo sofra do mesmo mal, voce esta confundindo variaveis de controle diário com variaveis de controle por operação. Dito isso, nos dois trechos do último post não permite a gente descobrir o seu problema. Dado que ele faz 1x e nenhuma outra vez pode ser que ele encerrou o "dia" na função CloseAllPositionsA.

 
Na Onda #se puder me ajudar em mais essa 👍

Especulo que para evitar esse erro, você deveria fazer mais ou menos como segue (inclua as verificações que considerar necessárias para confirmar o encerramento):

//+--------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                               |
//+--------------------------------------------------------------------------------------------------------------------+
void OnTick()
  {

// . . .

//--- Checks close buy
   if(rates[0].low <= BufferBandDOWN[0])
     {
      if(!CloseAllPositions(POSITION_TYPE_BUY))
        {
         return;
        }
     }

//--- Checks close sell
   if(rates[0].high >= BufferBandUP[0])
     {
      if(!CloseAllPositions(POSITION_TYPE_SELL))
        {
         return;
        }
     }

// . . .

  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Close all positions                                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
bool CloseAllPositions(ENUM_POSITION_TYPE type)
  {
//--- Local variables
   ulong TICKET;
   int   Cnt;

//--- Checks positions
   for(Cnt = PositionsTotal() - 1; Cnt >= 0; Cnt --)
     {
      //--- Gets the ticket and selects the position
      TICKET = PositionGetTicket(Cnt);
      if(TICKET == 0)
        {
         Print("Failed to get position ticket...");
         return(false);
        }
      //--- Checks symbol | magic number | POSITION_TYPE
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == TF0_MAGIC && PositionGetInteger(POSITION_TYPE) == type)
        {
         //--- Checks if closes position
         if(Check_SL_TP(type, PositionGetDouble(POSITION_SL), PositionGetDouble(POSITION_TP)))
           {
            if(!m_trade.PositionClose(TICKET))
              {
               Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
               return(false);
              }
           }
        }
     }

//--- Successful closing
   return(true);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Verifica se distância entre o TakeProfit/StopLoss e o preço de fechamento é maior do que SYMBOL_TRADE_STOPS_LEVEL  |
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_POSITION_TYPE type, double SL, double TP)
  {
//--- Local variables
   bool SL_check = false, TP_check = false;

//--- Gets the last price for current symbol
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- get the SYMBOL_TRADE_STOPS_LEVEL level
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- check only two order types
   switch(type)
     {
      //--- Buy operation
      case  POSITION_TYPE_BUY:
        {
         //--- check the StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            PrintFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- check the TakeProfit
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            PrintFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- return the result of checking
         return(SL_check && TP_check);
        }
      //--- Sell operation
      case  POSITION_TYPE_SELL:
        {
         //--- check the StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            PrintFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- check the TakeProfit
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            PrintFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- return the result of checking
         return(TP_check && SL_check);
        }
      break;
     }

//--- Verification succeeded
   return(false);
  }
 
Vinicius de Oliveira #:

Especulo que para evitar esse erro, você deveria fazer mais ou menos como segue (inclua as verificações que considerar necessárias para confirmar o encerramento):

Você e 1000
so troquei umas variaveis e inclui as verificações e ficou top

mais uma vez muitisimo obrigado

 
Vinicius de Oliveira #:

Especulo que para evitar esse erro, você deveria fazer mais ou menos como segue (inclua as verificações que considerar necessárias para confirmar o encerramento):

acho que comemorei cedo kkkkkkkk


ele rodou legal, porem apos algumas operações começou a dar esse erro

2023.07.15 01:42:41.090 2023.03.03 09:47:40   For order POSITION_TYPE_SELL StopLoss=0.00000 must be greater than 108978.00000 (Ask=108978.00000 + SYMBOL_TRADE_STOPS_LEVEL=0 points)

nao entende pq funcionou e depois parou

tentei normalizar ask e bid

mas nao conseguir ta erro