Scripts: Pending orders DOWN - página 3

 
Михаил Рымарь:

Olá, o script é realmente ótimo e o único no MQ5, mas eu gostaria de ter em meu arsenal o mesmo, mas com um lote, digamos 1 ou 0,5.

Obrigado por seu trabalho e boas festas.

Nesta série, a ideia original era usar o lote mínimo. Portanto, por enquanto, só até agora.

 
Olá, senhor. Pode me ajudar um pouco? Como posso ajustar o código para o tamanho de lote desejado. Tentei várias vezes alterando os inplots: 5, mas ainda assim o valor do lote quando eu o executo se torna 0,01. Obrigado, senhor
//+------------------------------------------------------------------+
//|Pedidos pendentes DOWN.mq5
//|Direitos autorais © 2017, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
#property description "The script sets the pending orders down from the price"
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                      // objeto de negociação
CSymbolInfo    m_symbol;                     // objeto de informação de símbolo
//+------------------------------------------------------------------+
//| Enumeração de ordens pendentes DOWN|
//+------------------------------------------------------------------+
enum ENUM_PENDING_ORDERS_DOWN
  {
   buy_limit         =0,   // Limite de compra
   sell_stop         =3    // Stop de venda
  };
//--- parâmetros de entrada
input ushort                     InpDownGep        = 10;             // Gap para ordens pendentes PARA BAIXO do preço atual (em pips)
input ushort                     InpDownStep       = 3;             // Passo entre as ordens DOWN (em pips)
input ENUM_PENDING_ORDERS_DOWN   InpDownOrders     = buy_limit;      // Tipo de ordens pendentes DOWN
input uchar                      InpDownQuantity   = 33;              // Quantidade DOWN
input double                     InpLots           = 5;            // Lotes
input ushort                     InpStopLoss       = 100;             // Stop Loss (em pips)
input ushort                     InpTakeProfit     = 100;             // Take Profit (em pips)
//---
ulong                            m_slippage=1;                      // derrapagem
double                           m_adjusted_point;                   // valor do ponto ajustado para 3 ou 5 pontos
double                           ExtDownGep=0.0;
double                           ExtDownStep=0.0;
double                           ExtStopLoss=0.0;
double                           ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // define o nome do símbolo
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);
//--- sintonia para 3 ou 5 dígitos
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtDownGep     = m_adjusted_point * InpDownGep;
   ExtDownStep    = m_adjusted_point * InpDownStep;
   ExtStopLoss    = m_adjusted_point * InpStopLoss;
   ExtTakeProfit  = m_adjusted_point * InpTakeProfit;
//--- iniciar o trabalho
   double start_price_ask=m_symbol.Ask()-ExtDownGep;
   double start_price_bid=m_symbol.Bid()-ExtDownGep;
//--- ordens pendentes DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
//+------------------------------------------------------------------+
//| Atualiza os dados das cotações do símbolo|
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- taxas de atualização
   if(!m_symbol.RefreshRates())
      return(false);
//--- proteção contra o valor de retorno "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Verificar a exatidão do volume do pedido
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- volume mínimo permitido para operações comerciais
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- volume máximo permitido de operações comerciais
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- obter a etapa mínima de alteração de volume
   double volume_step=m_symbol.LotsStep();

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",
                                     volume_step,ratio*volume_step);
      return(false);
     }
   error_description="Correct volume value";
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Verifica se o modo de preenchimento especificado é permitido. 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(int fill_type)
  {
//--- Obter o valor da propriedade que descreve os modos de preenchimento permitidos 
   int filling=m_symbol.TradeFillFlags();
//--- Retorna true, se o modo fill_type for permitido 
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+

 
Mjame116 :
Olá, senhor. Pode me ajudar um pouco? Como posso ajustar o código para o tamanho de lote desejado. Tentei várias vezes alterando os inplots: 5, mas ainda assim o valor do lote, quando o executo, fica em 0,01. Sou novato, espero que haja uma maneira de alterá-lo. Obrigado

Em vez do lote mínimo, é necessário colocar o parâmetro de entrada Lots

//--- ordens pendentes DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }

é preciso fazer isso:

//--- ordens pendentes DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
 
Vladimir Karputov:

Em vez do lote mínimo, é necessário colocar o parâmetro de entrada Lotes

precisam fazer isso:

Muito obrigado, senhor, eu realmente aprecio isso
 

Olá, o script é ótimo e funciona bem.

Estou usando o mesmo para configurar a rede e gostaria de perguntar: é possível combiná-los em um só? Refiro-me a um script que colocaria as redes de ordem ascendente e descendente ao mesmo tempo, com os mesmos parâmetros para as redes longas e curtas.

 
mason_one:

Olá, o script é ótimo e funciona bem.

Estou usando o mesmo para configurar a rede e gostaria de perguntar: é possível combiná-los em um só? Refiro-me a um script que colocaria as redes de ordem ascendente e descendente ao mesmo tempo, com os mesmos parâmetros para as redes longas e curtas.

Obrigado por seu interesse. Estou publicando um script (não um Expert Advisor) que define uma grade de ordens pendentes para cima e para baixo - Ordens pendentes UP DOWN.

 
Olá Vladimir, muito interessante seu script. funciona muito bem, mas espero que possa me ajudar dizendo como mudar a lotaje de 0,01 para 0,03. Fico atento e desde já muito obrigado, meu amigo.
 
Carlos Devia :
Olá Vladimir, muito interessante seu script. Funciona muito bem, mas espero que possa me ajudar dizendo como mudar a lotaje de 0,01 para 0,03. Fico à disposição e agradeço antecipadamente, meu amigo.

Nesse código, em vez de"m_symbol.LotsMin()", coloque"InpLots":

//--- ordens pendentes DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
 

Caro Vladimir, neste momento você é como um deus para mim. Você não sabe o quanto eu estava procurando por isso, e eu realmente agradeço por você ter reservado um tempo para me responder. Sou uma pessoa apaixonada por negociação e o pouco que sei aprendi com pessoas como você.

Gostaria de fazer uma última pergunta, se possível. Programei uma tecla de atalho em meu teclado

Programei uma tecla de atalho em meu teclado para ativar minha ordem de parada de venda, mas antes que ela seja ativada, abre-se uma janela que eu gostaria que não fosse aberta, mas que simplesmente executasse minha ordem imediatamente.

Estou anexando uma imagem da janela que se abre.

Gostaria de contar com sua ajuda, Vladimir, para que essa janela não apareça, pois, quando ela se abre, tenho de"aceitar" os parâmetros e perco tempo nesse processo.

Arquivos anexados:
 
Carlos Devia :

Caro Vladimir, neste momento, você é como um deus para mim. Você não sabe o quanto eu estava procurando por isso, e eu realmente agradeço por você ter reservado um tempo para me responder. Sou uma pessoa apaixonada por negociação e o pouco que sei aprendi com pessoas como você.

Se possível, gostaria de fazer uma última pergunta: programei uma tecla de atalho em meu teclado.

Programei uma tecla de atalho em meu teclado para ativar minha ordem de parada de venda, mas antes que ela seja ativada, abre-se uma janela que eu gostaria que não abrisse, mas simplesmente executasse minha ordem imediatamente.

Anexei uma imagem da janela que se abre.

Gostaria de contar com sua ajuda, Vladimir, para que essa janela não apareça, pois, quando ela se abre, tenho de "aceitar" os parâmetros e perco tempo nesse processo.

Uma tecla de atalho não é uma opção: na inicialização, de qualquer forma, os parâmetros de entrada estarão visíveis.

Eu sugeriria outra maneira:

  • escrever um consultor - um painel, no painel tudo tem um botão "Start" (Iniciar).
  • quando você iniciar o consultor, depois de definir os parâmetros de entrada
  • após o lançamento, um pequeno painel é pendurado no gráfico: quando você clica no botão "Start" (Iniciar) nesse painel, as ordens pendentes são colocadas (todos os parâmetros são obtidos a partir dos parâmetros de entrada).

Exemplo de painel:



Você pode procurar esse painel no Market ou encomendá-lo no serviço Freelance.