오류, 버그, 질문 - 페이지 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]에 저장됩니다.