오류, 버그, 질문 - 페이지 804

[삭제]  

ilunga :

추신: 내(및 귀하의) 코드에서 bar_info[1]가 현재 막대의 최대값이라는 것을 올바르게 이해하고 있습니까?

그리고 아무도 현재에 대해 이야기하지 않았습니다. :)

나는 방금 당신의 예를 바꿨습니다. 현재 것이 필요하면 다음이 필요합니다.

1. 어레이 시리즈의 방향을 결정합니다(0 bar - 현재 또는 첫 번째 것).

배열이 제거되면 초기화 블록에서 한 번만 수행할 수 있습니다. 함수에서 배열을 숨기면 제자리에 정의합니다.

2. 배열이 시리즈로 선언되면 현재 막대는 0이 되고 이전에 닫은 막대는 1이 됩니다.

적어도 내가 기억하는 한.

[삭제]  

내가 뭔가를 놓쳤을 수도 있지만 현재 표시줄에서 열려면(모든 추가 사항을 고려하여) 이 작업을 수행해야 합니다.

배열이 함수로 이동되었습니다!

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

그리고 아무도 현재에 대해 이야기하지 않았습니다. :)

나는 방금 당신의 예를 바꿨습니다. 현재 것이 필요하면 다음이 필요합니다.

1. 어레이 시리즈의 방향을 결정합니다(0 bar - 현재 또는 첫 번째 것).

배열이 제거되면 초기화 블록에서 한 번만 수행할 수 있습니다. 함수에서 배열을 숨기면 제자리에 정의합니다.

2. 배열이 시리즈로 선언되면 현재 막대는 0이 되고 이전에 닫은 막대는 1이 됩니다.

적어도 내가 기억하는 한.

배열을 3개의 요소로 확장했습니다. 현재 가격 과 포함된 가격이 일치하지 않습니다. 아마도 이것이 이유일 것입니다.

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

결과(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   

Ask와 Bid 모두 0의 최대값보다 크고 두 번째 막대의 최대값보다 큽니다.


테스트가 EURUSD에서 실행되면 모든 것이 정상입니다.

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   


"not on my"페어 테스트 중에 "바 정보가 업데이트되었지만 아직 틱이 없습니다"라는 상황이 밝혀진 것 같습니다.

[삭제]  
ilunga :

배열을 3개의 요소로 확장했습니다. 현재 가격 과 포함된 가격이 일치하지 않습니다. 아마도 이것이 이유일 것입니다.

결과:

Ask와 Bid 모두 0의 최대값보다 크고 두 번째 막대의 최대값보다 큽니다.

코드에서 배열의 직렬성을 고려하지 않습니다. 아무도 2000년에 0바가 나오지 않을 것이라는 사실을 보증할 수 없습니다.

위의 코드를 제공했는데 어레이 옵션이 있는 모든 TF에 적합합니다.

거기, 이 코드는 헛되지 않습니다.

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

막대의 고점을 결정하기 위해 일일 TF (D1) 만 필요하고 배열을 전혀 엉망으로 만들 필요가 없다면 함수의 첫 번째 부분을 다음으로 변경하십시오.

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

코드에서 배열의 직렬성을 고려하지 않습니다. 아무도 2000년에 0바가 나오지 않을 것이라는 사실을 보증할 수 없습니다.

위의 코드를 제공했는데 어레이 옵션이 있는 모든 TF에 적합합니다.

거기, 이 코드는 헛되지 않습니다.

ArraySetAsSeries는 다음과 같은 동적 배열 에만 해당합니까?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting :

코드에서 배열의 직렬성을 고려하지 않습니다. 아무도 2000년에 0바가 나오지 않을 것이라는 사실을 보증할 수 없습니다.

위의 코드를 제공했는데 어레이 옵션이 있는 모든 TF에 적합합니다.

거기, 이 코드는 헛되지 않습니다.

좋아, 배열을 동적으로 만들자.

 #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 대신 true와 false를 차례로 입력합니다.

결과:

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   

배열의 순서는 변경되었지만 결과는 변경되지 않았습니다. 입찰가가 배열의 [0]번째 막대의 최대값보다 큽니다.

[삭제]  
ilunga :
ArraySetAsSeries는 다음과 같은 동적 배열 에만 해당합니까?

솔직히 기억이 안나네요. 하지만 위에서 제가 준 코드의 결과는 우리가 얻은 것과 일치합니다.

High = SymbolInfoDouble (symbol, SYMBOL_BIDHIGH );

예, ArraySetAsSeries 없이는 이 상황에서 잘 작동합니다.

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

추신

저것들. 현재 막대를 가져와야 하는 경우 이 행의 배열에 3개의 막대를 복사하는 것은 헛된 일입니다.

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

추신

저것들. 현재 막대를 가져와야 하는 경우 이 행의 배열에 3개의 막대를 복사하는 것은 헛된 일입니다.

고맙습니다! 이 옵션은 오류 없이 실행되며 이 경우에는 충분합니다.


그러나 질문은 조금 더 높게 매달려 있었습니다. 어떻게 입찰가가 최대값보다 클 수 있습니까 =(

[삭제]  

ilunga :

그러나 질문은 조금 더 높게 매달려 있었습니다. 어떻게 입찰가가 최대값보다 클 수 있습니까 =(

먼저 이 최대값이 사용되는 기간을 결정해야 합니다.

배열이 double bar_info[n]으로 선언되면 현재 막대가 가장 큰 인덱스가 됩니다.

n = 2인 경우 이 코드는 어제의 일일 막대와 함께 작동합니다.

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

그리고 이것은 현재 것과

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

저것들. 귀하의 경우 여러 막대를 복사 할 때 현재 막대를 얻으려면 이와 같이 정렬해야합니다 (배열에 복사 된 막대 수에 대한 추가 확인이 필요할 수 있음)

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

먼저 이 최대값이 사용되는 기간을 결정해야 합니다.

배열이 double bar_info[n]으로 선언되면 현재 막대가 가장 큰 인덱스가 됩니다.

따라서 이전 페이지에는 code 가 있고 3개의 요소로 구성된 배열이 있습니다. Print로 인쇄할 때 Bid = 1.29709이고 1.29220이 bar_info[n-1]에 저장됩니다.