Errori, bug, domande - pagina 804

 

ilunga:

P.S. Ho ragione di supporre che nel mio (e nel tuo) codice bar_info[1] sia il massimo della barra corrente?

Nessuno ha parlato del bar attuale. :)

Ho appena rifatto il tuo esempio: se vuoi esattamente la barra attuale, devi farlo:

1. definire la direzione delle serie della matrice (0 bar - corrente o più alta).

Se, come nel nostro caso, l'array viene spostato fuori, potete farlo una volta nel blocco di inizializzazione. Se nascondiamo l'array in una funzione, lo definiamo sul posto.

2. Se l'array è dichiarato come una serie, la barra corrente sarà zero, e quella chiusa prima sarà 1.

Almeno per quanto mi ricordo.

 

Forse mi sono perso qualcosa, ma per aprire sulla barra attuale (tenendo conto di tutte le aggiunte) dovrebbe essere così.

Spostate l'array nella funzione!

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

E nessuno ha detto niente di quello attuale. :)

Ho appena rielaborato il tuo esempio, se hai bisogno di quello attuale, devi farlo:

1. Definire la direzione delle serie di matrici (0 bar - corrente o l'ultima).

Se, come nel nostro caso, l'array viene spostato fuori, potete farlo una volta nel blocco di inizializzazione. Se nascondiamo l'array in una funzione, lo definiamo sul posto.

2. Se l'array è dichiarato come una serie, la barra corrente sarà zero, e la barra chiusa prima sarà 1.

Almeno per come lo ricordo io.

Ho espanso l'array a 3 elementi. Ho una discrepanza tra il prezzo attuale e quello che c'è dentro. Questo è molto probabilmente il motivo.

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

Risultati (il test è stato fatto su 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  

Otteniamo che sia Ask che Bid sono maggiori del massimo di zero e maggiori del massimo della seconda barra


Se eseguiamo il test su EURUSD, tutto è 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  


Ho la sensazione che quando si prova la coppia "non mia" la situazione "le informazioni sulle barre sono state aggiornate, ma il tick è ancora assente".

 
ilunga:

Ho espanso l'array a 3 elementi. Ottengo un'incoerenza tra il prezzo corrente e il contenuto dell'array. Questo è molto probabilmente il motivo.

Risultati:

Otteniamo che Ask e Bid sono entrambi maggiori del massimo della barra zero e maggiori del massimo della seconda barra

Non consideri la serialità degli array nel tuo codice. Nessuno può garantire che con questo risultato 0 bar non sarà, diciamo, nell'anno 2000.

Ho dato il codice qui sopra che è adatto a tutti i TF nella variante dell'array.

Questo codice è lì per una ragione.

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

Se avete bisogno solo di un timeframe giornaliero (D1) per identificare il massimo della barra non avete bisogno di trattare con l'array, basta cambiare la prima parte della funzione con questa

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

Non consideri la serialità degli array nel tuo codice. Nessuno può garantire che a questo risultato 0 bar non sarà in diciamo 2000.

Ho dato il codice qui sopra che è adatto a tutti i TF nella variante dell'array.

Questo codice è lì per una ragione

ArraySetAsSeries solo per gli array dinamici?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting:

Non consideri la serialità degli array nel tuo codice. Nessuno può garantire che a questo risultato 0 bar non sarà nell'anno 2000.

Ho dato il codice qui sopra che è adatto a tutti i TF nella variante dell'array.

Questo codice è lì per una ragione.

Ok, rendere l'array dinamico.

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

Invece di xxx mettiamo vero e falso.

I risultati:

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'ordine nell'array è cambiato, il risultato no. L'offerta è maggiore della massima [0]-esima barra dell'array

 
ilunga:
ArraySetAsSeries solo per gli array dinamici?

Non ricordo, ad essere onesti. Ma il risultato di quel codice, che ho citato sopra coincide con quello che otteniamo (per EUR il prezzo di apertura è 1,24516 per GBP 1,56721)

High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);

Anche se sì, funziona bene senza ArraySetAsSeries a questo punto

//+------------------------------------------------------------------+
//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

Cioè, se volete ottenere la barra corrente, copiate inutilmente tre barre nell'array su questa linea.

//Это не правильно
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

Cioè, se avete bisogno di ottenere la barra corrente, copiate assolutamente invano tre barre in questa linea nell'array

Grazie! Questa opzione funziona senza errori ed è pienamente sufficiente in questo caso.


Tuttavia, la domanda lasciata in sospeso poco sopra è come il Bid può essere maggiore del massimo =(

 

ilunga:

Tuttavia, la domanda lasciata in sospeso sopra è come il Bid può essere maggiore del massimo =(

Prima di tutto, dobbiamo determinare per quale periodo si prende questo massimo.

Se l'array è dichiarato come double bar_info[n] allora la barra corrente in esso sarà l'indice più grande.

se n = 2 questo codice funzionerà con la barra giornaliera di ieri

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

e questo con la barra corrente

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

Cioè, se copiate diverse barre, dovreste organizzare qualcosa del genere per ottenere la barra corrente (anche se potreste aver bisogno di ulteriori controlli su quante barre sono state copiate nell'array)

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

La prima cosa da fare è definire il periodo in cui questo massimo viene preso.

Se l'array è dichiarato come double bar_info[n] allora la barra corrente in esso sarà l'indice più grande.

Così, c'è un codice nella pagina precedente dove c'è un array di 3 elementi. Quando lo si visualizza con Prints, si ottiene che Bid = 1,29709, mentre bar_info[n-1] memorizza 1,29220
Motivazione: