Erreurs, bugs, questions - page 804

 

ilunga:

P.S. Ai-je raison de supposer que dans mon (et votre) code bar_info[1] est le maximum de la barre actuelle ?

Personne n'a parlé du bar actuel. :)

Je viens de refaire ton exemple. Si tu veux exactement la barre actuelle, tu dois le faire :

1. définir la direction de la série de tableaux (0 bar - courant ou le plus haut).

Si, comme dans notre cas, le tableau est déplacé, vous pouvez le faire une fois dans le bloc d'initialisation. Si nous cachons le tableau dans une fonction, nous le définissons sur place.

2) Si le tableau est déclaré comme une série, la barre actuelle sera zéro, et celle qui l'a précédée sera 1.

Du moins, d'après mes souvenirs.

 

J'ai peut-être manqué quelque chose, mais pour ouvrir sur la barre actuelle (en tenant compte de tous les ajouts), cela devrait être comme ceci.

Déplacez le tableau vers la fonction !

//Function BUY_pending
bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

double bar_info[1];

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of array
ArraySetAsSeries(bar_info,true);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,1,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);

  if(!Result)
  //Print message for user
  {
  PrintFormat("retcode=%d",CheckResult.retcode);

  PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
              EnumToString(TradeRequest.type),symbol,TradeRequest.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
              SymbolInfoDouble(symbol,SYMBOL_BID));                  
  Print("------------");
  }

  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
 
Interesting:

Et personne n'a rien dit à propos de l'actuel. :)

Je viens de retravailler ton exemple. Si tu as besoin de l'actuel, tu dois le faire :

1) Définir la direction de la série de tableaux (0 barre - actuelle ou la plus récente).

Si, comme dans notre cas, le tableau est déplacé, vous pouvez le faire une fois dans le bloc d'initialisation. Si nous cachons le tableau dans une fonction, nous le définissons sur place.

Si le tableau est déclaré comme une série, la barre actuelle sera zéro, et la barre fermée avant sera 1.

Du moins, comme je m'en souviens.

J'ai étendu le tableau à 3 éléments. J'ai un décalage entre le prix actuel et ce qu'il y a dedans. C'est très probablement la raison.

#include <Trade\SymbolInfo.mqh>
double bar_info[3];

CSymbolInfo m_sym1;
CSymbolInfo m_sym2;

bool a;
int OnInit()
{
   SymbolSelect("EURUSD",true);
   SymbolSelect("GBPUSD",true);
   a = false;   
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
   if(ResCopy==-1)return;
   Print("bar_info[0] = " + DoubleToString(bar_info[0]));
   Print("bar_info[1] = " + DoubleToString(bar_info[1]));
   Print("bar_info[2] = " + DoubleToString(bar_info[2]));
   PrintFormat("Ask=%G  Bid=%G  ", SymbolInfoDouble("EURUSD",SYMBOL_ASK), SymbolInfoDouble("EURUSD",SYMBOL_BID));
}

Résultats (les tests ont été effectués sur GBPUSD) :

FR      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   bar_info[0] = 1.29591000
LH      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   bar_info[1] = 1.29987000
OF      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   bar_info[2] = 1.29220000
QN      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   Ask=1.29722  Bid=1.29709  

Nous obtenons que l'offre et la demande sont toutes deux supérieures au maximum de zéro et supérieures au maximum de la deuxième barre.


Si nous exécutons le test sur l'EURUSD, tout est OK :

FL      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   bar_info[0] = 1.29591000
LJ      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   bar_info[1] = 1.29987000
OP      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   bar_info[2] = 1.29220000
CO      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   Ask=1.29241  Bid=1.2922  


J'ai l'impression que lors du test de la paire "pas mon" la situation "les informations sur les barres ont été mises à jour, mais le tick est encore absent".

 
ilunga:

J'ai étendu le tableau à 3 éléments. J'obtiens une incohérence entre le prix actuel et le contenu du tableau. C'est très probablement la raison.

Résultats :

Nous obtenons que l'offre et la demande sont toutes deux supérieures au maximum de la barre zéro et supérieures au maximum de la deuxième barre.

Vous ne tenez pas compte de la sérialité des tableaux, dans votre code. Personne ne peut garantir qu'avec ce résultat, le bar 0 ne sera pas, disons, en l'an 2000.

J'ai donné le code ci-dessus, il convient pour toutes les TFs dans la variante du tableau.

Ce code est là pour une raison.

//Preparation of array
ArraySetAsSeries(bar_info,true);

Si vous n'avez besoin que d'un intervalle de temps quotidien (D1 ) pour identifier le maximum de la barre, vous n'avez pas besoin de vous occuper du tableau, il suffit de changer la première partie de la fonction par celle-ci

//Function BUY_pending
bool BUY_pending(string symbol,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
double High  = 0; //The maximum value of bid for the current day

int Dig     = 0; //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Calculations
High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);
Dig  = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(High + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
 
Interesting:

Vous ne tenez pas compte de la sérialité des tableaux dans votre code. Personne ne peut garantir qu'à ce stade, la barre de 0 ne sera pas en 2000.

J'ai donné le code ci-dessus, il convient pour toutes les TFs dans la variante du tableau.

Ce code est là pour une raison

ArraySetAsSeries uniquement pour les tableaux dynamiques?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting:

Vous ne tenez pas compte de la sérialité des tableaux dans votre code. Personne ne peut garantir qu'à cette issue, le bar 0 ne sera pas en l'an 2000, par exemple.

J'ai donné le code ci-dessus, il convient pour toutes les TFs dans la variante du tableau.

Ce code est là pour une raison.

Ok, rendez le tableau dynamique.

#include <Trade\SymbolInfo.mqh>
double bar_info[];

CSymbolInfo m_sym1;
CSymbolInfo m_sym2;

bool a;
int OnInit()
{
   ArrayResize(bar_info, 3);
   ArraySetAsSeries(bar_info,ххх);
   SymbolSelect("EURUSD",true);
   SymbolSelect("GBPUSD",true);
   a = false;   
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
   if(ResCopy==-1)return;
   Print("bar_info[0] = " + DoubleToString(bar_info[0]));
   Print("bar_info[1] = " + DoubleToString(bar_info[1]));
   Print("bar_info[2] = " + DoubleToString(bar_info[2]));
   PrintFormat("Ask=%G  Bid=%G  ", SymbolInfoDouble("EURUSD",SYMBOL_ASK), SymbolInfoDouble("EURUSD",SYMBOL_BID));
}

Au lieu de xxx, nous mettons vrai et faux.

Les résultats :

FF      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   bar_info[0] = 1.29220000
GL      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   bar_info[1] = 1.29987000
OJ      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   bar_info[2] = 1.29591000
FR      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   Ask=1.29722  Bid=1.29709  

и

JP      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   bar_info[0] = 1.29591000
PN      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   bar_info[1] = 1.29987000
KD      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   bar_info[2] = 1.29220000
MP      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   Ask=1.29722  Bid=1.29709  

L'ordre dans le tableau est modifié, le résultat ne l'est pas. L'offre est supérieure à la [0]-ième barre maximale du tableau.

 
ilunga:
ArraySetAsSeries uniquement pour les tableaux dynamiques?

Je ne m'en souviens pas pour être honnête. Mais le résultat du code que j'ai cité ci-dessus coïncide avec celui que nous obtenons (pour EUR le prix ouvert est de 1.24516 pour GBP 1.56721)

High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);

Mais oui, cela fonctionne bien sans ArraySetAsSeries à ce stade.

//+------------------------------------------------------------------+
//Function BUY_pending
bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

double bar_info[1];

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,1,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);

PS

C'est-à-dire que si vous voulez obtenir la barre actuelle, vous copiez inutilement trois barres dans le tableau sur cette ligne.

//Это не правильно
int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
//так правильно
int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,1,bar_info);

//если PERIOD_D1 не меняется вот идеальный вариант
 High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);
 
Interesting:

PS

Par exemple, si vous avez besoin d'obtenir la barre actuelle, vous devez absolument copier trois barres dans cette ligne vers le tableau.

Merci ! Cette option fonctionne sans erreur et est tout à fait suffisante dans ce cas.


Cependant, la question laissée en suspens juste au-dessus est de savoir comment l'offre peut être supérieure au maximum =(

 

ilunga:

Cependant, la question laissée en suspens ci-dessus est de savoir comment l'offre peut être supérieure au maximum =(

Tout d'abord, nous devons déterminer pour quelle période ce maximum est pris.

Si le tableau est déclaré comme double bar_info[n], la barre actuelle sera l'indice le plus élevé.

si n = 2 ce code fonctionnera avec la barre quotidienne d'hier

int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,2,bar_info);
price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);

et celui-ci avec la barre actuelle

int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,2,bar_info);
price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);

Par exemple, si vous copiez plusieurs barres, vous devriez organiser quelque chose comme ceci pour obtenir la barre actuelle (bien que vous puissiez avoir besoin de vérifications supplémentaires pour savoir combien de barres ont été copiées dans le tableau).

price = NormalizeDouble(bar_info[ResCopy-1] + 500*_Point,Dig);
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
Interesting:

La première chose à faire est de définir la période sur laquelle ce maximum est pris.

Si le tableau est déclaré comme double bar_info[n], la barre actuelle sera l'indice le plus élevé.

Ainsi, il y a un code à la page précédente où il y a un tableau de 3 éléments. En l'éditant avec Prints, nous obtenons que Bid = 1.29709, alors que bar_info[n-1] enregistre 1.29220
Raison: