Errores, fallos, preguntas - página 804

 

ilunga:

P.D. ¿Estoy en lo cierto al suponer que en mi código (y en el tuyo) bar_info[1] es el máximo de la barra actual?

Nadie ha dicho nada sobre el bar actual. :)

Acabo de rehacer tu ejemplo. Si quieres exactamente la barra actual, tienes que hacerlo:

1. definir la dirección de las series de la matriz (0 bar - actual o más alto).

Si, como en nuestro caso, el array se desplaza fuera, puedes hacerlo una vez en el bloque de inicialización. Si ocultamos la matriz en una función, la definimos en su lugar.

2. Si la matriz se declara como una serie, la barra actual será cero, y la que se cerró antes será 1.

Al menos, según recuerdo.

 

Puede que me haya perdido algo, pero para que se abra en la barra actual (teniendo en cuenta todos los añadidos) debería ser así.

¡Mueve la matriz a la función!

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

Y nadie ha dicho nada sobre el actual. :)

Acabo de rehacer tu ejemplo. Si necesitas el actual, tienes que hacerlo:

1. Definir la dirección de la serie de array (0 bar - actual o el último).

Si, como en nuestro caso, el array se desplaza fuera, puedes hacerlo una vez en el bloque de inicialización. Si ocultamos la matriz en una función, la definimos en su lugar.

2. Si la matriz se declara como una serie, la barra actual será cero, y la barra cerrada antes será 1.

Al menos como yo lo recuerdo.

He ampliado el array a 3 elementos. Tengo un desajuste entre el precio actual y lo que hay. Esta es la razón más probable.

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

Resultados (las pruebas se realizaron con el 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  

Obtenemos que tanto el Ask como el Bid son mayores que el máximo de cero y mayores que el máximo de la segunda barra


Si ejecutamos la prueba en el EURUSD, todo está bien:

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  


Tengo la sensación de que al probar "no mi" par la situación "la información en las barras se ha actualizado, pero la garrapata está ausente todavía".

 
ilunga:

He ampliado el array a 3 elementos. Obtengo inconsistencia entre el precio actual y el contenido del array. Esa es la razón más probable.

Resultados:

Obtenemos que tanto el Ask como el Bid son mayores que el máximo de la barra cero y mayores que el máximo de la segunda barra

No consideras la serialidad de los arrays, en tu código. Nadie puede garantizar que con este resultado el listón 0 no esté en, digamos, el año 2000.

He dado el código de arriba es adecuado para todos los TFs en la variante de la matriz.

Este código está ahí por una razón.

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

Si sólo necesita un marco de tiempo diario (D1 ) para identificar el máximo de la barra no necesita tratar con la matriz en absoluto, sólo cambiar la primera parte de la función a esta

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

No consideras la serialidad de los arrays en tu código. Nadie puede garantizar que en este resultado la barra 0 no esté en, digamos, el año 2000.

He dado el código de arriba es adecuado para todos los TFs en la variante de la matriz.

Este código está ahí por una razón

¿ArraySetAsSeries sólo para matrices dinámicas?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting:

No consideras la serialidad de los arrays en tu código. Nadie puede garantizar que en este resultado la barra 0 no esté en digamos 2000.

He dado el código de arriba es adecuado para todos los TFs en la variante de la matriz.

Este código está ahí por una razón.

Bien, haz que el array sea dinámico.

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

En lugar de xxx ponemos verdadero y falso.

Los resultados:

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  

El orden en la matriz se cambia, el resultado no. La oferta es mayor que la barra máxima [0] de la matriz

 
ilunga:
¿ArraySetAsSeries sólo para matrices dinámicas?

Para ser sincero, no lo recuerdo. Pero el resultado de ese código, que he citado anteriormente coincide con lo que obtenemos (para el euro el precio de apertura es 1,24516 para la libra 1,56721)

High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);

Aunque sí, funciona bien sin ArraySetAsSeries en este 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

Es decir, si se quiere obtener la barra actual, se copian innecesariamente tres barras en el array de esta línea.

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

Por ejemplo, si necesitas obtener la barra actual, en vano copias tres barras en esta línea al array

Gracias. Esta opción funciona sin errores y es totalmente suficiente en este caso.


Sin embargo, la pregunta que queda en el aire es cómo la Oferta puede ser mayor que el máximo =(

 

ilunga:

Sin embargo, la pregunta que queda en el aire es cómo la Oferta puede ser mayor que el máximo =(

En primer lugar, hay que determinar para qué periodo se toma este máximo.

Si la matriz se declara como double bar_info[n] entonces la barra actual en ella será el índice mayor.

si n = 2 este código funcionará con la barra diaria de ayer

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

y esta otra con la barra actual

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

Es decir, si se copian varias barras, se debe disponer algo así para obtener la barra actual (aunque puede ser necesario realizar comprobaciones adicionales de cuántas barras se han copiado en el array)

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

Lo primero que hay que hacer es definir para qué periodo se toma este máximo.

Si la matriz se declara como double bar_info[n] entonces la barra actual en ella será el índice mayor.

Así, hay un código en la página anterior donde hay un array de 3 elementos. Al imprimirlo con Prints, obtenemos que Bid = 1,29709, mientras que bar_info[n-1] almacena 1,29220