Hatalar, hatalar, sorular - sayfa 804

 

ilunga :

PS (ve sizin) kodumda bar_info[1] geçerli çubuğun maksimumu olduğunu doğru anlıyor muyum?

Ve kimse şu anki hakkında konuşmadı. :)

Sadece örneğinizi değiştirdim. mevcut olana ihtiyacınız varsa, şunlara ihtiyacınız vardır:

1. Dizi serisinin yönünü belirleyin (0 bar - mevcut veya ilk).

Eğer bizde olduğu gibi dizi çıkarılırsa, bunu başlatma bloğunda bir kez yapabilirsiniz. Diziyi bir fonksiyonda saklarsak, onu yerinde tanımlarız.

2. Dizi bir dizi olarak bildirilirse, mevcut çubuk sıfır olur ve daha önce kapatılan çubuk 1 olur.

En azından hatırladığım kadarıyla.

 

Belki bir şeyi kaçırdım, ancak mevcut çubuğu açmak için (tüm eklemeleri dikkate alarak) bunu yapmanız gerekiyor.

Dizi bir işleve taşındı!

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

Ve kimse şu anki hakkında konuşmadı. :)

Sadece örneğinizi değiştirdim. mevcut olana ihtiyacınız varsa, o zaman şunlara ihtiyacınız vardır:

1. Dizi serisinin yönünü belirleyin (0 bar - mevcut veya ilk).

Eğer bizde olduğu gibi dizi çıkarılırsa, bunu başlatma bloğunda bir kez yapabilirsiniz. Diziyi bir fonksiyonda saklarsak, onu yerinde tanımlarız.

2. Dizi bir dizi olarak bildirilirse, mevcut çubuk sıfır olur ve daha önce kapatılan çubuk 1 olur.

En azından hatırladığım kadarıyla.

Diziyi 3 öğeye genişletti. Mevcut fiyat ile içindekiler arasında bir tutarsızlık aldım. Büyük ihtimalle nedeni bu

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

Sonuçlar (GBPUSD üzerinde test edilmiştir):

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   

Hem Ask hem de Bid'in sıfırın maksimumundan ve ikinci çubuğun maksimumundan büyük olduğunu anlıyoruz


Test EURUSD üzerinde yapılırsa, her şey yolunda demektir:

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   


Görünüşe göre "benim değil" çiftim testi sırasında, "çubuklarla ilgili bilgiler güncellendi, ancak henüz onay yok" durumu ortaya çıktı.

 
ilunga :

Diziyi 3 öğeye genişletti. Mevcut fiyat ile içindekiler arasında bir tutarsızlık aldım. Büyük ihtimalle nedeni bu

Sonuçlar:

Hem Ask hem de Bid'in sıfırın maksimumundan ve ikinci çubuğun maksimumundan büyük olduğunu anlıyoruz

Kodunuzdaki dizilerin seriliğini hesaba katmazsınız. Böyle bir sonuçla, diyelim ki 2000 yılında 0 bar çıkmayacağını kimse garanti edemez.

Yukarıdaki kodu verdim, dizi seçeneği olan tüm TF'ler için uygundur.

Orada verilen bu kod boşuna değil

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

Çubuğun yüksekliğini belirlemek için yalnızca günlük TF'ye (D1) ihtiyacınız varsa ve diziyle hiç oynamanıza gerek yoksa, işlevin ilk bölümünü buna değiştirin.

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

Kodunuzdaki dizilerin seriliğini hesaba katmazsınız. Böyle bir sonuçla, diyelim ki 2000 yılında 0 bar çıkmayacağını kimse garanti edemez.

Yukarıdaki kodu verdim, dizi seçeneği olan tüm TF'ler için uygundur.

Orada verilen bu kod boşuna değil

ArraySetAsSeries sadece dinamik diziler için mi?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting :

Kodunuzdaki dizilerin seriliğini hesaba katmazsınız. Böyle bir sonuçla, diyelim ki 2000 yılında 0 bar çıkmayacağını kimse garanti edemez.

Yukarıdaki kodu verdim, dizi seçeneği olan tüm TF'ler için uygundur.

Orada verilen bu kod boşuna değil

Tamam, diziyi dinamik yapalım.

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

xxx yerine doğru ve yanlışı sıralarız.

Sonuçlar:

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   

ve

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   

Dizideki sıra değişti, sonuç değişmedi. Teklif, dizinin [0]. çubuğunun maksimum değerinden büyük

 
ilunga :
ArraySetAsSeries sadece dinamik diziler için mi?

Dürüst olduğumu hatırlamıyorum. Ama yukarıda verdiğim kodun sonucu şu şekilde elde ettiğimiz şeyle örtüşüyor (Yahudi açısından açılış fiyatı 1.24516 Pound için 1.56721'dir)

High = SymbolInfoDouble (symbol, SYMBOL_BIDHIGH );

Evet olmasına rağmen, ArraySetAsSeries olmadan bu durumda iyi çalışıyor

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

not

onlar. mevcut çubuğu almanız gerekiyorsa, bu satırdaki diziye üç çubuğu boşuna kopyalıyorsunuz

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

not

onlar. mevcut çubuğu almanız gerekiyorsa, bu satırdaki diziye üç çubuğu boşuna kopyalıyorsunuz

Teşekkür ederim! Bu seçenek hatasız gerçekleştirilir ve bu durumda tamamen yeterlidir.


Ancak, soru biraz daha yüksekte kaldı, Teklif nasıl maksimumdan daha büyük olabilir =(

 

ilunga :

Bununla birlikte, soru biraz daha yüksekte kaldı, Teklif nasıl maksimumdan daha büyük olabilir =(

Öncelikle bu maksimumun hangi süre için alındığını belirlemeniz gerekir.

Dizi double bar_info[n] olarak bildirilirse, içindeki mevcut çubuk en büyük dizin olacaktır.

n = 2 ile bu kod dünün günlük çubuğuyla çalışacaktır.

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

ve bu şimdikiyle

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

Onlar. sizin durumunuzda, birkaç çubuğu kopyalarken, mevcut çubuğu elde etmek için, bunun gibi bir şey düzenlemeniz gerekir (ancak diziye kopyalanan çubukların sayısı için ek kontrollere ihtiyacınız olabilir)

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

Öncelikle bu maksimumun hangi süre için alındığını belirlemeniz gerekir.

Dizi double bar_info[n] olarak bildirilirse, içindeki mevcut çubuk en büyük dizin olacaktır .

Yani önceki sayfada bir kod var, 3 elemanlı bir dizi var. Print ile yazdırırken, Bid = 1.29709 alırız ve 1.29220 bar_info[n-1] içinde saklanır