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

 
Alexey Kozitsyn:
Et ce ne sont pas les positions ou les transactions qui doivent être vérifiées, mais les ordres, car un ordre vient en premier, puis une transaction, puis une position.

Pourquoi seulement des commandes ? Une transaction n'a-t-elle pas un identifiant de position (ticket) ?

 
Alexey Viktorov:

Pourquoi seulement des commandes ? Une transaction n'a-t-elle pas un identifiant de position (ticket) ?

Oui, vous avez raison. Les commandes et les transactions ont toutes deux un identifiant de position. Cependant, dans le cas général, nous devons savoir que la position se voit attribuer un identifiant du premier ordre qui a initié la transaction. Par conséquent, l'"entité" à l'origine de la position est l'ordre, et non la transaction. Et ce sont les commandes, et non les affaires, qui doivent être recherchées.

Dans la documentation :

L'identifiant du poste est un numéro unique qui est attribué à chaque poste nouvellement ouvert et qui ne change pas pendant toute sa durée de vie. Il correspond au ticket de l'ordre avec lequel la position a été ouverte.

L'identifiant de la position est spécifié dans chaque ordre (ORDER_POSITION_ID) et dans chaque transaction (DEAL_POSITION_ID) qui l'a ouvert, modifié ou fermé. Utilisez cette propriété pour rechercher les ordres et les transactions liés à la position.

 
Alexey Kozitsyn:

Oui, vous avez raison. Les ordres et les transactions ont tous deux un identifiant de position. Cependant, en général, vous devez savoir que la position se voit attribuer l'identifiant du premier ordre qui a initié la transaction. Par conséquent, l'"entité" à l'origine de la position est l'ordre, et non la transaction. Et ce sont les commandes, et non les affaires, qui doivent être recherchées.

Dans la documentation :

Je ne vais pas discuter, c'est exactement ce que dit la documentation. Mais ailleurs dans la même documentation, il est dit"En règle générale...", ce qui signifie qu'il peut y avoir des incohérences. Et voici le "en règle générale" que j'ai rencontré une fois...

position

Le billet de poste. Elle doit être remplie lorsqu'un poste est modifié et fermé, pour son identification unique. En règle générale, il correspond au ticket de l'ordre, à la suite duquel la position a été ouverte.

Je ne m'en souviens pas, et il est peu probable que je l'aie compris, lu, corrigé et oublié. Je l'ai lu, corrigé et oublié.
 
Vitaly Muzichenko:
Veuillez m'indiquer comment récupérer le ticket qui a été utilisé pour l'échange. Sur la capture d'écran, c'est "63214735".

Ici,vous cherchez le numéro de la position, dans la liste des transactions, sinon c'est une erreur.

Voici un script qui démontre ce que HistorySelectByPosition donne

//--- input parameters
input int      Position;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ulong Ticket;
  if ( HistorySelectByPosition(Position) )
  { Print("Position = "+IntegerToString(Position));
    int o=HistoryOrdersTotal()-1;
    while ( o>=0 )
    { Ticket=HistoryOrderGetTicket(o);
      Print("Order "+IntegerToString(o)+" = "+IntegerToString(Ticket));
      o--;
    }
    int d=HistoryDealsTotal()-1;
    while ( d>=0 )
    { Ticket=HistoryDealGetTicket(d);
      Print("Deal "+IntegerToString(d)+" = "+IntegerToString(Ticket));
      d--;
    }
  }
}

Et voici à quoi ressemble le résultat :

Position = 65328142
Order 1 = 65347809
Order 0 = 65328142
Deal 1 = 4070777
Deal 0 = 4051254

0 = Position ouverte

1 = Position fermée

Si vous ne l'obtenez pas = vous n'avez pas saisi une position de ticket.

Le même résultat peut être obtenu si nous commençons par le ticket de transaction :

Pour la fonction HistoryDealGetInteger()

ENUM_DEAL_PROPERTY_INTEGER

Identifiant

Description

Type

DEAL_TICKET

Ticket de caisse. Numéro unique à attribuer à chaque transaction

long

DEAL_ORDER

Ordre, sur la base duquel la transaction a été exécutée

long

HEURE DE LA TRANSACTION

Temps d'exécution de l'opération

datetime

DEAL_TIME_MSC

Temps d'exécution de la transaction en millisecondes à partir du 01.01.1970

long

DEAL_TYPE

Type de transaction

ENUM_DEAL_TYPE

DEAL_ENTRY

Direction de la transaction - entrée sur le marché, sortie du marché ou retournement de tendance

ENUM_DEAL_ENTRY

DEAL_MAGIC

Nombre magique pour l'opération (voir ORDER_MAGIC)

long

DEAL_REASON

Raison ou source de l'opération

ENUM_DEAL_REASON

DEAL_POSITION_ID

L'identifiant de la position à l'ouverture, la modification ou la fermeture de laquelle cette transaction a été impliquée. Chaque position possède un identifiant unique, qui est attribué à toutes les transactions effectuées sur l'instrument pendant la durée de vie de la position.

long

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

Merci !

J'avais besoin de ceci :HistoryOrderGetTicket

 
Vitaly Muzichenko:

Merci !

J'avais besoin de ceci :HistoryOrderGetTicket

L'ordre peut être de 1,0 lot. Mais il peut être partiellement exécuté, par exemple, le lot 0.9 - le reste sera rejeté (dépend du mode d'exécution). La transaction sera alors le lot 0.9. Et lorsque vous commencerez à rechercher des lots sur l'ordre, il y aura des incohérences.

 

Aidez-moi s'il vous plaît - j'ai besoin d'un code sain pour obtenir la valeur de l'environnement OHLC - les codes existants sont très lents.

Option 1

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
//   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   int copied=CopyClose(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }


Option 2

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }
 
Aleksey Vyazmikin:

Aidez-moi s'il vous plaît - j'ai besoin d'un code sain pour obtenir la valeur de l'environnement OHLC - les codes existants sont très lents.

Option 1


Option 2

Postez un extrait de code pour montrer comment vous l'appliquez.
 
Vitaly Muzichenko:
Postez un morceau de code pour expliquer comment vous les appliquez

Je ne sais pas quel morceau ralentit - je les applique de différentes manières, y compris en boucle...


voici un exemple


            for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               if((Low(X)>PricePeresek && High(X)>PricePeresek) || 
                  (Low(X)<PricePeresek && High(X)<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
 
Aleksey Vyazmikin:

Je ne sais pas quel morceau ralentit - je l'applique de différentes manières, y compris en boucle...

Cela semble être le cas dans les boucles, et vous pouvez vous passer de la fonction

            double LOW[1],HIGH[1];
             for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               CopyLow(Symbol(),PERIOD_CURRENT,X,1,LOW);
               CopyHigh(Symbol(),PERIOD_CURRENT,X,1,HIGH);
               if((LOW[0]>PricePeresek && HIGH[0]>PricePeresek) || 
                  (LOW[0]<PricePeresek && HIGH[0]<PricePeresek))
                  calcBarPeresek++;
               else break;
              }