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

 

모두에게 경례!

그런 문제.

밴드 및 MA 지표의 값을 성공적으로 얻었습니다.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s, PRICE_CLOSE );
CopyBuffer(밴드_핸들,0,0,1,베이스);
CopyBuffer(Bands_handle,1,0,1,Upper);
CopyBuffer(Bands_handle,2,0,1,낮음);
B_med_s=베이스[0];
B_up_s=상단[0];
B_low_s=하위[0];

MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
CopyBuffer(MA_handle,0,0,1,MAv);
M_av_s=MAv[0];

다음으로 인쇄합니다. B_up_s=1.264249475876921 M_av_s=1.2595

다음으로 나는 체크메이트를 시도한다. B_up_s-M_av_s 작업을 수행하고 결과적으로 0.00000000을 얻습니다.

무슨 기적???

 
Alvin1976 :

모두에게 경례!

그런 문제.

밴드 및 MA 지표의 값을 성공적으로 얻었습니다.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s, PRICE_CLOSE );
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];  

다음으로 인쇄합니다. B_up_s=1.264249475876921 M_av_s=1.2595

다음으로 나는 체크메이트를 시도한다. B_up_s-M_av_s 작업을 수행하고 결과적으로 0.00000000을 얻습니다.

무슨 기적???

1) 코드를 삽입하는 방법 .

2) 연산 결과를 어떤 변수 저장합니까? 그리고 출력이 생성되는 코드의 일부를 제공하는 것이 좋습니다.

 
MigVRN :

1) 코드를 삽입하는 방법 .

2) 연산 결과를 어떤 변수 저장합니까? 그리고 출력이 생성되는 코드의 일부를 제공하는 것이 좋습니다.

double 유형의 모든 변수.

Bands에는 많은 부호가 있고 MA에는 소수점 뒤에 4만 있는 이유가 명확하지 않습니다. 그리고 결과는 전혀 0이 아니어야 합니다. 이 때문에 알고리즘이 작동하지 않습니다.

MQL4의 모든 것이 얼마나 단순했는지. 이제 최적화 속도와 다중 통화 확인이 필요합니다. 그것을 얻으려면 모든 것을 MQL5로 전송해야합니다))

 double q=B_up_s-M_av_s;
 Print( B_up_s-M_av_s=", DoubleToString(q));
 
Alvin1976 :

double 유형의 모든 변수.

Bands에는 많은 부호가 있고 MA에는 소수점 뒤에 4만 있는 이유가 명확하지 않습니다. 그리고 결과는 전혀 0이 아니어야 합니다. 이 때문에 알고리즘이 작동하지 않습니다.

MQL4의 모든 것이 얼마나 단순했는지. 이제 최적화 속도와 다중 통화 확인이 필요합니다. 그것을 얻으려면 모든 것을 MQL5로 전송해야합니다))

작동해야 합니다. 다음은 코드와 그 결과에 따른 스크립트입니다.

 void OnStart ()
  {
  
   double Base[ 1 ];
   double Upper[ 1 ];
   double Lower[ 1 ];  
  
   int BP_var_s = 20 ;
   int BDev_var_s = 30 ;
   int MA_var_b = 10 ;
  
   double M_av_s = 0 ;
   double MAv[ 1 ];
  
   double B_med_s, B_up_s, B_low_s;
  
  
   //---Далее Ваш код
   int Bands_handle= iBands ( NULL , 0 ,BP_var_s, 0 ,BDev_var_s, PRICE_CLOSE );
   CopyBuffer (Bands_handle, 0 , 0 , 1 ,Base);
   CopyBuffer (Bands_handle, 1 , 0 , 1 ,Upper);
   CopyBuffer (Bands_handle, 2 , 0 , 1 ,Lower);
   
   B_med_s=Base[ 0 ];
   B_up_s=Upper[ 0 ];
   B_low_s=Lower[ 0 ];
   
   int MA_handle= iMA ( NULL , 0 ,MA_var_b, 0 , MODE_SMA , PRICE_TYPICAL );
   
   CopyBuffer (MA_handle, 0 , 0 , 1 ,MAv);
   M_av_s=MAv[ 0 ]; 
   
     double q = B_up_s - M_av_s;
    
     Print ( "B_up_s-M_av_s=" , DoubleToString (q));
   
  }

 
Alvin1976 :

double 유형의 모든 변수.

Bands에는 많은 부호가 있고 MA에는 소수점 뒤에 4만 있는 이유가 명확하지 않습니다. 그리고 결과는 전혀 0이 아니어야 합니다. 이 때문에 알고리즘이 작동하지 않습니다.

MQL4의 모든 것이 얼마나 단순했는지. 이제 최적화 속도와 다중 통화 확인이 필요합니다. 그것을 얻으려면 모든 것을 MQL5로 전송해야합니다))

"빼기" 작업 전에 변수 값을 인쇄 하여 버퍼에 무엇이 있는지 확인합니다.
 Print ( "B_up_s= " ,B_up_s, "; M_av_s=" ,M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN :

작동해야 합니다. 다음은 코드와 그 결과에 따른 스크립트입니다.

예 스크립트가 작동합니다.

Expert Advisor도 이 예에서 작동합니다.

그러나 나의 고문은 완고하게 0을 준다. 오류를 찾아보자...

 

안녕하세요!

문제는 1분 이내에 각 틱마다 업데이트되는 변수 값을 합산하는 방법이며, 다음 분 종료 후 합계 값이 새로운 것?

정수 t = TimeSeconds();

동안 (t !=0)

double b는 매 틱마다 1분 이내에 업데이트되는 변수입니다.

double b1 - 이전 틱의 변수 b 값.

double s - 1분 이내에 모든 틱의 합계입니다.

double s1 - 지난 1분 동안의 모든 틱에 대한 합계입니다.

b1=b;

s=b1+b;

(t=0) s1=s인 경우;

각 틱에서 데이터를 요약하는 방법과 일반적으로 모든 것을 기록하는 방법은 무엇입니까?

 
Alvin1976 :

예 스크립트가 작동합니다.

Expert Advisor도 이 예에서 작동합니다.

그러나 나의 고문은 완고하게 0을 준다. 오류를 찾아보자...

다음은 발견된 내용입니다.

어드바이저를 실행하면 잘 작동하지만 테스터에서는 맨 처음에 0을 제공합니다. 그리고 이미 다음 줄이 실행될 때 0은 마법처럼 정상적인 지표 데이터가 됩니다. 뭔말인지 이해가 안감.....

아래는 코드입니다.

테스터가 말하는 내용은 다음과 같습니다.

CJ 0 19:40:47.022 코어 1 EURUSD,M15(Alpari-Ltd-Demo): OHLC 막대 상태 생성. 막대 시작에서만 실행되는 OnTick
IJ 0 19:40:47.022 핵심 1 EURUSD,M15: Experts\tmp.ex5 테스트 2004.01.07 00:00 ~ 2004.02.02 00:00 시작
LK 0 19:40:47.022 코어 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 코어 1 2004.01.07 00:00:00 sbl_top=true B_up_s=0.0 M_av_s=0.0 B_up_s-M_av_s=0.00000000
OQ 0 19:40:47.022 코어 1 2004.01.07 00:15:00 B_up_s=1.279208140152992 M_av_s=1.2718
OI 0 19:40:47.022 코어 1 2004.01.07 00:15:00 sel=true B_up_s=1.279208140152992 M_av_s=1.2718 B_up_s-M_av_s=0.140
CJ 0 19:40:47.022 코어 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 코어 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 코어 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 코어 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 코어 1 2004.01.07 01:30:00 B_up_s=1.279380702214008 M_av_s=1.2731
메신저 0 19:40:47.022 코어 1 2004.01.07 01:45:00 B_up_s=1.279440208228416 M_av_s=1.2723
LE 0 19:40:47.022 코어 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 코어 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 코어 1 2004.01.07 02:30:00 B_up_s=1.279601656250741 M_av_s=1.2709
IQ 0 19:40:47.022 코어 1 2004.01.07 02:45:00 B_up_s=1.279656914787522 M_av_s=1.2709
CE 0 19:40:47.022 코어 1 2004.01.07 03:00:00 B_up_s=1.279579626541548 M_av_s=1.2707

 //#property link      "http://www.mql5.com"
//#property version   "1.00"

//+------------------------------------------------------------------+

 double
   BDev_var_b= 2 ,       
   BDev_var_s= 2 ,       
   B_up_s= 0 , 
   B_low_s= 0 ,
   B_med_s= 0 ,
   M_av_s= 0 , 
   Base[ 1 ],
   Upper[ 1 ],
   Lower[ 1 ],
   MAv[ 1 ],   
   Dist_c= 0.0015 ,
   Dist_d= 0.002 ;
   
   bool 
    selord= false ,  
    baiord= false ,
    New_Bar= false , 
    sbl_top= false ,    
    sbl_bot= false , 
    bai= false ,  
    sel= false ;
   
   int
    Bands_handle,    
    MA_handle,   
    MA_var_s= 1 ,   
    BP_var_s= 50 ;  

    
//=============================================================================================================
int OnInit ()
  {

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {


   Bands_handle= iBands ( NULL , 0 ,BP_var_s, 0 ,BDev_var_s, PRICE_CLOSE );
   CopyBuffer (Bands_handle, 0 , 0 , 1 ,Base);
   CopyBuffer (Bands_handle, 1 , 0 , 1 ,Upper);
   CopyBuffer (Bands_handle, 2 , 0 , 1 ,Lower);
   B_med_s=Base[ 0 ];
   B_up_s=Upper[ 0 ];
   B_low_s=Lower[ 0 ];
   
   MA_handle= iMA ( NULL , 0 ,MA_var_s, 0 , MODE_SMA , PRICE_TYPICAL );
   CopyBuffer (MA_handle, 0 , 0 , 1 ,MAv);
   M_av_s=MAv[ 0 ];
   
   
   Print ( " B_up_s=" ,B_up_s, "   M_av_s=" , M_av_s);  

   
   // установка флагов
   if (sbl_top== false && (B_up_s-M_av_s)<Dist_c) 
     {
       sbl_top= true ;
       Print ( "sbl_top=true   " , "  B_up_s=" ,B_up_s, "  M_av_s=" , M_av_s, "  B_up_s-M_av_s=" , DoubleToString (B_up_s-M_av_s));
     }
   if (sbl_top== true && (B_up_s-M_av_s)>Dist_d)
       {
       sbl_top= false ;
       Print ( "sel=true  " , "  B_up_s=" ,B_up_s, "  M_av_s=" , M_av_s, "  B_up_s-M_av_s=" , DoubleToString (B_up_s-M_av_s));
       }
    


     return ;                                   
   }


 
Alvin1976 :

다음은 발견된 내용입니다.

1) 매 틱마다 지표를 생성 할 필요가 없습니다!

2) 해당 값을 참조하기 전에 지표가 생성되었는지 여부를 확인해야 합니다.

