Erreurs, bugs, questions - page 803

 
Karlson:
Serveurs différents, 500 pp différents.
Qu'est-ce que cela a à voir avec les différents serveurs ? Il s'agit de deux tests réalisés par la même personne. Seule la paire de devises spécifiée dans le testeur diffère.
 
ilunga:
Qu'est-ce que cela a à voir avec les différents serveurs ? Il s'agit de deux tests réalisés par la même personne. Seule la paire de devises spécifiée dans le testeur diffère.
Mettez à jour votre terminal/tester et peut-être que tout fonctionnera, j'ai le build 687 et tout fonctionne.
 
fyords:

J'ai tout correct, démo MK serveur.

Veuillez alors expliquer quelle est la valeur entre parenthèses lorsque vous ouvrez un ordre et pourquoi dans un cas c'est (1,29565 / 1,29654) et dans l'autre (1,29443 / 1,29479 / 1,29443).

(Je parle des résultats de vos tests.

fyords:
Mettez à jour votre terminal/tester et peut-être que tout fonctionnera, j'ai un build 687 et tout fonctionne.

C'est exactement la même erreur qui apparaît lors de l'envoi de l'EA au championnat (dans leurs tests automatiques), donc la mise à jour ne sera que partiellement utile.


Qui plus est. Il n'apparaît qu'une seule fois (lors de la toute première tentative de passer un ordre sur une paire de devises autre que "votre").

 
ilunga:
Qu'est-ce que cela a à voir avec les différents serveurs ? Il s'agit de deux tests réalisés par la même personne. Seule la paire de devises spécifiée dans le testeur diffère.

Jetez un coup d'œil aux articles sur le testeur :

Les prix ne doivent pas nécessairement être les mêmes lorsqu'ils sont testés sur une autre paire de devises.

 
Rosh:

Jetez un coup d'œil aux articles sur le testeur :

Les prix ne doivent pas nécessairement correspondre lorsqu'ils sont testés sur une autre paire de devises.

Donc, j'ai fait d'autres tests. Vraiment un problème avec le "prix actuel".

Code :

#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CSymbolInfo       m_sym;
CTrade            m_trade;

double bar_info[2];
bool a;

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

void OnTick()
{
   if (a) return;
   a = true;
   m_sym.Refresh();
   m_sym.RefreshRates();
   CopyHigh("EURUSD", PERIOD_D1, 0, 2, bar_info);
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
   Print("Цена открытия:" + DoubleToString(bar_info[1] + 5000*_Point));
   BUY_pending("EURUSD");
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
}

uint BUY_pending(string symbol)
{
   CopyHigh(symbol, PERIOD_D1, 0, 2, bar_info);
   // готовим запрос
   MqlTradeRequest request = {0};
   ZeroMemory(request);
   request.action = TRADE_ACTION_PENDING;
   request.magic  = 0;
   request.symbol = symbol;
   request.volume = 1;
   request.price  = m_sym.Ask() + 1;
   request.sl     = 0;
   request.tp     = 0;
   request.deviation = 10;
   request.type   = ORDER_TYPE_BUY_STOP; 
   request.type_filling = ORDER_FILLING_FOK;
   MqlTradeResult result;
   OrderSend(request,result);
   Print(IntegerToString(result.retcode));
   return (result.retcode);
}

Notez que j'ouvre au prix du symbole Ask plus 1 (avec une marge énorme). En même temps, avant et après, j'imprime l'offre et la demande actuelles.


Résultats (lors du test sur GBPUSD) :

GR      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
LH      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000
QL      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Цена открытия:1.34220000
GD      0       Trade   11:49:40        2012.01.02 09:00:00   buy stop 1.00 EURUSD at 2.29241 (1.29709 / 1.29722)
IG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   10009
CP      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
HG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000

Le prix 1.29241 est imprimé avant et après la passation de l'ordre. Entre-temps, entre parenthèses (lorsque l'ordre est passé), le prix est de 1,29722. COMMENT ? Ou est-ce que j'obtiens le prix actuel de manière incorrecte ?


Et deuxièmement, s'il y avait une erreur avec le prix, alors pourquoi l'erreur 10016 (arrêts) ?

 
ilunga:

Mais l'erreur existe toujours dans la scène.

Pour être honnête, je ne comprends pas bien comment l'erreur 10016 peut être en cas d'absence d'arrêt.

Je ne sais pas ce que vous faites et comment vous le faites, le problème se situe probablement dans SL.

Ma version fonctionne sans problème. L'appel, cependant, jeté dans le bloc d'initialisation, de ne pas s'embêter avec les contrôles (bien que la présence de l'ordre avant de le mettre en place serait à vérifier).

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

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,2,bar_info);

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

price = NormalizeDouble(bar_info[1] + 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)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
Dossiers :
 
Interesting:

Je ne sais pas ce que vous faites ni comment vous le faites, le problème vient probablement de SL.

Ma version fonctionne sans problème. L'appel est vrai, mais j'ai jeté l'appel au bloc d'initialisation, pour ne pas m'embêter avec les vérifications (bien que la présence de l'ordre avant de le fixer vaille la peine d'être vérifiée).

Une petite demande. Pouvez-vous corriger le code, afin qu'il affiche le prix actuel du symbole avant l'envoi de l'ordre ?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
ilunga:
Une petite demande. Pouvez-vous modifier le code de sorte qu'avant l'envoi de l'ordre, il affiche le prix actuel de l'instrument sur lequel nous ouvrons ?

Essayez de cette façon :

   MqlTradeResult result;
   if(!OrderSend(request,result))
     {
      PrintFormat("retcode=%d price=%G  Ask=%G  Bid=%G Comment=%s",
                  result.retcode,result.price,result.ask,result.bid,result.comment);
      //---
      PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
                  EnumToString(request.type),symbol,request.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
                  SymbolInfoDouble(symbol,SYMBOL_BID));
      Print("------------");
     }
 
ilunga:
Petite demande. Pouvez-vous corriger le code pour qu'il affiche le prix actuel sur cet outil avant l'envoi de la commande ?

Un pschitt de prix ? Je n'en vois pas l'utilité, vous pouvez ajouter un message sur le succès/échec de la vérification et le paramétrage de l'ordre.

En principe, vous pouvez le faire vous-même, cela ne devrait pas être difficile (en théorie).

Rosh:

Essayez de cette façon :

Pour le débogage, il fera l'affaire, mais dans le code opérationnel, il sera superflu (ou du moins une solution un peu problématique).

Et il est préférable de passer la commande après OrderCheck, de sorte qu'en cas d'erreur, elle n'ira pas à OrderSend.

PS

J'ai oublié d'ajouter que, d'après l'exemple, bar_info pourrait être placé dans une fonction sans problème.

 
Interesting:

Un pschitt de prix ? Je n'en vois pas l'utilité, vous pouvez ajouter un message sur le succès/échec de la vérification et le paramétrage de l'ordre.

En principe, vous pouvez le faire vous-même, cela ne devrait pas être difficile (en principe).

C'est peut-être suffisant pour le débogage, mais dans un code de production, ce sera superflu (du moins, c'est une solution un peu tordue).

Et il serait préférable de passer la commande après OrderCheck, de sorte qu'en cas d'erreur, nous n'arriverons pas à OrderSend.

PS

J'ai oublié d'ajouter que, sur la base de l'exemple, bar_info pourrait également être placé dans une fonction sans aucun problème.

C'est drôle. Dans votre exemple, j'ai supprimé le BUYSTOP pour la GBP, il ne reste que l'EURUSD.

Après avoir rempli les champs de la requête, j'ai sorti le prix de l'ordre en attente.

1) Vous avez une variante - l'ordre en attente est placé dans l'Inite.

2012.01.01 00:00:00 prix = 1,30487000

2) J'ai commenté l'init et l'ai déplacé vers OnTick. J'ai mis une condition pour qu'elle ne se déclenche que sur le premier tick.

2012.01.02 09:00:00 prix = 1,29720000


P.S. Je comprends bien que dans mon (et votre) code bar_info[1] est le maximum de la barre actuelle ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Raison: