Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 21

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
La seule chose à considérer ici est qu'après le bloc de la boucle i==x
Dans ce cas, Array[i] après for(...){} retournera une erreur de dépassement de tableau et c'est tout.
(J'ai besoin d'un indice, parce que je commence à avoir du retard)
Il y a une construction comme ça :
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));
Il trouve lehaut/basde la fourchette en N bougies.
Question : Comment trouver le mêmeHigh/Low, mais pas par les ombres, mais par les corps ?
(J'ai besoin d'un indice, parce que je commence à avoir du retard)
Il y a une construction comme ça :
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));
Il trouve lehaut/basde la fourchette en N bougies.
Question : Comment trouver le mêmeHigh/Low, mais pas par les ombres, mais par les corps ?
Je dois rechercher fmax(Open[i],Close[i]) pour le haut et fmin(Open[i],Close[i]) pour le bas.
C'est-à-dire, faire une boucle au lieu de deux lignes cherchant le High/Low ?
HighRange =iHigh(symbole,0,iHighest(symbole,0,MODE_HIGH,RangeBar,1)) ;
LowRange =iLow(symbole,0,iLowest(symbole,0,MODE_LOW,RangeBar,1))Ceci est nécessaire pour l'EA, pas l'indicateur, il fonctionne correctement dans l'EA, mais comment trouver la gamme par les corps - je ne peux pas penser à un.
C'est-à-dire, faire une boucle au lieu de deux lignes cherchant le High/Low ?
HighRange =iHigh(symbole,0,iHighest(symbole,0,MODE_HIGH,RangeBar,1)) ;
LowRange =iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));J'en ai besoin pour Expert Advisor, pas pour un indicateur, il fonctionne correctement dans Expert Advisor, mais je n'arrive pas à trouver comment trouver la plage par corps.
J'ai lancé un script de test. Il se peut que ce soit inexact, je n'ai pas travaillé dessus. J'espère que vous trouverez la solution.
//| sFindRangeByCandlesBody.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Begin=1; // Бар начала диапазона поиска
input int RangeBars=20; // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
RangeBars>bars-begin?bars-begin:
RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
MqlRates array[];
double high=0, low=0;
int highest=-1, lowest=-1;
if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
ArraySetAsSeries(array,true);
high=GetHighestValue(begin,array,highest);
low=GetLowestValue(begin,array,lowest);
}
Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
}
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
int sz=ArraySize(array);
if(sz==0) return(-1);
double high=DBL_MIN;
bar_highest=-1;
for(int i=0; i<sz; i++) {
double value=fmax(array[i].open,array[i].close);
if(value>high) {
high=value;
bar_highest=bar_begin+i;
}
}
return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
int sz=ArraySize(array);
if(sz==0) return(-1);
double low=DBL_MAX;
bar_lowest=-1;
for(int i=0; i<sz; i++) {
double value=fmin(array[i].open,array[i].close);
if(value<low) {
low=value;
bar_lowest=bar_begin+i;
}
}
return(low);
}
//+------------------------------------------------------------------+
J'ai mis en place un script de test. Il peut y avoir des inexactitudes - je l'ai écrit sur le vif. J'espère que vous y arriverez.
//| sFindRangeByCandlesBody.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Merci, ça marche très bien !
PS. J'ai cru comprendre que cette chose fonctionnera dans la cinquième ?
Merci, ça marche très bien !
PS. J'en déduis que cette chose fonctionnera dans la cinquième ?
{
//+--------------------------------------------------------------------+
//| -= stop loss в без убыток =- |
//+--------------------------------------------------------------------+
bool result;
double stop;
int cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
J'ai joint un script de test. C'est peut-être inexact, je n'ai pas travaillé ma main. J'espère que vous le comprendrez.
Si vous avez des questions...
Désolé Artem, mais je veux montrer la solution à ce problème d'une manière plus simple.
CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);
J'espère que chacun pourra l'écrire dans son code et ajouter les vérifications nécessaires. La fonctionnalité est la même pour mql4 et mql5.
Désolé, Artem, mais je veux montrer une solution plus simple à ce problème.
CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);
J'espère que chacun pourra l'écrire dans son code et ajouter les vérifications nécessaires. La fonctionnalité est la même pour mql4 et mql5.
О ! Merci. Je ne l'ai pas deviné moi-même le matin... C'est vrai, les tableaux devraient être vérifiés pour le remplissage. Je ne l'ai pas vu dans le quadruple, et dans le quintuple, les données ne sont souvent pas renseignées la première fois en raison du manque de données historiques.
ZS. Vous devriez dormir davantage - vos pensées iront dans ce sens.