Je rédigerai un conseiller gratuitement - page 168

 
Aesen #:
Hey Anton peux-tu m'aider à rendre mon EA On Balance Volume Divergence plus régulièrement rentable ? Peut-être que tu pourrais changer certaines choses dans le code ou ajouter des fonctionnalités pour l'améliorer. Le code fonctionne parfaitement mais je ne suis pas satisfait des résultats que j'obtiens.
#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;    
         }
      }   
   }
} 
Dossiers :
 
Aesen #:

Certaines fonctionnalités que j'avais à l'esprit et qui seraient bienvenues dans l'EA sont des lignes de tendance pour les cas où une divergence cachée et régulière est formée sur les graphiques de prix et l'indicateur obv, peut-être un joli stop de suivi, ainsi que des entrées qui ressemblent à quelque chose comme ceci :


Variable Valeur

Divergence régulière Vrai/Faux

Divergence cachée Vrai/Faux

Indicateur Trendlines Vrai/Faux

Lignes de tendance des prix Vrai/Faux


J'essaie de faire en sorte que cet EA de Divergence OBV suive cette feuille de cheat de Divergence que j'ai obtenue de babypips.com :


Divergence haussière(renversement vers le haut) :

Chandelier Prix - Bas inférieur

Volume en équilibre - plus haut bas


Divergence baissière (renversement à la baisse) :

Chandelier Prix - Plus haut

Volume en équilibre - Haut inférieur


Divergence haussière cachée (Continuation de latendance àla hausse) :

Chandelier Prix- Plus haut Bas

Volume en équilibre - plus bas


Divergence cachée baissière (Continuation de la tendance à labaisse) :

Prix en chandelier - Haut inférieur

Volume en équilibre - plus haut

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

Certaines fonctionnalités que j'avais à l'esprit et qui seraient bienvenues dans l'EA sont des lignes de tendance pour les cas où une divergence cachée et régulière est formée sur les graphiques de prix et l'indicateur obv, peut-être un joli stop de suivi, ainsi que des entrées qui ressemblent à quelque chose comme ceci :


Variable Valeur

Divergence régulière Vrai/Faux

Divergence cachée Vrai/Faux

Indicateur Trendlines Vrai/Faux

Lignes de tendance des prix Vrai/Faux


J'essaie de faire en sorte que cet EA de Divergence OBV suive cette feuille de cheat de Divergence que j'ai obtenue de babypips.com :


Divergence haussière(renversement vers le haut) :

Chandelier Prix - Bas inférieur

Volume en équilibre - Bas supérieur


Divergence baissière (renversement à la baisse) :

Chandelier Prix - Plus haut

Volume en équilibre - Haut inférieur


Divergence haussière cachée (Continuation de latendance àla hausse) :

Chandelier Prix- Plus haut Bas

Volume en équilibre - plus bas


Divergence cachée baissière (Continuation de la tendance à labaisse) :

Prix en chandelier - Haut inférieur

Volume en équilibre - plus haut

Une autre caractéristique que j'avais en tête était que l'EA empilera plus de trades s'il va en faveur du premier trade qu'il place, si cela a du sens.....


Par exemple, lorsque l'EA repère une divergence haussière et qu'il y a un signal d'achat et que le premier trade d'achat est placé, si le trade se déroule en faveur du premier trade d'achat que l'EA a placé, alors l'EA empilera plus de trades dans la direction de l'achat et vice versa s'il s'agissait d'un trade de vente.
 
Aesen #:

Une autre fonctionnalité que j'avais à l'esprit était que l'EA empilera plus de transactions si elle va en faveur de la première transaction qu'elle place, si cela a un sens.....


Par exemple, lorsque l'EA repère une divergence haussière, qu'il y a un signal d'achat et que le premier trade d'achat est placé, si le trade est en faveur du premier trade d'achat que l'EA a placé, alors l'EA empilera plus de trades dans la direction de l'achat et vice versa s'il s'agit d'un trade de vente.
Pouvez-vous également inclure une stratégie de couverture de récupération de zone où un premier trade est initié, disons un achat avec une taille de lot de 0.01, et quand il va dans la direction négative avec quelques pips, disons en dessous de 30 pips, une contre vente est activée avec une taille de lot plus élevée, disons 0.02, où s'il continue à descendre, les trades se ferment à un breakeven ou un profit et la boucle est recommencée. Cependant, si la vente ne fonctionne pas bien et que le prix monte, un autre achat d'une taille de lot plus élevée, disons 0,03, est activé au même prix que le premier achat. S'il continue à monter et que le résultat net est un bénéfice, la boucle ferme les transactions à un bénéfice et recommence. Par conséquent, l'écart de 30 pips est fixé et désigné comme une zone de récupération, ce qui le rend rentable pour les comptes plus élevés en éliminant les pertes. Si cela est possible à programmer
 
le code script est pour Mt5 pas mt4
 

Bonjour. Veuillez écrire un EA pour MT4 :

Ferme toutes les transactions précédemment ouvertes manuellement lorsque la MA (avec tous les paramètres muwings disponibles) touche le prix actuel. Rien d'autre (est-ce un EA semi-automatique ?).

 
torrr le prix actuel. Rien d'autre.

Bonjour,

Je viens de le faire et je n'ai pas pu le tester. J'espère que cela fonctionnera pour vous.

Regards.

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

À : Antonio Simon Del Vecchio

Merci ! Je suis une idiote... Je doiscréer un EA dans MetaEditor, insérer ce code, le compiler et c'est tout ?

 
torrr une EA dans MetaEditor, insérer ce code, la compiler et c'est tout ?
Correct. Lorsque vous le compilerez, l'EA sera généré avec le nom que vous avez donné à ce fichier dans le MetaEditor.

Maintenant je demande en général pour ceux qui peuvent me lire : comme j'ai partagé le code, est-il interdit de partager l'EA ? je veux dire le fichier .exe ?
 
"Je viens de le cuisiner et je n'ai pas eu le temps de le tester". Et comment pouvez-vous exécuter un EA dans le testeur qui ne ferme que des positions?