3) 지시자로부터 요청한 값이 복사되었는지 확인이 필요하다.

4) Expert Advisor 완료 후 지표의 계산된 부분을 항상 삭제하십시오. 그렇지 않으면 어느 시점에서 충분한 오퍼레이터가 없을 수 있습니다.

잼은 아직 생성되지 않은 지표에서 값을 복사하려고 시도했기 때문입니다. 호출된 함수의 결과를 확인하는 것을 규칙으로 합니다.

파일:
 

어디가 잘못되었는지 알려주세요.

전문가가 데모 작업, 3쌍. 다음은 로그입니다.

PUSD,M15)       AUDUSD Request executed: delete buy Ticket: # 729600 Price = 0.94794 Lots = 0.1 StopLoss = 0 TakeProfit = 0 Comment = BuyTP( 4 )
LH       0        08 : 45 : 05.881     Serendipity5. 0 (GBPUSD,M15)     AUDUSD Request executed: delete buy Ticket: # 729598 Price = 0.94514 Lots = 0.42 StopLoss = 0 TakeProfit = 0 Comment = BuyTP( 4 )
KM       0        08 : 45 : 06.053     Serendipity5. 0 (GBPUSD,M15)     Error: AUDUSD Action: delete buy : Requested Volume: 0.42 , Requested StopLoss: 0 , Requested TakeProfit: 0 , Requested Price: 0.94514 Error: 10013
OE       0        08 : 45 : 06.053     Serendipity5. 0 (GBPUSD,M15)     Sleep () for 1 second, retry
LO       0        08 : 45 : 07.145     Serendipity5. 0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
CQ       0        08 : 45 : 07.145     Serendipity5. 0 (GBPUSD,M15)     SendOrder(); OrderCheck () Error = 10013 Sleep () for 1 second, retry
GP       0        08 : 45 : 08.237     Serendipity5. 0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
PL       0        08 : 45 : 08.237     Serendipity5. 0 (GBPUSD,M15)     SendOrder(); OrderCheck () Error = 10013 Sleep () for 1 second, retry

다음은 코드입니다.

 bool SendTradeRequest( string symb, ENUM_ORDER_TYPE type, ENUM_TRADE_REQUEST_ACTIONS tradeAction, double price, 
   double lot, double stopLoss, double takeProfit, long const magic, string comment, ulong ticket){
//--- prepare a request
   MqlTradeRequest request={ 0 };
   //ZeroMemory(request);
   
   request.action=tradeAction;        
   request.magic=magic;              
   request.symbol=symb;                 
   request.volume=lot;                         
   request.sl=stopLoss;                             
   request.tp=takeProfit;                                 
   request.type=type;              
   request.price=price;
   request.comment=comment;
   if (tradeAction== TRADE_ACTION_MODIFY || tradeAction== TRADE_ACTION_REMOVE )request.order=ticket;
      
//--- send a trade request
   MqlTradeResult result={ 0 };
   MqlTradeCheckResult checkresult={ 0 };
   //ZeroMemory(result);
   //ZeroMemory(checkresult);
   bool isSuccessful;
   isSuccessful= OrderCheck (request,checkresult);
   if (checkresult.retcode!= 0 && checkresult.retcode!= 10009 && checkresult.retcode!= 10008 ){
       Print ( "SendOrder(); OrderCheck() Error = " ,checkresult.retcode, " Sleep() for 1 second, retry" ); 
       Sleep ( 1000 ); return ( 0 );                                      
      }       
      
   isSuccessful= OrderSend (request,result);        
   if ( (result.retcode == 10009 || result.retcode == 10008 || result.retcode == 0 ) ){
       //--- write the server reply to log  
       //Print(__FUNCTION__,":",result.comment);
       Print (symb, " " +result.comment+ ": " +ConvertTradeActionToString(request.action)+ " " ,( string )ConvertOrderTypeToString(request.type), " Ticket: #" ,( string )result.order, " Price = " ,( string )request.price, " Lots = " ,( string )request.volume,
         " stopLoss = " ,( string )request.sl, " takeProfit = " ,( string )request.tp, " Comment = " ,( string )request.comment);
      
       if (tradeAction== TRADE_ACTION_PENDING )   
         arrow_cntr=CreateSignalArrow( "Open " +( string )ConvertOrderTypeToString(request.type)+ " " +request.comment+ " Ticket " +( string )result.order+
             " Lots " + DoubleToString (request.volume, 2 )+ " Time " + TimeToString ( TimeCurrent (), TIME_MINUTES ),arrow_cntr,request.price, 216 , clrDarkViolet ,symb);
      
       if (tradeAction== TRADE_ACTION_MODIFY )   
         arrow_cntr=CreateSignalArrow( "OrderModify " +request.comment+ " Ticket " +( string )request.order+ " Lots " + DoubleToString (request.volume, 2 )+
             " Time " + TimeToString ( TimeCurrent (), TIME_MINUTES ),arrow_cntr,request.price, 251 , clrSilver ,symb); 
      
       if (tradeAction== TRADE_ACTION_REMOVE )
         arrow_cntr=CreateSignalArrow( "OrderDelete " +request.comment+ " Ticket " +( string )request.order+ " Lots " + DoubleToString (request.volume, 2 )+
             " Time " + TimeToString ( TimeCurrent (), TIME_MINUTES ),arrow_cntr,Close( 1 ,symb), 158 ,Red,symb);      
      
      CheckErrorMessage( "SendTradeRequest():" );
       return ( 1 );  
      }  

EA가 OrderDelete()를 실행하려고 하면 오류가 발생하고 SendTradeRequest()가 while 루프에 있고 EA가 그에 따라 루프합니다. 신청서를 보낼 때 가격이 변경되었을 수 있습니까? RefreshRates()가 필요한지, 올바르게 작업하는 방법은 포럼에서 검색했지만 어디에서나 예제를 찾지 못했습니다.

모두 미리 감사드립니다