Questions des débutants MQL5 MT5 MetaTrader 5 - page 563

 
Василий:
Oui, je demande à propos de MQL 5 ? Oui, il faut accéder aux données du symbole actuel. Les données sont nécessaires dans le code EA. J'ai donc besoin, par exemple, de connaître le prix de clôture de la barre qui précède la barre actuelle.
Regardez l'exemple de CopyTime
 
Karputov Vladimir:
Consultez l'exemple pour CopyTime
Compris, je vais essayer de trouver une solution. Merci !
 
Василий:
Oui, je demande à propos de MQL5 ? Oui, il faut accéder aux données du symbole actuel. Les données dont nous avons besoin dans le code de l'Expert Advisor. Ainsi, par exemple, j'ai besoin de connaître le prix de clôture de la barre qui précède la barre actuelle.

Vous devriez lire un peu la documentation.

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

Voici un exemple d'obtention du prix de clôture et des indicateurs tampons

ENUM_ORDER_TYPE indicator_01()
  {
   double ma[2];
   double close[2];
   static int h_ma=INVALID_HANDLE;
   if(Bars(_Symbol,PERIOD_CURRENT)<ma_period+1)return(WRONG_VALUE);
   if(h_ma==INVALID_HANDLE || h_ma==0)
     {
      h_ma=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
      return(WRONG_VALUE);
     }
   if(CopyBuffer(h_ma,0,1,2,ma)<2) return(WRONG_VALUE);
   if(CopyClose(_Symbol,PERIOD_CURRENT,1,2,close)<2) return(WRONG_VALUE);

   if(close[1]>ma[1]&&close[0]<ma[0])return(ORDER_TYPE_BUY);
   if(close[1]<ma[1]&&close[0]>ma[0])return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Sergey Gritsay:

...

Voici un exemple d'obtention du prix de clôture ainsi que des tampons de l'indicateur.

Mauvais exemple. La variable stockant le handle de l'indicateur dans MQL5 doit être déclarée dans l'"en-tête" - dans la zone des variables globales, et le handle doit être obtenu dans OnInit(). Ce n'est qu'alors que vous pourrez vous référer à la poignée de l'indicateur pour obtenir des données de n'importe où dans le programme.
 

Bonjour à tous !

J'obtiens des données sur l'historique des transactions dans le testeur en utilisant l'événement OnTrade.

  for(int i=0;i<HistoryDealsTotal();i++){
       ulong deal_ticket=HistoryDealGetTicket(i);
       Print("ticket=",deal_ticket);
       Print("price=",HistoryDealGetDouble(deal_ticket,DEAL_PRICE));
       Print("time=",TimeToString(HistoryDealGetInteger(deal_ticket,DEAL_TIME)));

Et voici ce que j'obtiens dans les journaux.

0 22:58:16.487 Core 1 2016.04.01 00:00 Nombre de barres dans l'historique du terminal pour le symbole-période GBPUSD en ce moment = 7729
JR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 Tentative de transaction 0 avec le lot 0.01
EL 0 22:58:16.487 Core 1 2016.04.01 03:00:00 market buy 0.01 GBPUSD sl : 1.43033 tp : 1.44034 (1.43646 / 1.43654 / 1.43646)
GO 0 22:58:16.487 Core 1 2016.04.01 03:00:00 deal #2 buy 0.01 GBPUSD at 1.43654 done (based on order #2)
GE 0 22:58:16.487 Core 1 2016.04.01 03:00:00 transaction effectuée [#2 acheter 0.01 GBPUSD à 1.43654].
NK 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ordre exécuté acheter 0.01 à 1.43654 [#2 acheter 0.01 GBPUSD à 1.43654].
HI 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=1
HM 0 22:58:16.487 Core 1 2016.04.01 03:00:00 prix=0.0
HH 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 00:00
CR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=2
ID 0 22:58:16.487 Core 1 2016.04.01 03:00:00 price=1.43654
OP 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 03:00

D'où vient le premier commerce à prix nul ? Je ne le fais pas :-).

Je ne le fais pas :-) Expliquez-moi, s'il vous plaît.

Z.P. Je pense que je l'ai. La première affaire a un bénéfice de 10K. Je ne sais pas quoi en faire mais c'est quand même étrange. Pourquoi ?

Et voici une autre question. La transaction (achat à 1.43654) n'a pas encore été ouverte. Comment est-il apparu dans l'histoire ?

J'ai besoin d'obtenir des données UNIQUEMENT sur les transactions fermées dans le tableau comme dans MQL4. Comment faire ?

P.S. Filtrer par DEAL_ENTRY_OUT ?

 
Alexandr Saprykin:
Avez-vous essayé de réinstaller le terminal ?
Oui, merci. C'est la seule chose qui a aidé.
 
Karputov Vladimir:
Mauvais exemple. La variable stockant le handle de l'indicateur dans MQL5 doit être déclarée dans le "header" - dans la zone des variables globales du programme, obtenir le handle dans OnInit(). Ce n'est qu'alors que vous pourrez vous référer à la poignée de l'indicateur pour obtenir des données de n'importe où dans le programme.

Je ne suis pas tout à fait d'accord avec vous pour obtenir un handle, car la fonction OnInit() est exécutée une fois et il n'y a pas de garantie à 100% que l'indicateur sera créé dès la première fois. Vous avez peut-être raison au sujet de la déclaration d'une variable, mais je veux savoir si la documentation suivante dit quelque chose de pire que la variante avec une variable statique

Les variables locales déclarées avec le mot clé static conservent leurs valeurs tant que la fonction existe. À chaque appel ultérieur d'une fonction, ces variables locales contiennent les valeurs qu'elles avaient lors de l'appel précédent.

 
<br / translate="no">

Filtrer par DEAL_ENTRY_OUT

 
Sergey Gritsay:

Je ne suis pas tout à fait d'accord avec vous pour obtenir un handle, car la fonction OnInit() est exécutée une fois et il n'y a pas de garantie à 100% que l'indicateur sera créé dès la première fois. Vous avez peut-être raison en ce qui concerne la déclaration d'une variable, mais je veux savoir à quel point l'option d'une variable statique est mauvaise dans la documentation

...

Nous vérifierons cela dans OnInit() lors de la création d'un handle d'indicateur. Si le handle de l'indicateur n'a pas été créé, onOnit() nous renverraINIT_FAILED. C'est-à-dire que le handle de l'indicateur n'est créé qu'une seule fois et uniquement dans OnInit(). Ce n'est pas "4" - désordre et errance et déclaration de poignées dans tous les coins du programme.
 
Karputov Vladimir:
À cette fin, OnInit() vérifie si le manche de l'indicateur est créé. Si le handle de l'indicateur n'a pas été créé, OnOnit() doit retournerINIT_FAILED. C'est-à-dire que le handle de l'indicateur n'est créé qu'une seule fois et uniquement dans OnInit(). Ce n'est pas "4" - ce n'est pas le désordre et l'errance et la déclaration de poignées dans tous les coins du programme.
Je ne serais pas aussi catégorique dans ma déclaration. Ce n'est pas le désordre dans les placards, c'est le désordre dans les têtes.
Raison: