Classe CTrade sem SL definido

 

Senhores, bom dia.

Procurei na documentação, mas não encontrei uma solução. Estou definindo entradas apenas com TP definido, sem SL, pois o SL será uma ordem à mercado quando uma condição específica for "desfeita". Então independente do preço, ele vai stopar à mercado. Só que quando uso a classe CTrade e defino uma ordem com SL com 0, ele fica dando um monte de erros parecidos com este abaixo:

failed modify #X sell X ATIVO sl: 0, tp: PREÇO -> sl: 0, tp: PREÇO [Invalid stops]

Já tentei definir o SL com valor 0, com NULL, etc. Mas não funciona.

Alguém sabe como posso enviar uma ordem usando a CTrade class sem definir um StopLoss?

Agradeço qualquer ajuda.

 
b2tradingclub:

Senhores, bom dia.

Procurei na documentação, mas não encontrei uma solução. Estou definindo entradas apenas com TP definido, sem SL, pois o SL será uma ordem à mercado quando uma condição específica for "desfeita". Então independente do preço, ele vai stopar à mercado. Só que quando uso a classe CTrade e defino uma ordem com SL com 0, ele fica dando um monte de erros parecidos com este abaixo:

failed modify #X sell X ATIVO sl: 0, tp: PREÇO -> sl: 0, tp: PREÇO [Invalid stops]

Já tentei definir o SL com valor 0, com NULL, etc. Mas não funciona.

Alguém sabe como posso enviar uma ordem usando a CTrade class sem definir um StopLoss?

Agradeço qualquer ajuda.

Define o SL com valor zero e normaliza o TP pro preco do ativo. Se nao me engano tem no CSymbol um normalizePrice. Mesmo que o preço pareça normalizado ou o vindo do mercado pareça correto, é importante normalizar o TP e o SL para evitar esse erro de invalid stop.

 
A resposta parece ser de uma tentativa de modificação de ordem, não de abertura. Nesse caso você deve pegar o valor atual do stop loss da posição, mesmo que esteja "zerado", uma outra forma de fazer, masé uma "gambiarra", valida só para testes, é colocar um valor absurdo "nunca" alcançadoo, por exemplo, no par EURUSD um stop de 5 para compra e um de .10 para venda.
 
b2tradingclubSenhores, bom dia. Procurei na documentação, mas não encontrei uma solução. Estou definindo entradas apenas com TP definido, sem SL, pois o SL será uma ordem à mercado quando uma condição específica for "desfeita". Então independente do preço, ele vai stopar à mercado. Só que quando uso a classe CTrade e defino uma ordem com SL com 0, ele fica dando um monte de erros parecidos com este abaixo: failed modify #X sell X ATIVO sl: 0, tp: PREÇO -> sl: 0, tp: PREÇO [Invalid stops] Já tentei definir o SL com valor 0, com NULL, etc. Mas não funciona. Alguém sabe como posso enviar uma ordem usando a CTrade class sem definir um StopLoss? Agradeço qualquer ajuda.


Boa noite!!


Além do que já foi orientado acima, antes de enviar o comando para modificar os stops da posição, deve ser feita a verificação abaixo também:

//+--------------------------------------------------------------------------------------------------------------------+
//| 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_ORDER_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  ORDER_TYPE_BUY:
        {
         //--- check the StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("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)
           {
            ERRMSG = StringFormat("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  ORDER_TYPE_SELL:
        {
         //--- check the StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("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)
           {
            ERRMSG = StringFormat("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 #:


Boa noite!!


Além do que já foi orientado acima, antes de enviar o comando para modificar os stops da posição, deve ser feita a verificação abaixo também:

Bom dia pessoal,

Muito obrigado pelos esclarecimentos!!!