Escreverei um conselheiro sem custos - página 168

 
Aesen #:
Ei, Anton, você pode me ajudar a tornar minha EA On Balance Volume Divergence mais consistentemente lucrativa? Talvez mudar algumas coisas no código ou adicionar algumas características e torná-lo melhor, por favor. o código está funcionando plenamente, mas não estou satisfeito com os resultados que estou obtendo com ele
#include <trade/trade.mqh>

input double Lots = 0.01;
input int VerificationCandles = 20;
input int TimeGapCandles = 5;

input int TpPoints = 1000;
input int SlPoints = 1000;

int totalBars;
int handleOBV;

datetime timeLow1, timeLow2, timeHigh1, timeHigh2;
double low1, low2, high1, high2;
datetime timeLowOBV1, timeLowOBV2, timeHighOBV1, timeHighOBV2;
double lowObv1, lowObv2, highObv1, highObv2;

int OnInit(){
   totalBars = iBars(_Symbol,PERIOD_CURRENT);
   
   handleOBV = iOBV(_Symbol,PERIOD_CURRENT,VOLUME_TICK);

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){

}

void OnTick(){
   int bars = iBars(_Symbol,PERIOD_CURRENT);
   if(totalBars != bars){
      totalBars = bars;
      
      datetime newTime = 0;
      double newlow = 0, newhigh = 0;
      findHighLow(newlow,newhigh,newTime);
      
      datetime newTimeObv = 0;
      double newlowOBV = 0, newhighOBV = 0;      
      findHighLowOBV(newlowOBV,newhighOBV,newTimeObv); 
      
      if(newlow != 0 || newlowOBV != 0){
         if(newlow != 0){
            low2 = low1;
            timeLow2 = timeLow1;
            low1 = newlow;
            timeLow1 = newTime;            
         }   
         if(newlowOBV != 0){
            lowObv2 = lowObv1;
            timeLowOBV2 = timeLowOBV1;
            lowObv1 = newlowOBV;
            timeLowOBV1=newTime;
         }
         
         ulong timeGap = TimeGapCandles * PeriodSeconds(PERIOD_CURRENT);
         if(low1 < low2 && lowObv1 > lowObv2 && (ulong)MathAbs(timeLow1-timeLowOBV1) < timeGap && (ulong)MathAbs(timeLow2-timeLowOBV2) < timeGap){
            Print(__FUNCTION__," > New Buy Signal...");
            
            double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ask = NormalizeDouble(ask,_Digits);
            
            double tp = ask + TpPoints * _Point;
            tp = NormalizeDouble(tp,_Digits);
            
            double sl = ask - SlPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            CTrade trade;
            trade.Buy(Lots,_Symbol,ask,sl,tp);                 
         }
      } 
         
         if(newhigh != 0 || newhighOBV != 0){
            if(newhigh != 0){
               high2 = high1;
               timeHigh2 = timeHigh1;
               high1 = newhigh;
               timeHigh1 = newTime;
            }
            if(newhighOBV != 0){
               highObv2 = highObv1;
               timeHighOBV2 = timeHighOBV1;
               highObv1 = newhighOBV;
               timeHighOBV1 = newTimeObv;
            }
            
           ulong timeGap = TimeGapCandles * PeriodSeconds(PERIOD_CURRENT);
           if(high1 > high2 && highObv1 < highObv2 && (ulong)MathAbs(timeHigh1-timeHighOBV1) < timeGap && (ulong)MathAbs(timeHigh2-timeHighOBV2) < timeGap){
            Print(__FUNCTION__," > New Sell Signal...");
            
            double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            bid = NormalizeDouble(bid,_Digits);
            
            double tp = bid - TpPoints * _Point;
            tp = NormalizeDouble(tp,_Digits);
            
            double sl = bid + SlPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            CTrade trade;
            trade.Sell(Lots,_Symbol,bid,sl,tp);                  
         }   
      }
   }             
} 
     
