Erro em PositionClose() WIN$ - página 2

 
sheywesk:
Entendi...mas no caso eu estou usando apenas esse EA mesmo. Inseri o número mágico e adotarei para os próximos códigos (Meu primeiro contato com a linguagem foi ontem rsrs). Testei seu código mas continua na mesma em que ele tenta lançar uma ordem ao preço de 111556 quando deveria ser a 111555. Obrigado pela ajuda !! Vou analisar o depurador e tentar encontrar algo.

o índice caminha de 5 em 5, o erro é esse!


Cada ativo tem uma especificação diferente

 
Jonathan Pereira:

o índice caminha de 5 em 5, o erro é esse!


Cada ativo tem uma especificação diferente

Exato ! É exatamente isso que estou tentando resolver, erro meu não ter especificado melhor antes ! Por isso que no meu código coloco um NormalizePrice para normalizar para o ativo em questão. 
 
sheywesk:
Exato ! É exatamente isso que estou tentando resolver, erro meu não ter especificado melhor antes ! Por isso que no meu código coloco um NormalizePrice para normalizar para o ativo em questão. 

Já que alterar a função para normalizar o preço diretamente na biblioteca também não é recomendável, se quiser, teste a opção abaixo enquanto aparece uma solução melhor:

//--- Variável global
ENUM_ORDER_TYPE_FILLING OrderTypeFill;



//--- Em OnInit(): checks allowed properties
if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK)) {OrderTypeFill = ORDER_FILLING_FOK;} else {OrderTypeFill = ORDER_FILLING_IOC;}



//+--------------------------------------------------------------------------------------------------------------------+
//| Verifica se um modo de preenchimento específico é permitido                                                        |
//+--------------------------------------------------------------------------------------------------------------------+
bool IsFillingTypeAllowed(int fill_type)
  {
   //--- Obtém o valor da propriedade que descreve os modos de preenchimento permitidos
   int filling = (int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
   //--- Retorna true, se o modo fill_type é permitido
   return((filling & fill_type) == fill_type);
  }


//+--------------------------------------------------------------------------------------------------------------------+
//| This function normalizes and adjusts the price to the TICK SIZE                                                    |
//+--------------------------------------------------------------------------------------------------------------------+
double NormalizePrice(double Price)
  {
   //--- Get the minimal price change
   double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

   //--- Return the price normalized
   if(TickSize == 0.0) {return(NormalizeDouble(Price, _Digits));}

   //--- Return the price normalized and adjusted to the TICK SIZE
   return(NormalizeDouble(MathRound(Price / TickSize ) * TickSize, _Digits));
  }


//+--------------------------------------------------------------------------------------------------------------------+
//| Acronyms timeframes function                                                                                       |
//+--------------------------------------------------------------------------------------------------------------------+
string AcronymsTF(int CodeTF)
  {
   //--- Local variable
   string ResTF;

   switch(CodeTF)
     {
      case PERIOD_M1:    ResTF = " M1";    break;
      case PERIOD_M2:    ResTF = " M2";    break;
      case PERIOD_M3:    ResTF = " M3";    break;
      case PERIOD_M4:    ResTF = " M4";    break;
      case PERIOD_M5:    ResTF = " M5";    break;
      case PERIOD_M6:    ResTF = " M6";    break;
      case PERIOD_M10:   ResTF = " M10";   break;
      case PERIOD_M12:   ResTF = " M12";   break;
      case PERIOD_M15:   ResTF = " M15";   break;
      case PERIOD_M20:   ResTF = " M20";   break;
      case PERIOD_M30:   ResTF = " M30";   break;
      case PERIOD_H1:    ResTF = " H1";    break;
      case PERIOD_H2:    ResTF = " H2";    break;
      case PERIOD_H3:    ResTF = " H3";    break;
      case PERIOD_H4:    ResTF = " H4";    break;
      case PERIOD_H6:    ResTF = " H6";    break;
      case PERIOD_H8:    ResTF = " H8";    break;
      case PERIOD_H12:   ResTF = " H12";   break;
      case PERIOD_D1:    ResTF = " D1";    break;
      case PERIOD_W1:    ResTF = " W1";    break;
      case PERIOD_MN1:   ResTF = " MN1";   break;
      default:           ResTF = " NI";    break;
     }
   return(ResTF);
  }


//+--------------------------------------------------------------------------------------------------------------------+
//| This function closes all positions                                                                                 |
//+--------------------------------------------------------------------------------------------------------------------+
bool ClosePositions(string Reason)
  {
   //--- Local variables
   double          BID, ASK;
   ulong           TICKET;
   int             Cnt;

   //--- Structures Mql
   MqlTradeRequest Request;
   MqlTradeResult  Result;

   //--- Determines last price for current symbol
   BID = NormalizePrice(SymbolInfoDouble(_Symbol, SYMBOL_BID));
   ASK = NormalizePrice(SymbolInfoDouble(_Symbol, SYMBOL_ASK));

   //--- Close positions
   for(Cnt = PositionsTotal() - 1; Cnt >= 0; Cnt--)
     {
      TICKET = PositionGetTicket(Cnt);
      if(TICKET > 0)
        {
         if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MAGICNUM)
           {
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
              {
               //--- Reset Request and Result values
               ZeroMemory(Request);
               ZeroMemory(Result);
               //--- Definition of operation parameters
               Request.action       = TRADE_ACTION_DEAL;
               Request.position     = TICKET;
               Request.symbol       = _Symbol;
               Request.type         = ORDER_TYPE_SELL;
               Request.volume       = PositionGetDouble(POSITION_VOLUME);
               Request.price        = BID;
               Request.deviation    = ULONG_MAX;
               Request.type_filling = OrderTypeFill;
               Request.magic        = PositionGetInteger(POSITION_MAGIC);
               //--- Close the position
               if(!OrderSend(Request, Result))
                 {Print(_Symbol, AcronymsTF(_Period), " Error ", GetLastError()); return(false);}
               else
                 {Print(_Symbol, AcronymsTF(_Period), " - ", Reason);}
              }
            else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
              {
               //--- Reset Request and Result values
               ZeroMemory(Request);
               ZeroMemory(Result);
               //--- Definition of operation parameters
               Request.action       = TRADE_ACTION_DEAL;
               Request.position     = TICKET;
               Request.symbol       = _Symbol;
               Request.type         = ORDER_TYPE_BUY;
               Request.volume       = PositionGetDouble(POSITION_VOLUME);
               Request.price        = ASK;
               Request.deviation    = ULONG_MAX;
               Request.type_filling = OrderTypeFill;
               Request.magic        = PositionGetInteger(POSITION_MAGIC);
               //--- Close the position
               if(!OrderSend(Request, Result))
                 {Print(_Symbol, AcronymsTF(_Period), " Error ", GetLastError()); return(false);}
               else
                 {Print(_Symbol, AcronymsTF(_Period), " - ", Reason);}
              }
           }
        }
     }

   //--- Closing succeeded
   return(true);
  }
 
NormalizePrice ou Normalize tick, vc tem que prestar atenção no modo que a sua corretora esta gravando esses ticks, e conforme for, vc retira o _Point ou não, pois ja ví corretoras que colocam no indice xxx.0, por exemplo e isso ferra todos os calculos ou até mesmo no dolar colocam xxx.000, verifique se não é isso o problema
 
Vinicius de Oliveira:

Já que alterar a função para normalizar o preço diretamente na biblioteca também não é recomendável, se quiser, teste a opção abaixo enquanto aparece uma solução melhor:

Shoow ! Funcionou perfeitamente.Muito obrigado.

 
Eduardo Oliveira:
NormalizePrice ou Normalize tick, vc tem que prestar atenção no modo que a sua corretora esta gravando esses ticks, e conforme for, vc retira o _Point ou não, pois ja ví corretoras que colocam no indice xxx.0, por exemplo e isso ferra todos os calculos ou até mesmo no dolar colocam xxx.000, verifique se não é isso o problema

blzz vou dar uma olhada nisso também. Nesse meio tempo acabei encontrando um tópico que o pessoal reclama bastante pois os dados das corretoras são bem inconsistentes e acabam gerando até resultados diferentes pra o mesmo período e EA. Alguém deveria padronizar isto (ou será que alguém já fez ?) ! 

 
Sim, tem pessoas que gravam os proprios ticks, utilizando python e assim sabem que os ticks são reais
 
sheywesk:

Estou tentando encerrar as posições após certo horário no ativo WIN$ pela corretora Genial com modelação de Cada Tick(com OHLC e Tick real ocorre o mesmo erro). Porém, PositionClose() retorna 0 e trade.ResultRetCode() retorna status de done(10009) e GetLastError() retorna 4753.

Alguma sugestão do que acontece ?

Utilize a série histórica WIN$N (Sem ajustes) que vai funcionar.

Tive o mesmo problema!