Ich schreibe kostenlos einen Ratgeber - Seite 168

 
Aesen #:
Hey Anton, kannst du mir helfen, meinen On Balance Volume Divergence EA konsistent profitabler zu machen? Vielleicht ändern Sie einige Dinge in den Code oder fügen Sie einige Funktionen und machen es besser bitte. der Code ist voll funktionsfähig, aber ich bin nicht zufrieden mit den Ergebnissen, die ich von ihm bekommen
#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;    
         }
      }   
   }
} 
Dateien:
 
Aesen #:

Einige Funktionen, die ich im Sinn hatte, dass wäre schön, auf der EA haben ist Trendlinien für wenn versteckte und regelmäßige Divergenz auf den Preis-Charts und der obv-Indikator gebildet wird, vielleicht eine schöne Trailing-Stop, auch Eingaben, die etwas wie dieses aussehen:


Variable Wert

Reguläre Divergenz Wahr/Falsch

Versteckte Divergenz Wahr/Falsch

Indikator Trendlinien Wahr/Falsch

Preis-Trendlinien Wahr/Falsch


Ich versuche, diesen OBV Divergence EA dazu zu bringen, diesem Divergence Spickzettel zu folgen, den ich von babypips.com bekommen habe:


Bullische Divergenz(Umkehrung nach oben):

Candlestick Preis - Niedrigeres Tief

Ausgeglichenes Volumen - Höheres Tief


Baisse-Divergenz (Umkehrung nach unten):

Candlestick-Kurs - höheres Hoch

Bei ausgeglichenem Volumen - niedrigeres Hoch


Bullische versteckte Divergenz (Trendfortsetzung nach oben):

Candlestick-Kurs - höheres Tief

Bei ausgeglichenem Volumen - niedrigeres Tief


Verstecktebärische D ivergenz (Trendfortsetzungnach unten):

Candlestick-Kurs - Niedrigeres Hoch

Bei ausgeglichenem Volumen - höheres Hoch

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

Einige Funktionen, die ich im Sinn hatte, dass wäre schön, auf der EA haben ist Trendlinien für wenn versteckte und regelmäßige Divergenz auf den Preis-Charts und der obv-Indikator gebildet wird, vielleicht eine schöne Trailing-Stop, auch Eingaben, die etwas wie dieses aussehen:


Variable Wert

Reguläre Divergenz Wahr/Falsch

Versteckte Divergenz Wahr/Falsch

Indikator Trendlinien Wahr/Falsch

Preis-Trendlinien Wahr/Falsch


Ich versuche, diesen OBV Divergence EA dazu zu bringen, diesem Divergence Spickzettel zu folgen, den ich von babypips.com bekommen habe:


Bullische Divergenz(Umkehrung nach oben):

Candlestick Preis - Niedrigeres Tief

Ausgeglichenes Volumen - Höheres Tief


Baisse-Divergenz (Umkehrung nach unten):

Candlestick-Kurs - höheres Hoch

Bei ausgeglichenem Volumen - niedrigeres Hoch


Bullische versteckte Divergenz (Trendfortsetzung nach oben):

Candlestick-Kurs - höheres Tief

Bei ausgeglichenem Volumen - niedrigeres Tief


Verstecktebärische D ivergenz (Trendfortsetzungnach unten):

Candlestick-Kurs - Niedrigeres Hoch

Bei ausgeglichenem Volumen - höheres Hoch

Eine weitere Funktion, die ich im Sinn hatte, war, dass der EA mehr Trades stapeln wird, wenn es zugunsten des ersten Trades geht, den er platziert, wenn das Sinn macht....


Wenn der EA zum Beispiel eine bullische Divergenz entdeckt, ein Kaufsignal vorliegt und der erste Kaufhandel platziert wird, wird der EA, wenn der Handel zu Gunsten des ersten vom EA platzierten Kaufhandels ausfällt, weitere Handelsgeschäfte in die Kaufrichtung stapeln und umgekehrt, wenn es sich um einen Verkaufshandel handelt.
 
Aesen #:

Eine weitere Funktion, die ich im Sinn hatte war, dass der EA mehr Trades stapeln wird, wenn es zugunsten der ersten Handel geht, die es platziert, wenn das Sinn macht....


Wenn der EA z.B. eine bullische Divergenz entdeckt und ein Kaufsignal gibt und der erste Kaufhandel platziert wird, wenn der Handel zugunsten des ersten Kaufhandels geht, den der EA platziert hat, dann stapelt der EA mehr Trades in die Kaufrichtung und umgekehrt, wenn es ein Verkaufshandel wäre.
Können Sie auch eine Zone Recovery Hedging-Strategie, wo ein erster Handel initiiert wird, sagen wir ein Kauf mit Losgröße 0,01, und wenn es in die negative Richtung mit einigen Pips, sagen wir unten durch 30 Pips, ein Gegenverkauf aktiviert wird mit einer höheren Losgröße, sagen wir 0,02, wo, wenn es weiter nach unten gehen, die Trades bei einem Break-even oder einen Gewinn zu schließen und die Schleife ist wieder gestartet. Wenn jedoch der Verkauf nicht gut funktioniert und der Preis steigt, wird ein weiterer Kauf mit einer höheren Losgröße, z. B. 0,03, zum gleichen Preis aktiviert, zu dem der erste Kauf eingeleitet wurde. Wenn der Preis weiter steigt und das Nettoergebnis ein Gewinn ist, schließt die Schleife die Geschäfte mit einem Gewinn und beginnt erneut. Wenn dies möglich ist, zu programmieren
 
der Code Skript ist für Mt5 nicht mt4
 

Hallo. Bitte schreiben Sie einen EA für MT4:

Schließt alle zuvor manuell eröffneten Trades, wenn der MA (mit allen verfügbaren Muwings-Einstellungen) den aktuellen Preis berührt. Sonst nichts (ist es ein halbautomatischer EA?).

 
torrr den aktuellen Preis berührt. Sonst nichts.

Hallo,

Ich habe es gerade erst gemacht und konnte es noch nicht testen. Ich hoffe, dass es bei Ihnen funktioniert.

Herzliche Grüße.

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

An: Antonio Simon Del Vecchio

Ich danke Ihnen! Ich bin ein Dummkopf... Ich musseinen EA in MetaEditorerstellen, diesen Code einfügen, ihn kompilieren und das war's?

 
torrr einen EA in MetaEditor erstellen, diesen Code einfügen, kompilieren und das war's?
Richtig. Wenn Sie sie kompilieren, wird der EA mit dem Namen erzeugt, den Sie dieser Datei im MetaEditor gegeben haben.

Jetzt frage ich allgemein für diejenigen, die mich lesen können: da ich den Code geteilt habe, ist es verboten, den EA zu teilen? ich meine die .exe-Datei?
 
"Ich habe es gerade erst gekocht und hatte keine Zeit, es zu testen". Und wie können Sie einen EA im Tester ausführen, der nur Positionen schließt?