Ordem com alteração no takeproit e stoploss - página 2

 

Fiz algumas alterações no código, mas confesso que estou no limite do meu atual conhecimento. Preciso estudar mais, mas o consolo é que o código compila rsss

Incluí uns "Print"s para apenas acompanhar os valores das negociações.

Só vou conseguir testar na segunda-feira, mas toda crítica é bem-vinda.

 
fabriciopduarte #:
#include <Trade/SymbolInfo.mqh>
void OnStart()
  {
   CSymbolInfo csi;
   csi.Name(_Symbol);
//---
   Print(_Symbol);
   Print(csi.NormalizePrice(33.999));
   Print(csi.NormalizePrice(33.901));
   Print(csi.NormalizePrice(33.991));
  }

Eu tava me referendo ao Name() desse jeito acima. Esse codigo serviria mais pra testar os "ajustes". Lembrando que se voce tiver mais de um ativo que vai abrir ordem o _Symbol (que se refere ao ativo que o script/ea esta anexado) pode ser que tenha que ser trocada.

 
Ricardo Rodrigues Lucca #:

Eu tava me referendo ao Name() desse jeito acima. Esse codigo serviria mais pra testar os "ajustes". Lembrando que se voce tiver mais de um ativo que vai abrir ordem o _Symbol (que se refere ao ativo que o script/ea esta anexado) pode ser que tenha que ser trocada.

Usar o TRADE_ACTION_SLTP ajudaria a reposicionar o takeprofit e stoploss considerando o valor de entrada na derrapagem?

Nas referências do MQL5 vi o seguinte código:

 
#define EXPERT_MAGIC 123456  // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Modificação do Stop-Loss e Take-Profit da posição                |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- declaracão do pedido e o seu resultado
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // número de posições abertas   
//--- iterar sobre todas as posições abertas
   for(int i=0; i<total; i++)
     {
      //--- parâmetros da ordem
      ulong  position_ticket=PositionGetTicket(i);// bilhete da posição
      string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número de signos depois da coma
      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição
      double volume=PositionGetDouble(POSITION_VOLUME);    // volume da posição
      double sl=PositionGetDouble(POSITION_SL);  // Stop Loss da posição
      double tp=PositionGetDouble(POSITION_TP);  // Take-Profit da posição
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // tipo da posição
      //--- saída de informações sobre a posição
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- se o MagicNumber coincidir, o Stop-Loss e o Take-Profit não estão definidos
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        { 
         //--- cálculo dos níveis de preços atuais
         double price=PositionGetDouble(POSITION_PRICE_OPEN);
         double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
         double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
         int    stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
         double price_level;
         //--- se o nível de deslocamento mínimo permitido em pontos a partir do preço atual de fechamento não estiver definido
         if(stop_level<=0)
            stop_level=150; // definimos o deslocamento em 150 pontos a partir do preço atual de fechamento
         else
            stop_level+=50; // definimos o nível de deslocamento (SYMBOL_TRADE_STOPS_LEVEL + 50) pontos para a confiabilidade
 
         //--- cálculo e arredondamento dos valores Stop-Loss e Take-Profit
         price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
         if(type==POSITION_TYPE_BUY)
           {
            sl=NormalizeDouble(bid-price_level,digits);
            tp=NormalizeDouble(ask+price_level,digits);
           }
         else
           {
            sl=NormalizeDouble(ask+price_level,digits);
            tp=NormalizeDouble(bid-price_level,digits);
           }
         //--- zerar os valores de pedido e o seu resultado
         ZeroMemory(request);
         ZeroMemory(result);
         //--- definição dos parâmetros de operação
         request.action  =TRADE_ACTION_SLTP; // tipo de operação de negociação
         request.position=position_ticket;   // bilhete da posição
         request.symbol=position_symbol;     // símbolo 
         request.sl      =sl;                // Stop Loss da posição
         request.tp      =tp;                // Take Profit da posição
         request.magic=EXPERT_MAGIC;         // MagicNumber da posição
         //--- saída de informações sobre a modificação
         PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- envio do pedido
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // se não for possível enviar o pedido, exibir o código de erro
         //--- informações sobre a operação   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+
 
fabriciopduarte #:
Sim, mas mais facil seria o trade.positionModify(). Essa forma ai é mais baixo nível e se olhar no código do metodo ele constroi isso pra voce.