Fehler, Irrtümer, Fragen - Seite 804

 

ilunga:

P.S. Gehe ich recht in der Annahme, dass in meinem (und Ihrem) Code bar_info[1] das Maximum des aktuellen Balkens ist?

Niemand hat etwas über die aktuelle Bar gesagt. :)

Ich habe gerade Ihr Beispiel nachgearbeitet. Wenn Sie genau den aktuellen Balken wollen, müssen Sie das tun:

1. Definieren Sie die Richtung der Reihe des Arrays (0 bar - aktuell oder am höchsten).

Wenn, wie in unserem Fall, das Array ausgelagert wird, können Sie dies einmal im Initialisierungsblock tun. Wenn wir das Array in einer Funktion ausblenden, definieren wir es an Ort und Stelle.

2. wenn das Array als Serie deklariert ist, ist der aktuelle Balken Null und der davor geschlossene Balken ist 1.

Zumindest soweit ich mich erinnere.

 

Vielleicht habe ich etwas übersehen, aber um auf der aktuellen Leiste zu öffnen (unter Berücksichtigung aller Ergänzungen) sollte es so aussehen.

Verschieben Sie das Array in die Funktion!

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

Und niemand hat etwas über die aktuelle Version gesagt. :)

Ich habe gerade Ihr Beispiel überarbeitet. Wenn Sie ein aktuelles brauchen, müssen Sie das tun:

1. die Richtung der Array-Reihe festlegen (0 bar - aktuell oder die letzte).

Wenn, wie in unserem Fall, das Array ausgelagert wird, können Sie dies einmal im Initialisierungsblock tun. Wenn wir das Array in einer Funktion ausblenden, definieren wir es an Ort und Stelle.

2. wenn das Array als Serie deklariert ist, ist der aktuelle Balken Null und der davor geschlossene Balken ist 1.

Zumindest soweit ich mich erinnere.

Ich habe das Array auf 3 Elemente erweitert. Ich habe eine Diskrepanz zwischen dem aktuellen Preis und dem, was drin ist. Dies ist höchstwahrscheinlich der Grund.

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

Ergebnisse (der Test wurde mit GBPUSD durchgeführt):

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  

Wir erhalten, dass sowohl Ask als auch Bid größer als das Maximum von Null und größer als das Maximum des zweiten Balkens sind


Wenn wir den Test für EURUSD durchführen, ist alles in Ordnung:

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  


Ich habe das Gefühl, dass beim Testen "nicht mein" Paar die Situation "Informationen über Balken wurde aktualisiert, aber das Häkchen ist noch nicht vorhanden".

 
ilunga:

Ich habe das Array auf 3 Elemente erweitert. Ich erhalte eine Inkonsistenz zwischen dem aktuellen Preis und dem Inhalt des Arrays. Das ist höchstwahrscheinlich der Grund dafür.

Ergebnisse:

Wir erhalten, dass Ask und Bid beide größer sind als das Maximum des ersten Balkens und größer als das Maximum des zweiten Balkens

Sie berücksichtigen die Serialität von Arrays in Ihrem Code nicht. Niemand kann garantieren, dass bei diesem Ergebnis nicht etwa im Jahr 2000 0 bar sein wird.

Ich gab den Code oben ist es für alle TFs in der Array-Variante geeignet.

Dieser Code hat seinen Grund.

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

Wenn Sie nur einen täglichen Zeitrahmen (D1) benötigen, um das Maximum des Balkens zu identifizieren, brauchen Sie sich nicht mit dem Array zu befassen, sondern können den ersten Teil der Funktion wie folgt ändern

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

Sie berücksichtigen die Serialität von Arrays in Ihrem Code nicht. Niemand kann garantieren, dass bei diesem Ergebnis nicht etwa im Jahr 2000 0 bar sein werden.

Ich gab den Code oben ist es für alle TFs in der Array-Variante geeignet.

Dieser Code ist aus einem bestimmten Grund vorhanden

ArraySetAsSeries nur für dynamische Arrays?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting:

Sie berücksichtigen die Serialität von Arrays in Ihrem Code nicht. Niemand kann garantieren, dass bei diesem Ergebnis 0 bar nicht etwa im Jahr 2000 sein wird.

Ich gab den Code oben ist es für alle TFs in der Array-Variante geeignet.

Dieser Code hat seinen Grund.

Ok, machen Sie das Array dynamisch.

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

Anstelle von xxx setzen wir true und false.

Die Ergebnisse:

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  

Die Reihenfolge im Array wird geändert, das Ergebnis nicht. Das Gebot ist größer als der maximale [0]-te Balken des Arrays

 
ilunga:
ArraySetAsSeries nur für dynamische Arrays?

Ich kann mich nicht erinnern, um ehrlich zu sein. Aber das Ergebnis dieses Codes, das ich oben zitiert habe, stimmt mit dem überein, was wir erhalten (für EUR ist der Eröffnungskurs 1,24516 für GBP 1,56721)

High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);

Obwohl ja, es funktioniert gut ohne ArraySetAsSeries an dieser Stelle

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

Das heißt, wenn Sie den aktuellen Balken abfragen wollen, müssen Sie unnötigerweise drei Balken in das Array in dieser Zeile kopieren.

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

D.h., wenn Sie den aktuellen Balken benötigen, kopieren Sie völlig vergeblich drei Balken in dieser Zeile in das Array

Ich danke Ihnen! Diese Option funktioniert ohne Fehler und ist in diesem Fall völlig ausreichend.


Die Frage, die oben offen gelassen wurde, ist jedoch, wie das Gebot größer als das Maximum sein kann =(

 

ilunga:

Es bleibt jedoch die Frage offen, wie das Gebot größer sein kann als der Höchstbetrag =(

Zunächst müssen wir feststellen, für welchen Zeitraum dieser Höchstwert gilt.

Wenn das Array als double bar_info[n] deklariert ist, ist der aktuelle Balken darin der größte Index.

Wenn n = 2 ist, funktioniert dieser Code mit dem Tagesbalken von gestern.

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

und diese hier mit dem aktuellen Balken

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

D.h., wenn Sie mehrere Balken kopieren, sollten Sie so vorgehen, um den aktuellen Balken zu erhalten (obwohl Sie möglicherweise zusätzlich überprüfen müssen, wie viele Balken in das Array kopiert wurden)

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

Als Erstes muss festgelegt werden, für welchen Zeitraum dieser Höchstwert gilt.

Wenn das Array als double bar_info[n] deklariert ist, dann ist der aktuelle Takt darin der größte Index.

So gibt es auf der vorherigen Seite einen Code, der ein Array mit 3 Elementen enthält. Bei der Ausgabe mit Prints erhalten wir Bid = 1,29709, während bar_info[n-1] 1,29220 speichert.
Grund der Beschwerde: