エラー、バグ、質問 - ページ 1141

 

皆さん、こんにちは。

そんな悩み。

Bandsと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]です。

Then print: B_up_s = 1.264249475876921 M_av_s = 1.2595

次に、行列演算B_up_s-M_av_sを実行してみると、0.00000000という結果が得られます。

奇跡とは何か?

 
Alvin1976:

皆さん、こんにちは。

そんな悩み。

Bandsと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];  

Then print: B_up_s = 1.264249475876921 M_av_s = 1.2595

次に、B_up_s-M_av_sのmate操作を実行してみると、結果として0.00000000が得られます。

何がそんなに不思議なんですか?

1) コードの挿入方法

2) 演算結果はどのような型の 変数に格納するのでしょうか?あるいは、もっと良い方法は、その出力が出るコードの部分を教えてください。

 
MigVRN:

1) コードの挿入 方法を教えてください。

2) 演算結果はどのよう な変数に格納するのですか?もっと良いのは、出力されるコードの部分を与えることです。

すべての変数はdouble型である。

Bandsは桁数が多いのに、MAは小数点以下が4桁しかないのが理解できない。結果がゼロになることは一切ないはずです。そのため、アルゴリズムが機能しないのです。

MQL4ではすべてがシンプルでした。今、あなたはより高い最適化速度と多通貨チェックを必要としています。全部MQL5に移さないといけないんだ(ふざけんな))。

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

すべての変数はdouble型である。

Bandsは桁数が多く、MAは小数点以下が4桁しかない理由は不明です。そして、ゼロの結果は全くないはずです。これが、アルゴリズムが機能しない原因です。

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桁しかない理由は不明です。ゼロという結果は全くないはずです。そのため、アルゴリズムが機能しないのです。

MQL4ではすべてがシンプルでした。今、あなたはより高い最適化速度と多通貨チェックを必要としています。全部MQL5に移さないといけないんだ(ふざけんな))。

引き算」操作の前に 変数の値を表示して、バッファに何が入っているかを確認します。
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

動作するはずです。以下は、あなたのコードに従ったスクリプトとその結果です。

はい、スクリプトは動作します。

この例のEAでも動作します。

一方、私のEAは、頑なにゼロを出し続けています。エラーを探そう ......。

 

みなさん、こんにちは。

質問ですが、1分間に1ティック ごとに更新される変数の値を作って、この合計を別の値に書き込んで、次の分が閉じたときに、合計の値を新しい値に置き換えるにはどうしたらいいでしょうか。

int t = TimeSeconds();

while (t !=0)

double b - 1分間に1目盛りずつ更新される変数.

double b1 - 直前のティックにおける変数bの値.

double s - 1分以内のすべてのティックに関する量。

double s1 - 直前1分間におけるすべてのティックに対する金額です。

b1=bです。

s=b1+bです。

if (t=0) s1=s;

カチカチ音を立てるごとにデータを要約させる方法と、一般的な正しい書き方を教えてください。

 
Alvin1976:

はい、スクリプトは動作します。

この例のEAでも動作します。

しかし、私のExpert Advisorはゼロを表示します。エラーを探そう............。

以下は、検出された内容です。

EAを実行しただけでは問題なく動作しますが、Strategy Testerでは一番最初に0が表示されます。しかし、次の行では魔法のようにゼロが通常のインジケータデータになる。何が何だかわからない......。

以下はそのコードです。

これがテスターの報告です。

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo): OHLC bar states generating.バー開始時のみOnTick実行
IJ 0 19:40:47.022 Core 1 EURUSD,M15: expertstmp.ex5 from 2004.01.07 00:00 to 2004.02.02 00:00 testing started
LK 0 19:40:47.022 Core 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 Core 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 Core 1 2004.01.07 00:15:00 B_up_s=1.279208140152992 M_av_s=1.2718
OI 0 19:40:47.022 Core 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.00740814
CJ 0 19:40:47.022 Core 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 Core 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 Core 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 Core 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 Core 1 2004.01.07 01:30:00 B_up_s=1.279380702214008 M_av_s=1.2731
IM 0 19:40:47.022 Core 1 2004.01.07 01:45:00 B_up_s=1.279440208228416 M_av_s=1.2723
LE 0 19:40:47.022 Core 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 Core 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 Core 1 2004.01.07 02:30:00 B_up_s=1.279601656250741 M_av_s=1.2709
IQ 0 19:40:47.022 Core 1 2004.01.07 02:45:00 B_up_s=1.279656914787522 M_av_s=1.2709
CE 0 19:40:47.022 Core 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) エキスパート終了後、必ずインジケータの計算部分を削除しないと、ある時点でRAM不足になる可能性があります。

まだ作成されていないインジケーターの値をコピーしようとしたため、問題が発生したのです。呼び出した関数の結果を確認することをルール化する。

ファイル:
 

どこにエラーがあるのか、教えてください。

Ekpertはデモ、3組で走っています。以下は、そのLogです。

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

エキスパートがOrderDelete()を実行しようとすると、エラーが発生する。もしかして、注文を出したら値段が変わってしまったのでしょうか?RefreshRates()は必要なのか、どうすれば正しく処理できるのか。 フォーラムで検索してみたのですが、例がありませんでした...。

ありがとうございました。