void findHighLow(double &newlow, double &newhigh, datetime &newTime){
   int indexBar = VerificationCandles+1;
   double high = iHigh(_Symbol,PERIOD_CURRENT,indexBar);
   double low = iLow(_Symbol,PERIOD_CURRENT,indexBar);
   datetime time = iTime(_Symbol,PERIOD_CURRENT,indexBar);
      
   bool isHigh = true, isLow = true;
   for(int i = 1; i <= VerificationCandles; i++){
       double highLeft = iHigh(_Symbol,PERIOD_CURRENT,indexBar+i);
       double highRight = iHigh(_Symbol,PERIOD_CURRENT,indexBar-i);
       if(highLeft > high || highRight > high) isHigh = false;
         
       double lowLeft = iLow(_Symbol,PERIOD_CURRENT,indexBar+i);
       double lowRight = iLow(_Symbol,PERIOD_CURRENT,indexBar-i);
       if(lowLeft < low || highRight < low) isLow = false;
          
       if(!isHigh && !isLow) break;
       if(i == VerificationCandles){
         if(isHigh){
            Print(__FUNCTION__," > Found a new high (",DoubleToString(high,_Digits),") at ",time,"...");
            ObjectCreate(0,"High@"+TimeToString(time),OBJ_ARROW_SELL,0,time,high);
            newhigh = high;
            newTime = time;  
         }            
         if(isLow){
            Print(__FUNCTION__," > Found a new low (",DoubleToString(low,_Digits),") at ",time,"...");
            ObjectCreate(0,"Low@"+TimeToString(time),OBJ_ARROW_BUY,0,time,low); 
            newlow = low;
            newTime = time;               
         }
      }   
   }
}
   
void findHighLowOBV(double &newlow, double &newhigh, datetime &newTime){
   int indexBar = VerificationCandles;
   double OBV[];
   if(CopyBuffer(handleOBV,0,1,VerificationCandles*2+1,OBV) < VerificationCandles *2+1) return;
   
   double value = OBV[indexBar];
   datetime time = iTime(_Symbol,PERIOD_CURRENT,indexBar+1);
      
   bool isHigh = true, isLow = true;
   for(int i = 1; i <= VerificationCandles; i++){
       double valLeft = OBV[indexBar+i];
       double valRight = OBV[indexBar-i];
       if(valLeft > value || valRight > value) isHigh = false;      
       if(valLeft < value || valRight < value) isLow = false;
          
       if(!isHigh && !isLow) break;
       if(i == VerificationCandles){
         if(isHigh){
            Print(__FUNCTION__," > Found a new high (",DoubleToString(value,_Digits),") at ",time,"...");
            ObjectCreate(0,"High@"+TimeToString(time),OBJ_ARROW_SELL,1,time,value);
            newhigh = value;
            newTime = time;    
         }
         if(isLow){
            Print(__FUNCTION__," > Found a new low (",DoubleToString(value,_Digits),") at ",time,"...");
            ObjectCreate(0,"Low@"+TimeToString(time),OBJ_ARROW_BUY,1,time,value);
            newlow = value;
            newTime = time;    
         }
      }   
   }
} 
Arquivos anexados:
 
Aesen #:

Algumas características que eu tinha em mente que seria bom ter na EA são as linhas de tendência para quando as divergências ocultas e regulares são formadas nas tabelas de preços e no indicador obv, talvez uma bela parada de fuga, também entradas que parecem algo parecido com isto:


Variável Valor

Divergência regular Verdadeiro/Falso

Divergência oculta Verdadeiro/Falso

Indicador Linhas de tendência Verdadeiro/Falso

Preço Linhas de tendência Verdadeiro/Falso


Estou tentando fazer com que este OBV Divergence EA siga esta folha de dados de Divergence que recebi do babypips.com:


Divergência em alta(Inverter para cima):

Preço do Candelabro - Baixo Baixo

Em Balanço de Volume - Maior Baixo


Divergência em baixa (Reversão para baixo):

Preço do candelabro - mais alto

Em equilíbrio de volume - Mais baixo alto


Divergência oculta em alta (Continuação datendência):

Preço do candelabro - mais alto baixo

Em Balanço de Volume - Baixo Baixo


Bearish Hidden Divergence (Continuação datendência parabaixo):

Preço do Candelabro - Baixa Alta

Em Balanço de Volume - Maior Elevação

A New Approach to Interpreting Classic and Hidden Divergence. Part II
A New Approach to Interpreting Classic and Hidden Divergence. Part II
  • www.mql5.com
The article provides a critical examination of regular divergence and efficiency of various indicators. In addition, it contains filtering options for an increased analysis accuracy and features description of non-standard solutions. As a result, we will create a new tool for solving the technical task.
 
Aesen #:

Algumas características que eu tinha em mente que seria bom ter na EA são as linhas de tendência para quando as divergências ocultas e regulares são formadas nas tabelas de preços e no indicador obv, talvez uma bela parada de fuga, também entradas que parecem algo parecido com isto:


Variável Valor

Divergência regular Verdadeiro/Falso

Divergência oculta Verdadeiro/Falso

Indicador Linhas de tendência Verdadeiro/Falso

Preço Linhas de tendência Verdadeiro/Falso


Estou tentando fazer com que este OBV Divergence EA siga esta folha de dados de Divergence que recebi do babypips.com:


Divergência em alta(Inverter para cima):

Preço do Candelabro - Baixo Baixo

Em Balanço de Volume - Maior Baixo


Divergência em baixa (Reversão para baixo):

Preço do candelabro - mais alto

Em equilíbrio de volume - Mais baixo alto


Divergência oculta em alta (Continuação datendência):

Preço do candelabro - mais alto baixo

Em Balanço de Volume - Baixo Baixo


Bearish Hidden Divergence (Continuação datendência parabaixo):

Preço do Candelabro - Baixa Alta

Em Balanço de Volume - Maior Elevação

Outra característica que eu tinha em mente era que a EA vai empilhar mais negócios se for a favor do primeiro negócio que ela colocar, se isso fizer sentido....


Por exemplo, quando a EA detecta uma divergência em alta e há um sinal de compra e o primeiro comércio de compra é colocado, se o comércio for a favor do primeiro comércio de compra que a EA colocou então a EA empilhará mais comércio na direção da compra e vice-versa se fosse um comércio de venda.
 
Aesen #:

Outra característica que eu tinha em mente era que a EA vai empilhar mais negócios se for a favor do primeiro negócio que ela colocar, se isso fizer sentido....


Por exemplo, quando a EA detecta uma divergência em alta e há um sinal de compra e o primeiro comércio de compra é colocado, se o comércio for a favor do primeiro comércio de compra que a EA colocou então a EA empilhará mais comércio na direção da compra e vice-versa se fosse um comércio de venda.
Você pode também incluir uma estratégia de cobertura de recuperação de zona onde uma primeira operação é iniciada, digamos uma compra com tamanho de lote 0,01, e quando ela vai na direção negativa com alguns pips, digamos abaixo por 30 pips, uma contra-venda é ativada com um lote maior, digamos 0,02, onde se ela continua a cair, as operações fecham com um breakeven ou um lucro e o loop é iniciado novamente. Entretanto, se a venda não funcionar bem e o preço subir, uma outra operação de compra com um lote maior, digamos 0,03 é ativada pelo mesmo preço que a primeira compra foi iniciada. se continuar para cima e os resultados líquidos forem lucro, o loop fecha as operações com lucro e começa novamente. portanto, a lacuna de 30 pips é fixa e referida como zona de recuperação, tornando-a lucrativa para contas maiores, eliminando perdas. Se isto for possível programar
 
o script de código é para Mt5 e não mt4
 

Olá. Por favor, escreva um EA para MT4:

Fecha todas as negociações previamente abertas manualmente quando o MA (com todas as configurações de muwings disponíveis) toca o preço atual. Nada mais (é uma EA semi-automática?).

 
torrr o preço atual. Nada mais.

Olá,

Eu só consegui e não cheguei a testá-lo. Espero que funcione para você.

Cumprimentos.

//+------------------------------------------------------------------+
//|                                                     Practica.mq4 |
//|                        Copyright 2022, Antonio Simón Del Vecchio |
//|                    https://www.mql5.com/es/users/simondelvecchio |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Antonio Simón Del Vecchio"
#property link      "https://www.mql5.com/es/users/simondelvecchio"
#property version   "1.00"
#property strict


input int Periodo = 50;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OrdersTotal() > 0 && CruceMediaPrecio())
     {
      Cerrar();
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Cerrar()
  {
   double Precio = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS))
        {
         if(OrderType() == OP_BUY)
            Precio = Bid;
         else
            Precio = Ask;
         if(!OrderClose(OrderTicket(), OrderLots(), Precio, 3, clrNONE))
            Print("Error al cerrar la órden: ", GetLastError());
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CruceMediaPrecio()
  {
   double Media = iMA(Symbol(), PERIOD_CURRENT, Periodo, 0, MODE_SMA, PRICE_CLOSE, 0);
   double Max = iHigh(Symbol(), PERIOD_CURRENT, 0);
   double Min = iLow(Symbol(), PERIOD_CURRENT, 0);
   if(Max > Media && Min < Media)
     {
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
 

Para: Antonio Simon Del Vecchio

Obrigado! Eu sou um boneco... Tenho quecriar um EA no MetaEditor, inserir este código, compilá-lo e pronto...

 
torrr um EA no MetaEditor, inserir este código, compilá-lo e pronto?
Correto. Quando você compilá-lo, a EA será gerada com o nome que você deu a este arquivo no MetaEditor.

Agora eu pergunto em geral para aqueles que podem me ler: como eu compartilhei o código, é proibido compartilhar o EA? quero dizer, o arquivo .exe?
 
"Acabei de cozinhá-la e não tive tempo de testá-la". E como você pode executar um EA no testador que só fecha posições?
Razão: