Scriverò un EA gratuitamente - pagina 168

 
Aesen #:
Ehi Anton, puoi aiutarmi a rendere il mio On Balance Volume Divergence EA più costantemente redditizio? Forse cambiare alcune cose nel codice o aggiungere alcune caratteristiche e renderlo migliore per favore. il codice è completamente funzionante ma non sono soddisfatto dei risultati che sto ottenendo da esso
#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;    
         }
      }   
   }
} 
 
Aesen #:

Alcune caratteristiche che avevo in mente e che sarebbe bello avere sull'EA sono linee di tendenza per quando si formano divergenze nascoste e regolari sui grafici dei prezzi e l'indicatore obv, forse un bel trailing stop, anche input che assomigliano a questo:


Variabile Valore

Divergenza regolare Vero/Falso

Divergenza nascosta Vero/Falso

Indicatore Trendlines Vero/Falso

Price Trendlines True/False


Sto cercando di far seguire a questo OBV Divergence EA questo Divergence cheat sheet che ho avuto da babypips.com:


Divergenza rialzista(inversione verso l'alto):

Candela Prezzo - Basso inferiore

Volume in equilibrio - Basso più alto


Divergenza ribassista (inversione giù):

Prezzo a candela - Alto più alto

Volume in equilibrio - Alto inferiore


Divergenza nascosta rialzista (continuazione della tendenzaverso l'alto):

Prezzo della candela - più alto basso

Volume in equilibrio - Basso inferiore


Divergenza nascosta ribassista(continuazione della tendenzaverso il basso):

Prezzo a candela - Alto inferiore

Volume in equilibrio - Alto più alto

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 #:

Alcune caratteristiche che avevo in mente e che sarebbe bello avere sull'EA sono linee di tendenza per quando si formano divergenze nascoste e regolari sui grafici dei prezzi e l'indicatore obv, forse un bel trailing stop, anche input che assomigliano a questo:


Variabile Valore

Divergenza regolare Vero/Falso

Divergenza nascosta Vero/Falso

Indicatore Trendlines Vero/Falso

Price Trendlines True/False


Sto cercando di far seguire a questo OBV Divergence EA questo Divergence cheat sheet che ho avuto da babypips.com:


Divergenza rialzista(inversione verso l'alto):

Candela Prezzo - Basso inferiore

Volume in equilibrio - Basso più alto


Divergenza ribassista (inversione giù):

Prezzo a candela - Alto più alto

Volume in equilibrio - Alto inferiore


Divergenza nascosta rialzista (continuazione della tendenzaverso l'alto):

Prezzo della candela - più alto basso

Volume in equilibrio - Basso inferiore


Divergenza nascosta ribassista(continuazione della tendenzaverso il basso):

Prezzo a candela - Alto inferiore

Volume in equilibrio - Alto più alto

Un'altra caratteristica che avevo in mente era che l'EA impilerà più trade se va a favore del primo trade che piazza, se questo ha senso....


per esempio, quando l'EA individua una divergenza rialzista e c'è un segnale di acquisto e viene piazzato il primo trade di acquisto, se il trade va a favore del primo trade di acquisto che l'EA ha piazzato allora l'EA impilerà più trade nella direzione di acquisto e viceversa se fosse un trade di vendita.
 
Aesen #:

Un'altra caratteristica che avevo in mente era che l'EA impilerà più trade se va a favore del primo trade che piazza, se questo ha senso....


per esempio, quando l'EA individua una divergenza rialzista e c'è un segnale di acquisto e viene piazzata la prima operazione di acquisto, se l'operazione va a favore della prima operazione di acquisto che l'EA ha piazzato allora l'EA impilerà più operazioni nella direzione di acquisto e viceversa se fosse un'operazione di vendita.
Puoi anche includere una strategia di copertura del recupero della zona in cui una prima operazione viene avviata, diciamo un acquisto con dimensione del lotto 0.01, e quando va in direzione negativa con alcuni pip, diciamo sotto di 30 pip, viene attivata una contro vendita con una dimensione del lotto più alta, diciamo 0.02, dove se continua a scendere, le operazioni si chiudono a pareggio o in profitto e il ciclo viene ricominciato. Tuttavia, se la vendita non funziona bene e il prezzo sale, si attiva un'altra operazione di acquisto con una dimensione di lotto più alta, per esempio 0,03, allo stesso prezzo a cui è stato avviato il primo acquisto. se continua a salire e il risultato netto è un profitto, il ciclo chiude le operazioni con un profitto e ricomincia. quindi, il gap di 30 pip è fisso e definito come una zona di recupero, rendendolo redditizio per i conti più alti eliminando le perdite. Se questo è possibile programmare
 
lo script del codice è per Mt5 non per mt4
 

Salve. Per favore, scrivi un EA per MT4:

Chiude tutti i trade aperti manualmente in precedenza quando la MA (con tutte le impostazioni di muwings disponibili) tocca il prezzo corrente. Nient'altro (è un EA semiautomatico?).

 
torrr il prezzo corrente. Nient'altro.

Salve,

L'ho appena fatta e non ho potuto testarla. Spero che funzioni per voi.

Saluti.

//+------------------------------------------------------------------+
//|                                                     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);
  }
//+------------------------------------------------------------------+
 

A: Antonio Simon Del Vecchio

Grazie! Sono uno stupido... Devocreare un EA in MetaEditor, inserire questo codice, compilarlo ed è tutto?

 
torrr un EA in MetaEditor, inserire questo codice, compilarlo e basta?
Corretto. Quando lo compilate, l'EA sarà generato con il nome che avete dato a questo file nel MetaEditor.

Ora chiedo in generale per coloro che possono leggermi: siccome ho condiviso il codice, è vietato condividere l'EA? Intendo il file .exe?
 
"L'ho appena cucinato e non ho avuto il tempo di testarlo". E come si può eseguire un EA nel tester che chiude solo le posizioni?
Motivazione: