Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 649
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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.
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 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!
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Testen von 'CopyTicks'
fxsaber, 2016.10.19 07:59
// А так же задает привычные 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)
Fügen Sie Folgendes am Anfang des Codes ein
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:
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.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!
//| 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?
:
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:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
...
void OnTick()
{
if(!Long)
trade.Sell(0.01);
if(Long)
trade.Buy(0.01);
}