Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 649

 
Artyom Trishkin:

Ich habe einen Teil Ihres Codes zum Finden von Zickzack-Scheitelpunkten gesehen - ich glaube, er stammt von Igor Kim. Hier wird in den Code der Extremumssuche zusätzlich die Speicherung der Zeit des gefundenen Extremums eingefügt. Sie suchen es in der Schleife... Denken Sie bei der Identifizierung an den Zeitpunkt, auf den der Schleifenindex zeigt, wenn das Extremum bereits identifiziert ist - bevor der Wert seines Preises zurückgegeben wird. D.h., die Datetime-Variable wird zusätzlich per Referenz in die Funktion übergeben, in der die Zeit beim Auffinden des Extremwerts des Zickzacks geschrieben werden soll. Wenn die Funktion den Wert des Preises zurückgibt, schreibt sie zusätzlich in diese Variable den Wert des Zeitpunkts der Balkeneröffnung, an dem sich das gewünschte Extremum des Zickzackkurses befindet.

Es tut mir leid, aber ich bin nicht an meinem Arbeitscomputer und kann Ihnen kein Codebeispiel geben.

Es hat alles geklappt, danke!
 
Hallo! Ich schreibe ein wenig in MQL4, aber ich bin nicht sehr gut in MQL5. Ich brauche ein kleines Hilfsmittel, um die Differenz zwischen Tageshöchst- und -tiefstwert zu berechnen. Die 4. Version hat gute Funktionen für diesen Zweck iHigh und iLow, aber sie fehlen hier. Ich habe versucht, copyHigh und copyLow zu verwenden, aber nach der Subtraktion des Minimalwertes vom Maximalwert treten immer wieder Fehler auf. Könnten Sie mir bitte sagen, wie ich dieses Problem lösen kann, vorzugsweise mit einem Codeschnipsel. Vielen Dank im Voraus!
 
Александр Богданов:
Hallo! Ich schreibe ein wenig in MQL4, aber ich bin nicht sehr gut in MQL5. Ich brauche ein kleines Hilfsmittel, um die Differenz zwischen Tageshöchst- und -tiefstwert zu berechnen. Die 4. Version hat gute Funktionen für diesen Zweck iHigh und iLow, aber sie fehlen hier. Ich habe versucht, copyHigh und copyLow zu verwenden, aber nach der Subtraktion des Minimalwertes vom Maximalwert treten immer wieder Fehler auf. Könnten Sie mir bitte sagen, wie ich dieses Problem lösen kann, vorzugsweise mit einem Codeschnipsel. Vielen Dank im Voraus!
Zeigen Sie mir lieber Ihr Codefragment mit vielen Fehlern und geben Sie mir eine Reihe von Kommentaren dazu, was falsch ist.
 
Александр Богданов:
Hallo! Ich schreibe ein bisschen in MQL4, aber ich bin eine komplette Null in MQL5. Ich musste ein kleines Hilfsprogramm schreiben, um die Differenz zwischen Tageshöchst- und -tiefstwert zu berechnen. Die 4. Version hat gute Funktionen für diesen Zweck iHigh und iLow, aber sie fehlen hier. Ich habe versucht, copyHigh und copyLow zu verwenden, aber nach der Subtraktion des Minimalwerts vom Maximalwert treten immer wieder viele Fehler auf. Könnten Sie mir bitte sagen, wie ich dieses Problem lösen kann, vorzugsweise mit einem Codeschnipsel. Vielen Dank im Voraus!
Fügen Sie ihn am Anfang des Codes ein

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Testen von 'CopyTicks'

fxsaber, 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
So können Sie iHigh und iLow verwenden, wie Sie es von MT5 gewohnt sind.
 
fxsaber:
fxsaber:
Fügen Sie Folgendes am Anfang des Codes ein
Damit können Sie das bekannte iHigh und iLow im MT5 verwenden.
Herzlichen Dank! Dies wird es sehr einfach machen
 
Александр Богданов:
Hallo! Ich schreibe ein wenig in MQL4, aber ich bin nicht vertraut mit MQL5. Ich brauche ein kleines Hilfsmittel, um die Differenz zwischen Tageshöchst- und -tiefstwert zu berechnen. Die 4. Version hat gute Funktionen für diesen Zweck iHigh und iLow, aber sie fehlen hier. Ich habe versucht, copyHigh und copyLow zu verwenden, aber nach der Subtraktion des Minimalwertes vom Maximalwert treten immer wieder Fehler auf. Könnten Sie mir bitte sagen, wie ich dieses Problem lösen kann, vorzugsweise mit einem Codeschnipsel. Vielen Dank im Voraus!

Wenn die Aufgabe nur in der Anzeige auf dem Bildschirm besteht, ist die beste Lösung ein Indikator. Der Indikator in OnCalculate() hat alle notwendigen Zeitreihen:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

Im MQL5-Indikator hat der Balken ganz rechts standardmäßig den Index rates_total-1. Und Ihre Aufgabe besteht aus einer elementaren Subtraktion:

   double difference=high[rates_total-1]-low[rates_total-1];


Allerdings wird dieser einfache Ansatz nur dann korrekt angezeigt, wenn der Indikator auf dem Zeitrahmen D1 läuft. Wenn es auf anderen Zeitrahmen ausgeführt wird, dann sollten CopyHigh und CopyLow verwendet werden - im Grunde nichts Kompliziertes.

Jetzt werde ich ein Beispiel schreiben....

//+------------------------------------------------------------------+
//|                                               High minus Low.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period=PERIOD_D1;   // для какого периода считать High-Low
//---
double multiplier=0.0;
double High[],Low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   multiplier=MathPow(10,Digits());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- разницу цен переводим в пункты
   double difference=(iHigh(Symbol(),period,0)-iLow(Symbol(),period,0))*multiplier;
//--- вывод результата на экран
   Comment("High-Low=",DoubleToString(difference,0));
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                            |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+


Jetzt können Sie den Indikator auf einem beliebigen Zeitrahmen des aktuellen Symbols ausführen und auswählen, für welchen Zeitrahmen die Differenz zwischen Hoch und Tief berechnet werden soll.
Dateien:
 
Александр Богданов:
Hallo! Ich schreibe ein wenig in MQL4, aber ich bin nicht sehr gut in MQL5. Ich brauche ein kleines Hilfsmittel, um die Differenz zwischen Tageshöchst- und -tiefstwert zu berechnen. Die 4. Version hat gute Funktionen für diesen Zweck iHigh und iLow, aber sie fehlen hier. Ich habe versucht, copyHigh und copyLow zu verwenden, aber nach der Subtraktion des Minimalwertes vom Maximalwert treten immer wieder Fehler auf. Könnten Sie mir bitte sagen, wie ich dieses Problem lösen kann, vorzugsweise mit einem Codeschnipsel. Vielen Dank im Voraus!
Wenn Sie die Tageshöchst- und -tiefstwerte (Höchst- und Tiefstwerte des aktuellen Tages) abrufen möchten, können Sie SymbolInfoDouble() mit den Bezeichnern SYMBOL_BIDHIGH und SYMBOL_BIDLOW (oder einem anderen, wie Sie es wünschen) verwenden.
 
Hallo 2016.10.21_19:58 MSC. Überprüfen des EA im Strategietester. Der EA funktioniert, öffnet und schließt einen Handel. Aber Strategie-Tester gibt Fehler: falsche Startposition 0 für ArrayMinimum-Funktion; -1; Array außerhalb des Bereichs in 'CLose.mqh' (86,59); Testing Pass gestoppt aufgrund eines kritischen Fehlers in der EA. Hier finden Sie einen Screenshot des Expert Advisors und den Code der zu aktivierenden Datei CLose.mqh. Ich sehe keinen Fehler außerhalb des Arrays in diesem Code. Deshalb verstehe ich auch nicht, wo der Fehler liegt. Bitte beraten Sie mich, wenn Sie können. Das ist alles für den Moment. 20:08 MSC. Kritischer Fehler
//+------------------------------------------------------------------+
//|                                                        CLose.mqh |
//|                                              Nickityuk N., 2016. |
//|                             https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link      "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order                                        |
//+------------------------------------------------------------------+
void CLose()
  {if(buy==0 && sell==0) {return;}
   else if(OrderType()==OP_BUY) {CloseBuy();}
        else                     CloseSell();}
//+------------------------------------------------------------------+
void St()
  {St0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,0);
   Si0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,0);
   St1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,1);
   Si1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,1);}
void CloseBuy()
  {St(); if(St0-20>0 && Si0-20>0)
           {if(St1-Si1>0 && St0-Si0<0) {AOm0=iAO(NULL,0,0);
               if(AOm0-AOm1>=0) {AOm1=iAO(NULL,0,0); return;}
               else if(St0-80>0 && St0-100<=0 && Si0-80>0)
                      {if(Si0-100<=0 && St1-Si1>0 && St0-Si0<0)
                         {TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
                       else return;}            
                    else return;}
            else return;}        
         else return;}
void CloseSell()
  {St(); if(St0-80<0 && Si0-80<0)
           {if(St1-Si1<0 && St0-Si0>0) {AOn0=iAO(NULL,0,0);
               if(AOn0-AOn1<=0) {AOn1=iAO(NULL,0,0); return;}
               else if(St0-20<0 && St0>=0 && Si0-20<0)
                      {if(Si0>=0 && St1-Si1<0 && St0-Si0>0)
                         {TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
                       else return;}  
                    else return;}
            else return;}        
         else return;}
//+------------------------------------------------------------------+                      
void CalculateClose()
  {v0=iVolume(NULL,PERIOD_M1,0); //--- go trading only for first tiks of new bar
   v1=iVolume(NULL,PERIOD_M1,1);
   v2=iVolume(NULL,PERIOD_M1,2);
   v3=iVolume(NULL,PERIOD_M1,3);
   v4=iVolume(NULL,PERIOD_M1,4);
   if(v0+v1+v2+v3+v4-10/12>0) return;  
   for(index=0;index<24;index++)
     {AO[index]=iAO(NULL,PERIOD_M5,index);}
   ArrayResize(AO,24,4);
   ArraySetAsSeries(AO,true);}
   //index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+      
void TwoExtremeAO_Buy()
  {CalculateClose();
   if(ArrayMaximum(AO,23,0)==0) return;
   else aom=ArrayMaximum(AO,23,0); AOmax=AO[aom];
   if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
   else return;
   if(ArrayMaximum(AO,aon,0)==0) return;
   else aom2=ArrayMaximum(AO,aon,0); AOmax2=AO[aom2];
     if(AOmax2-AOmax>0) {return;}
     else if(AOmax2-AOmax<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
                                   //Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
                                   //SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
                                   TP=NormalizeDouble(Ask-tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_SELL,LotsCalculated(),Bid,50,0,TP,"",MAGIC,0,Red);
                                   AOn1=iAO(NULL,0,index); return;}
          else return;}
//+------------------------------------------------------------------+          
void TwoExtremeAO_Sell()
  {CalculateClose();
   if(ArrayMinimum(AO,23,0)==0) return;
   else aon=ArrayMinimum(AO,23,0); Print(aon,""); AOmin=AO[aon];
   if(ArrayMaximum(AO,aon,0)>0) {aom=ArrayMaximum(AO,aon,0);}
   else return;
   if(ArrayMinimum(AO,aom,0)==0) return;
   else aon2=ArrayMinimum(AO,aom,0); AOmin2=AO[aon2]; //Print(aon2,"");
     if(AOmin2-AOmin>0) {return;}
     else if(AOmin2-AOmin<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
                                   //Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
                                   //SL=NormalizeDouble(ldf-(1*_Point),_Digits);
                                   TP=NormalizeDouble(Bid+tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_BUY,LotsCalculated(),Ask,50,0,TP,"",MAGIC,0,Blue);
                                   AOm1=iAO(NULL,0,0); return;}
          else return;}
//+------------------------------------------------------------------+                      
void OneExtremeBuy()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index)==0) {index++;}
   z5max0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index); ttm=iTime(NULL,0,index); clm=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((clm-(z5max0-300*Point))<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
void OneExtremeSell()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index)==0) {index++;}
   z5min0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index); ttn=iTime(NULL,0,index); cln=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((cln-(z5min0+300*Point))>0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
//+------------------------------------------------------------------+                                                                      
void ExpirationBuy()
  {hm=TimeHour(ttm); if((hm+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
void ExpirationSell()
  {hn=TimeHour(ttn); if((hn+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
//+------------------------------------------------------------------+          
 
Николай Никитюк:
Hallo 2016.10.21_19:58 MSC. Überprüfung des Beraters im Strategietester. Der Advisor arbeitet, eröffnet und schließt einen Handel. Aber Strategie-Tester gibt Fehler: falsche Startposition 0 für ArrayMinimum-Funktion; -1; Array außerhalb des Bereichs in 'CLose.mqh' (86,59); Testing Pass gestoppt aufgrund eines kritischen Fehlers in der EA. Hier finden Sie einen Screenshot des Expert Advisors und den Code der zu aktivierenden Datei CLose.mqh. Ich sehe keinen Fehler außerhalb des Arrays in diesem Code. Deshalb verstehe ich auch nicht, wo der Fehler liegt. Bitte beraten Sie mich, wenn Sie können. Das ist alles für den Moment. 20:08 MSC.

Kann dies in int umgewandelt werden (mit aon=NormalizeDouble(aon,0)), denn es sieht aus wie double und es ist nicht ganz klar, was das Ergebnis ist?

:

if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
 
Karputov Vladimir:

Geben Sie einfach einen Eingabeparameter in Ihren EA ein, und je nachdem, welchen Wert Sie ihm beim Start zuweisen, werden Sie entweder nur kaufen oder nur verkaufen:

input bool Long=true;            // allow only "Long"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
...
void OnTick()
  {
   if(!Long)
      trade.Sell(0.01);
   if(Long)
      trade.Buy(0.01);
  }
Und was empfehlen Sie für den manuellen Handel?
Grund der Beschwerde: