Tudo sobre Programação, com código fonte exemplo - página 6

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

StopLoss e TakeProfit

lbevilaqua, 2019.05.14 04:58

  void Compra()
{
   double price;
   if(TipoAction==TRADE_ACTION_DEAL) // Determinação do preço da ordem a mercado
      price = simbolo.Ask(); 
   else
      price = simbolo.Bid() - Distancia;
   double stoploss = simbolo.NormalizePrice(price - SL); // Cálculo normalizado do stoploss
   double takeprofit = simbolo.NormalizePrice(price + TP); // Cálculo normalizado do takeprofit
   //negocio.Buy(Volume, NULL, price, stoploss, takeprofit, "Compra CruzamentoMediaEA"); // Envio da ordem de compra pela classe responsável
   
   // Limpar informações das estruturas
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
   
   //--- Preenchimento da requisição
   request.action       =TipoAction;
   request.magic        =magic;
   request.symbol       =_Symbol;
   request.volume       =Volume;
   request.price        =price; 
   request.sl           =stoploss;
   request.tp           =takeprofit;
   if(TipoAction==TRADE_ACTION_DEAL)
      request.type      =ORDER_TYPE_BUY;
   else
      request.type      =ORDER_TYPE_BUY_LIMIT;
   request.type_filling =ORDER_FILLING_RETURN; 
   request.type_time    =ORDER_TIME_DAY;
   request.comment      ="Compra CruzamentoMediaEA";
   
   //--- Checagem e envio de ordens
   ResetLastError();
   if(!OrderCheck(request, check_result))
   {
      PrintFormat("Erro em OrderCheck: %d", GetLastError());
      PrintFormat("Código de Retorno: %d", check_result.retcode);
      return;
   }
   
   if(!OrderSend(request, result))
   {
      PrintFormat("Erro em OrderSend: %d", GetLastError());
      PrintFormat("Código de Retorno: %d", result.retcode);
      return;
   }
   
   ObjectCreate(0, "BE", OBJ_HLINE, 0, 0, price + BE);
}
//+------------------------------------------------------------------+
//| Realizar venda com parâmetros especificados por input            |
//+------------------------------------------------------------------+
void Venda()
{
   double price;
   if(TipoAction==TRADE_ACTION_DEAL) // Determinação do preço da ordem a mercado
      price = simbolo.Bid(); 
   else
      price = simbolo.Ask() + Distancia;
   double stoploss = simbolo.NormalizePrice(price + SL); // Cálculo normalizado do stoploss
   double takeprofit = simbolo.NormalizePrice(price - TP); // Cálculo normalizado do takeprofit
   //negocio.Sell(Volume, NULL, price, stoploss, takeprofit, "Venda CruzamentoMediaEA"); // Envio da ordem de compra pela classe responsável
   
   // Limpar informações das estruturas
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
   
   //--- Preenchimento da requisição
   request.action       =TipoAction;
   request.magic        =magic;
   request.symbol       =_Symbol;
   request.volume       =Volume;
   request.price        =price; 
   request.sl           =stoploss;
   request.tp           =takeprofit;
   if(TipoAction==TRADE_ACTION_DEAL)
      request.type      =ORDER_TYPE_SELL;
   else
      request.type      =ORDER_TYPE_SELL_LIMIT;
   request.type_filling =ORDER_FILLING_RETURN; 
   request.type_time    =ORDER_TIME_DAY;
   request.comment      ="Venda CruzamentoMediaEA";
   
   //--- Checagem e envio de ordens
   ResetLastError();
   if(!OrderCheck(request, check_result))
   {
      PrintFormat("Erro em OrderCheck: %d", GetLastError());
      PrintFormat("Código de Retorno: %d", check_result.retcode);
      return;
   }

1. Você considera compras e vendas tudo na ponta Ask. Tem certeza disso? Você pode estar distorcendo sua estrategia ao não considerar as pontas Bid/Ask;

Sim, não irá mudar em nada minha estratégia

2. Você não trata eventuais erros no envio de ordens;

Melhorei a questão da checagem de erros no envio das ordens.

3. Falta verificar se o ativo não esta em leilão no envio de ordens.

Isso não vai influenciar, pois eu irei acompanhar o EA rodando.


A dúvida é realmente como fazer o stoploss ser a minima do candle anterior em caso de compra e em caso de venda a máxima do candle anterior.

Aceito sugestões é claro.

Agradecido desde já


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Trabalhando Com Mais de uma Ativo

Bruno Gonçalves, 2019.04.12 16:32

Bom dia gostaria de saber qual o parametro esta errado, porque ele nao efetua a operacao nos dois ativos.

Muito Obrigado

#include <Trade\Trade.mqh>
#include <Math\Stat\Stat.mqh>
CTrade trade;
MqlRates                      rates[];
MqlRates                      rates2[];
MqlTick                       ultimoTick;
MqlTick                       ultimoTick2;

input string Ativo1 = "EURUSD"; //ATIVO 1
input string Ativo2 = "GBPUSD"; //ATIVO 2
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CopyRates(Ativo1,_Period,0,30,rates)<0)
     {
      Alert("Erro ao obter as informações de MqlRates: ",GetLastError());
      return;
     }
   if(!SymbolInfoTick(Ativo1,ultimoTick))
     {
      Alert("Erro ao obter informações de preços: ",GetLastError());
      return;

      if(CopyRates(Ativo2,_Period,0,30,rates2)<0)
        {
         Alert("Erro ao obter as informações de MqlRates: ",GetLastError());
         return;
        }

     }
   if(!SymbolInfoTick(Ativo2,ultimoTick2))
     {
      Alert("Erro ao obter informações de preços: ",GetLastError());
      return;
     }



   if(PositionsTotal()==0)
     {
      trade.Buy(0.01,Ativo2,ultimoTick.ask);

     }
   if(PositionsTotal()==1)
     {
      trade.Sell(0.01,Ativo1,ultimoTick.bid);
     }

  }
//+------------------------------------------------------------------+

 

Dentro deste tópico, considero o artigo abaixo como de leitura indispensável.

Common Way of Making Trades - Programming of Trade Operations - MQL4 Tutorial
Common Way of Making Trades - Programming of Trade Operations - MQL4 Tutorial
  • book.mql4.com
All calculations and other actions performed due to the execution of an application program can be divided into two groups by the location of their execution: those executed in the user's PC and those executed on the server side. A significant amount of calculations is performed on the user's side. This group includes the execution of...
 
iCustom e OnCalculate

Bom Dia pessoal!

Não estou conseguindo fazer esse EA funcionar utilizando um indicador de renko, alguém pode me dá uma força? É a 1a vez que uso o iCustom dessa forma.. super obrigado! É uma simples compra e venda do tipo If(c[1]>c[2]) {Buy}

   
  
int  OnCalculate( 
   const int        rates_total,       // tamanho das séries temporais de entrada 
   const int        prev_calculated,   // número de barras processadas na chamada anterior 
   const datetime&  time[],            // matriz Time 
   const double&    open[],            // matriz Open 
   const double&    high[],            // matriz High 
   const double&    low[],             // matriz Low 
   const double&    close[],           // matriz Close 
   const long&      tick_volume[],     // matriz Tick Volume 
   const long&      volume[],          // matriz Real Volume 
   const int&       spread[]           // matriz Spread 
   )
  

   CopyBuffer(hc,3,0,3,c); 
   
   for(int i=1;i<rates_total;i++)
   {
   c[i]=close[i];
   }

   return(rates_total);   
   
   }

2a tentativa

double open[];
double high[];
double low[];
double close[];
int hc;
int OnInit()
   {
   ArraySetAsSeries(open, true);
   SetIndexBuffer(0,open,INDICATOR_DATA);
   
   ArraySetAsSeries(high, true);
   SetIndexBuffer(1, high,INDICATOR_DATA);
   
   ArraySetAsSeries(low, true);
   SetIndexBuffer(2, low,INDICATOR_DATA);
   
   ArraySetAsSeries(close, true);
   SetIndexBuffer(3, close,INDICATOR_DATA);
   
   int hc= iCustom(NULL,0,"Universal Renko Indicator.ex5","",RenkoBoxSize,RenkoShadowType,LookBackBars,"IC",
   Retracement,AutoRenko,AutoRenkoMode,2,"",false,"",CORNER_LEFT_UPPER,2,true,true,false,"",true);
   
   CopyBuffer(hc,0,0,3,open);  
   CopyBuffer(hc,1,0,3,high);  
   CopyBuffer(hc,2,0,3,low);  
   CopyBuffer(hc,3,0,3,close); 
    
   return (0); 
//+------------------------------------------------------------------+ 
                          RENKO INDICATOR
//+------------------------------------------------------------------+
 enum renko_auto
{
   Median=0,         //Median Renko
   Vanilla=1,        //Vanilla Renko
   Turbo=2,          //Turbo Renko
   Hybrid=3,         //Hybrid Renko
   PointO=4,         //Point-O
};
enum enum_type
{
   r1=0, //No Wick
   r2=1, //With Wick
};
input int         RenkoBoxSize         = 1000;             //Renko Candle Size (in Points)
input enum_type   RenkoShadowType      = 1;              //Renko Type
input int         LookBackBars         = 500;           //Look Back Bars
input double      Retracement          = 1;              //Retracement Factor [0.01 to 1.00]
input bool        AutoRenko            = true;           //Auto Retracement (Ignore Retracement Factor)
input renko_auto  AutoRenkoMode        = 4;              //Auto Retracement Select 
O código completo:
//+------------------------------------------------------------------+
//|                        INCLUDES                                  +                                 
//+------------------------------------------------------------------+ 
#include <Expert\Expert.mqh>
#include <Expert\Signal\SignalMA.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>
#include <Indicators\Oscilators.mqh>
#include <Expert\Signal\SignalStoch.mqh>
//+------------------------------------------------------------------+ 
#resource "Universal Renko Indicator.ex5"
//+------------------------------------------------------------------+ 
CiStochastic   stochastic;
CSymbolInfo   _symbol;                     
CTrade        t;
//+------------------------------------------------------------------+ 
                          RENKO INDICATOR
//+------------------------------------------------------------------+
 enum renko_auto
{
   Median=0,         //Median Renko
   Vanilla=1,        //Vanilla Renko
   Turbo=2,          //Turbo Renko
   Hybrid=3,         //Hybrid Renko
   PointO=4,         //Point-O
};
enum enum_type
{
   r1=0, //No Wick
   r2=1, //With Wick
};
input int         RenkoBoxSize         = 1000;             //Renko Candle Size (in Points)
input enum_type   RenkoShadowType      = 1;              //Renko Type
input int         LookBackBars         = 500;           //Look Back Bars
input double      Retracement          = 1;              //Retracement Factor [0.01 to 1.00]
input bool        AutoRenko            = true;           //Auto Retracement (Ignore Retracement Factor)
input renko_auto  AutoRenkoMode        = 4;              //Auto Retracement Select 
//+------------------------------------------------------------------+
//|               High Frequency Trade - ORDERS                  +                                
//+------------------------------------------------------------------+   
void Buy(double volume)   
   { 
   MqlTradeRequest req={0}; 
   req.action      =TRADE_ACTION_DEAL; 
   req.symbol      =_Symbol; 
   req.volume      =1;
   req.price       =SymbolInfoDouble(req.symbol,SYMBOL_ASK); 
   req.sl          = NULL;
   req.tp          = NULL;
   req.deviation   =0;
   req.type        =ORDER_TYPE_BUY;   
   MqlTradeResult  res={0};
   if(!OrderSend(req,res))
      PrintFormat("OrderSend error %d",GetLastError());  
   }  
void Sell(double volume)   
   {
   MqlTradeRequest req={0}; 
   req.action      =TRADE_ACTION_DEAL; 
   req.symbol      =_Symbol; 
   req.volume      =1;
   req.price       =SymbolInfoDouble(req.symbol,SYMBOL_ASK); 
   req.sl          = NULL;
   req.tp          = NULL;
   req.deviation   =0;
   req.type        =ORDER_TYPE_SELL; 
   MqlTradeResult  res={0};
   if(!OrderSend(req,res))
   PrintFormat("OrderSend error %d",GetLastError()); 
   }
      
//+------------------------------------------------------------------+
//|                  UNIVERSAL RENKO INDICATOR                       +                                
//+------------------------------------------------------------------+ 
double open[];
double high[];
double low[];
double close[];
int hc;
int OnInit()
   {
   ArraySetAsSeries(open, true);
   SetIndexBuffer(0,open,INDICATOR_DATA);
   
   ArraySetAsSeries(high, true);
   SetIndexBuffer(1, high,INDICATOR_DATA);
   
   ArraySetAsSeries(low, true);
   SetIndexBuffer(2, low,INDICATOR_DATA);
   
   ArraySetAsSeries(close, true);
   SetIndexBuffer(3, close,INDICATOR_DATA);
   
   int hc= iCustom(NULL,0,"Universal Renko Indicator.ex5","",RenkoBoxSize,RenkoShadowType,LookBackBars,"IC",
   Retracement,AutoRenko,AutoRenkoMode,2,"",false,"",CORNER_LEFT_UPPER,2,true,true,false,"",true);
   
   CopyBuffer(hc,0,0,3,open);  
   CopyBuffer(hc,1,0,3,high);  
   CopyBuffer(hc,2,0,3,low);  
   CopyBuffer(hc,3,0,3,close); 
    
   return (0); 
      
void OnTick()
   {            
//BUY
        if (PositionsTotal() ==0       
        && c[1] > c[2]        
        )     
        {
           t.Buy(1);  
        }       
//SELL
         if (PositionsTotal() ==0           
         && c[1] < c[2]                                
         )          
         {
            t.Sell(1);        
         } 
            
//INVERTE PRA COMPRA
        if (PositionsTotal() ==1 
        && PositionSelect(_Symbol)==true 
           && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL            
           && c[1] > c[2]
         )
         {
           t.Buy(2);
         }         
  
//INVERTE PRA VENDA
         if(PositionsTotal() ==1  
         && PositionSelect(_Symbol)==true 
            && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY          
            && c[1] < c[2]    
         )                  
         {
            t.Sell (2);
         }
         }


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

OrderSend error 4756 (WINV17,M1) retcode=10030... erro ao enviar ordem na conta REAL

JOSUCA, 2017.10.05 18:55

Boa tarde galera tudo bem com vocês ,estou com problemas no meu EA para enviar ordem pendente na conta REAL da corretora MODAL, na conta DEMO funcionou corretamente mais quando coloco na real retorna esse erro...

OrderSend error 4756

2017.10.05 13:41:01.556 GALAXY (WINV17,M1) retcode=10030  deal=0  order=0


//-- declaração e inicialização do pedido e o seu resultado

   MqlTradeRequest request={0};

   MqlTradeResult  result={0};


//--- parâmetros para colocação da ordem pendente
   request.action   =TRADE_ACTION_PENDING;                        
   request.symbol   =Symbol();                                 
   request.volume   =Volume;                                      
   request.deviation=5;                                             
   request.magic    = EXPERT_MAGIC;                                   
   request.expiration=0;
   request.type_time=ORDER_TIME_DAY; 
    request.type_filling=ORDER_FILLING_FOK;
   int offset = Deslocamento;                                                    // deslocamento a partir do preço atua para colocação da ordem
   double price;                                                      
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);               
   int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);               
   double sl=PositionGetDouble(POSITION_SL);                       
   double tp=PositionGetDouble(POSITION_TP);                        
   
   
      request.type     =ORDER_TYPE_SELL_LIMIT;                        
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;        
      request.price    =NormalizeDouble(price,digits);                 
    
     sl=NormalizeDouble(price+SLOSS*point,digits);
     tp=NormalizeDouble(price-TPROFIT*point,digits);
     
     
   request.sl      =sl;                
    request.tp      =tp;            
   
//--- enviar a ordem
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());                 
//--- informações sobre a operação
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

EA posicionando StopLoss e TakeProfit no lugar errado devido a volatilidade.

fillipeyuri_, 2019.05.24 18:05

Obrigado pela atenção!

Segue o trecho do código:

if(last+distanciamento_media<=compraArray[0] && PositionsTotal() == 0 && isNewBar()==true)
     {
       Comment ("Compra");
         if(trade.Buy(1, _Symbol, bid, bid-stoploss, bid+takeprofit, ""))
            {
            Print("Ordem de Compra - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
            }
       else
            {
            Print("Ordem de Compra - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
            }
     }
     
      
 else if(last-distanciamento_media>=vendaArray[0] && PositionsTotal() == 0 && isNewBar()==true)
     {
       Comment ("Venda");
          if(trade.Sell(1, _Symbol, ask, ask+stoploss, ask-takeprofit, ""))
             {
             Print("Ordem de Venda - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
             }
        else
             {
             Print("Ordem de Venda - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
             }
     }

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Indicador de Grandes Ordens (Ajuda)

zuazo, 2019.05.25 03:31

Olá pessoal!

Criei este indicador simples, mas ele tem sido bastante útil pra mim.

Se trata de uma linha que mostra no gráfico Ordens por tick maiores que um valor configurado no Input.

Por exemplo, no dólar configuro para que ele me mostre ordens acima de 1000, pois pretendo saber as ordens diretas de grande vulto.


Tenho tido 2 problemas nele:

1 - Alguns ticks não são "percebidos" pelo código e ele falha em plotar na tela, pela compilação ele demora 1006 msec, então acredito que isso faça com que ele "pule" certos ticks, sei lá.

2 - Algumas vezes há um tipo de Reset automático, não sei se é por perda de conexão ou algo assim, mas ele deleta todos os dados plotados anteriormente


Alguém poderia dar uma ajuda ?


#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Purple
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input double         BigVolume = 1000;     
//+------------------------------------------------------------------+
//| VARIÁVEIS INTERNAS DO CÓDIGO                                     |
//+------------------------------------------------------------------+
double               Buffer1[];
double               preco;


//+------------------------------------------------------------------+
//| INICIALIZAÇÃO DE VARIÁVEIS (Mapeamento de Buffers)               |
//+------------------------------------------------------------------+
int OnInit()
  {

SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
ArrayInitialize(Buffer1,EMPTY_VALUE);
preco  = 0;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| FUNÇÃO DE INTERAÇÃO DO INDICADOR                                 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   MqlTick tick_array[];
   ArraySetAsSeries(tick_array,true);
   ArraySize(tick_array);
  
if(CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL)!=-1)
     {
     
     MqlTick tick; 
 
   if(SymbolInfoTick(Symbol(),tick)) 
     {     
    
      if(tick.volume >= BigVolume ){
      preco = tick.last;
      }
       
      }
      
     }
                      
//+------------------------------------------------------------------+
//| PLOTANDO BUFFERS                                                 |
//+------------------------------------------------------------------+  

Buffer1[rates_total-1] = preco;

   return(rates_total);
  }

 
Ola, vi em vários exemplos de códigos um checando se o Robô irá fazer um novo trade, apenas em uma nova barra, ou seja, dentro do OnTick ele só vai ver se deu o sinal quando aparecer uma nova vela. Sei que isso acelera o funcionamento do Robô mas existe problemas em não checar se existe uma nova barra? Outro ponto é em checando a nova barra como colocar para fazer trades no rompimento da máxima anterior?
 
Meu indicador não aparece no testador de estrategia, o que fazer??
 
Vitor Pereira:

Boa tarde Vitor

1) O modelo de negócio é que vai definir se posição será aberta no candle em andamento ou no fechamento(novo candle).

2) Se vai dar problema em não checar nova barra? Depende da estratégia.

3) Como checar se rompeu máxima anterior?

Se a estratégia é por candle fechado então basta testar quando abrir o novo candle se OPEN (candle corrente) > HIGH (candle anterior)

Se a estratégia não é por candle fechado então basta testar a cada tick recebido  CLOSE(candle corrente) > HIGH (candle anterior)

Razão: