MQL5で学び、共に書く - ページ 10

 

この質問でいいのかどうか。

デバッグとテスターの併用は可能ですか?I.e. F5で起動すると、テスターはもちろん起動しない。また、テスターでExprrtを起動すると、ブレークポイントが 無視されます。それとも、私のやり方が悪いのでしょうか?

 
Lunatic:

この質問でいいのかどうか。

デバッグとテスターの併用は可能か?

今のところないですね。
 
alexvd:
今のところないですね。

では、体験版ではリアルタイムのみ?面白い場面でのデバッグはどうでしょうか?

最初はデバッガーに興奮していたのですが、プリントアウトのデバッグにスライドしています。それ以外のデバッグ技術は見えない。- イライラする。

 

例として提供されたExpert AdvisorであるMovingAverageを学習。 すべてが美しい。テスターについて質問です。

このEAでは、ローソク足を最初のティックだけ解析しています。 ある状況下では、処理されずに抜け落ちてしまうことに気づきました。最初のティックから珍しいローソク足が誕生することがわかった。接続の影響なのか、私の不具合なのか、テスターの不具合なのか。

どうやら、ロウソクの誕生時のみ、つまり一度だけ処理するためには、最後に処理したロウソクをスタティック変数に 格納する必要があるようですね。

P/S/ 言語を学び始めたばかりなので、このような退屈な質問をしてしまいました。

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

こんにちは、チャンピオンシップに間に合うかどうか、EAを書いているところです。簡単なコードを書き、2つのカスタムインジケーターを 使用しましたが、これらのインジケーターの値が0であるため、取引は行われません。

//+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

input int period =48;
input int period1 =30;
input int sl=200;
input double lot=0.1;
input long magicBUY1=102;
input int magicSELL1=202;
input string sim="eur";

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   hind1=iCustom("EURUSD",PERIOD_H1,"trend_v3_5",period);
   hind2=iCustom("EURUSD",PERIOD_H1,"trend_v3",4);



   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
IndicatorRelease(hind1);
IndicatorRelease(hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick()
  {
  
 int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
 MqlTradeResult mresult;
   MqlTick latest_price;   
 


ArraySetAsSeries(ind1,true);
ArraySetAsSeries(ind2,true);
MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

SymbolInfoTick(_Symbol,latest_price);
//BUY


   if (PositionSelect(_Symbol)==1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){jj=1;} //определяет если позиция BUY
   if (jj==0 ){
if ( ind2[1]>ind1[1]){ // условие на покупку
Print("индикатор=",ind2[1]," ",ind1[1]);
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - sl*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(0,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

GlobalVariableSet( "k11"+sim,Bars2);
GlobalVariableSet( "bar11"+sim,Bars("EURUSD",NULL));
}}
   
  
  }
//+------------------------------------------------------------------+
 

Lunatic:

このEAは、ローソク足の最初の1ティックだけを分析するのですが、処理されずにすり抜ける場面があることに気づきました。最初のティックから珍しいローソク足が誕生することがわかった。接続の影響なのか、私の不具合なのか、テスターの不具合なのか。

どうやら、ローソク足が生まれた時だけ、つまり一度だけ処理するためには、最後に処理したローソク足をスタティック変数に 格納すればいいようです?

新しいバーの出現を追跡するには、バーの時刻を変更し、あらかじめ静的変数に格納しておく方がよいでしょう。

IsNewBarの 記事と、EAの制限とチェックの 記事で例を見ることができます。

 
Automated-Trading:

新しいバーの出現は、あらかじめ静的変数に保存しておいたバーの時刻を変更することでよりよく追跡できる。

IsNewBarやLimits and checks in EAsの 記事で例が見られます。

ありがとうございます、スッキリしました。

しかし、ここで分からないのが、EAのデバッグの方法です。試されるのはシステムではなく、プログラムのバグであることは明らかです。例えば、プログラムがある分岐に入るのに失敗する理由がわからないのですが、なぜでしょうか?別のデバッグスタンプを押して、それをジャーナルで探し、別のスタンプを押して、プログラムが動くまで一定時間待って、またジャーナルで探せばいいのでしょうか?

プログラムエラーの検索方法について教えてください。

 
m_a_sim:

こんにちは、チャンピオンシップに間に合うかどうか、EAを書いているところです。簡単なコードを書き、2つのカスタムインジケーターを 使用しましたが、これらのインジケーターの値は0であり、取引は実行されません。

あなたのコードをデバッグするために、私はカスタムインジケーターをMAに置き換えました。

   hind1=iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE);
   hind2=iMA("EURUSD",PERIOD_H1,40,0,MODE_SMA,PRICE_CLOSE);

また、配列への値のコピーを修正しました。

MAX=CopyBuffer(hind1,0,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

今は指標となる数値があります。

//+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

input int period =48;
input int period1 =30;
input int sl=200;
input double lot=0.1;
input long magicBUY1=102;
input int magicSELL1=202;
input string sim="eur";

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   hind1=iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE);
   hind2=iMA("EURUSD",PERIOD_H1,40,0,MODE_SMA,PRICE_CLOSE);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
IndicatorRelease(hind1);
IndicatorRelease(hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick()
  {
  
int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
MqlTradeResult mresult;
   MqlTick latest_price;  



ArraySetAsSeries(ind1,true);
ArraySetAsSeries(ind2,true);
MAX=CopyBuffer(hind1,0,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);

SymbolInfoTick(_Symbol,latest_price);
//BUY


   if (PositionSelect(_Symbol)==1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){jj=1;} //определяет если позиция BUY
   if (jj==0 ){
if ( ind2[1]>ind1[1]){ // условие на покупку
Print("индикатор=",ind2[1]," ",ind1[1]);
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - sl*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(0,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

}}
  
  
  }
//+------------------------------------------------------------------+
 
AM2:

あなたのコードをデバッグするために、カスタムインディケータを MAに置き換えてみました。

そして、配列への値のコピーを修正しました。

今は指標となる数値があります。

インジケータが原因か? テスターでエラーが発生する

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 'trend_v3.mq5' の配列が範囲外 (71,9)
2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 'trend_v3_5.mq5' で配列が範囲外 (83,9)

 

m_a_sim さんへ

インデックスの情報をコピーする前に、ハンドルのハンディキャップを確認する方が正しいと思います。また、これらのデータの有無も確認した方が良いのでは・・・。

MAX=CopyBuffer(hind1,2,0,3,ind1);
MIN=CopyBuffer(hind2,0,0,3,ind2);