Questions des débutants MQL5 MT5 MetaTrader 5 - page 649
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'ai vu un morceau de votre code pour trouver des sommets en zigzag - je pense qu'il provient d'Igor Kim. Ici, dans le code de recherche d'extremum, on insère en plus l'économie du temps d'extremum trouvé. Vous le cherchez dans la boucle... Pour l'identifier, il faut se souvenir du moment où l'indice de la boucle indique que l'extremum est déjà identifié - avant de renvoyer la valeur de son prix. C'est-à-dire que l'on passe en plus la variable datetime par référence dans la fonction où l'on doit écrire l'heure à laquelle on a trouvé l'extremum du zigzag. Lorsque la fonction renvoie la valeur du prix, elle écrit en plus dans cette variable la valeur de l'heure d'ouverture de la barre où se trouve l'extremum requis du zigzag.
Je suis désolé, mais je suis loin de mon ordinateur de travail et je ne peux pas vous donner un exemple de code.
Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas très bon en MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
Bonjour, j'écris un peu en MQL4, mais je suis un zéro complet en MQL5. J'avais besoin d'écrire une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Test des "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)
Insérez ceci au début du code
Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas familier avec MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
Si la tâche consiste uniquement à afficher sur l'écran, la meilleure solution est un indicateur. L'indicateur, dans OnCalculate() a toutes les séries temporelles nécessaires :
//| 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[])
{
Par défaut, dans l'indicateur MQL5, la barre la plus à droite a l'indice rates_total-1. Et votre tâche se résume à une soustraction élémentaire :
Cependant, cette approche simple ne s'affichera correctement que si l'indicateur fonctionne sur l'échelle de temps D1. S'il est exécuté sur d'autres horizons temporels, alors CopyHigh et CopyLow doivent être utilisés - en gros, rien de compliqué.
Maintenant je vais écrire un exemple....
//| 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);
}
//+------------------------------------------------------------------+
Vous pouvez maintenant exécuter l'indicateur sur n'importe quelle période du symbole actuel et choisir pour quelle période calculer la différence entre le haut et le bas.Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas très bon en MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
//| 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;}
//+------------------------------------------------------------------+
Bonjour 2016.10.21_19:58 MSC. Vérification du conseiller dans le testeur de stratégie. Le conseiller travaille, ouvre et ferme une transaction. Mais le testeur de stratégie donne une erreur : position de départ incorrecte 0 pour la fonction ArrayMinimum ; -1 ; tableau hors de portée dans 'CLose.mqh' (86,59) ; le test s'est arrêté en raison d'une erreur critique dans l'EA. Il y a une capture d'écran du conseiller expert et le code du fichier CLose.mqh à activer. Je ne vois pas d'erreur en dehors du tableau dans ce code. C'est pourquoi je ne comprends pas quelle est l'erreur. S'il vous plaît, conseillez-moi si vous le pouvez. C'est tout pour le moment. 20:08 MSC.
Peut-on convertir cela en int (avec aon=NormalizeDouble(aon,0)), car cela ressemble à un double et le résultat n'est pas très clair ?
:
Il suffit d'entrer un paramètre d'entrée dans votre EA et, en fonction de la valeur qui lui est attribuée au démarrage, vous allez soit acheter uniquement, soit vendre uniquement :
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
...
void OnTick()
{
if(!Long)
trade.Sell(0.01);
if(Long)
trade.Buy(0.01);
}