Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 762

 
Alexey Kozitsyn:
E non sono le posizioni o gli affari che devono essere controllati, ma gli ordini, perché un ordine viene prima, poi un affare, poi una posizione.

Perché solo ordini? Un accordo non ha un ID di posizione (biglietto)?

 
Alexey Viktorov:

Perché solo ordini? Un accordo non ha un ID di posizione (biglietto)?

Sì, hai ragione. Sia gli ordini che le offerte hanno un identificatore di posizione. Tuttavia, nel caso generale dovremmo sapere che alla posizione viene assegnato un identificatore del primo ordine che ha iniziato l'affare. Di conseguenza, l'"entità" che avvia la posizione è l'ordine, e non l'affare. E sono gli ordini, non gli accordi, che vanno cercati.

Dalla documentazione:

L'identificatore di posizione è un numero unico che viene assegnato ad ogni posizione appena aperta e non cambia per tutta la sua durata. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.

L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.

 
Alexey Kozitsyn:

Sì, hai ragione. Sia gli ordini che le compravendite hanno un identificatore di posizione. Tuttavia, in generale, dovete sapere che alla posizione viene assegnato l'identificatore del primo ordine che ha iniziato il trade. Di conseguenza, l'"entità" che avvia la posizione è l'ordine, e non l'affare. E sono gli ordini, non gli accordi, che vanno cercati.

Dalla documentazione:

Non voglio discutere, è esattamente quello che dice la documentazione. Ma altrove nella stessa documentazione dice"Come regola..." il che significa che ci possono essere incongruenze. E questo è il "come regola" che ho incontrato una volta...

posizione

Il biglietto di posizione. Deve essere compilato quando una posizione viene cambiata e chiusa, per la sua identificazione unica. Di regola, corrisponde al biglietto dell'ordine, a seguito del quale la posizione è stata aperta.

Non mi ricordo, ed è improbabile che l'abbia capito, letto, corretto e dimenticato. L'ho letto, corretto e dimenticato.
 
Vitaly Muzichenko:
Per favore consigliate come recuperare il biglietto che è stato usato per lo scambio. Nello screenshot è "63214735".

Quisi cerca il numero della Posizione, nella lista delle Offerte, altrimenti è sbagliato.

Ecco uno script che dimostra cosa dà HistorySelectByPosition

//--- 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--;
    }
  }
}

E questo è come appare il risultato:

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

0 = Posizione aperta

1 = Posizione di chiusura

Se non lo ottieni = non hai inserito una posizione del biglietto

Lo stesso risultato può essere ottenuto se iniziamo con il Deal Ticket:

Per la funzione HistoryDealGetInteger()

ENUM_DEAL_PROPERTY_INTEGER

Identificatore

Descrizione

Tipo

DEAL_TICKET

Biglietto d'accordo. Numero unico da assegnare a ogni scambio

lungo

ORDINE D'ACQUISTO

Ordine, in base al quale è stato eseguito il trade

lungo

ORA_TEMPO

Tempo di esecuzione dell'affare

datetime

DEAL_TIME_MSC

Tempo di esecuzione dell'affare in millisecondi dal 01.01.1970

lungo

DEAL_TYPE

Tipo di affare

ENUM_DEAL_TYPE

DEAL_ENTRY

Direzione dell'affare - entrata nel mercato, uscita dal mercato o inversione

ENUM_DEAL_ENTRY

DEAL_MAGIC

Numero magico per l'affare (vedere ORDER_MAGIC)

lungo

MOTIVAZIONE DELL'AFFARE

Motivo o fonte dell'affare

ENUM_DEAL_REASON

POSIZIONE_AFFARE_ID

L'identificatore dellaposizione nella cui apertura, modifica o chiusura era coinvolta questa operazione. Ogni posizione ha un identificatore unico, che viene assegnato a tutte le operazioni effettuate sullo strumento durante il periodo di vita della posizione.

lungo

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

Grazie!

Avevo bisogno di questo:HistoryOrderGetTicket

 
Vitaly Muzichenko:

Grazie!

Avevo bisogno di questo:HistoryOrderGetTicket

L'ordine può essere 1,0 lotto. Ma può essere eseguito parzialmente, per esempio, il lotto 0,9 - il resto sarà rifiutato (dipende dalla modalità di esecuzione). Allora il trade sarà il lotto 0,9. E quando si inizia a cercare i lotti sull'ordine, ci saranno delle incongruenze.

 

Per favore aiutatemi - ho bisogno di un codice sano per ottenere il valore dell'ambiente OHLC - quelli esistenti sono molto lenti

Opzione 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);
  }


Opzione 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:

Per favore aiutatemi - ho bisogno di un codice sano per ottenere il valore dell'ambiente OHLC - quelli esistenti sono molto lenti

Opzione 1


Opzione 2

Pubblica un frammento di codice per mostrare come lo applichi.
 
Vitaly Muzichenko:
Pubblica un pezzo di codice su come li applichi

Non so quale pezzo stia rallentando - li applico in modi diversi, anche in loop...


Ecco un esempio


            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:

Non so quale pezzo stia rallentando - lo applico in diversi modi, anche nei loop...

Sembra così nei loop, e si può fare a meno della funzione

            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;
              }
Motivazione: