記事"かずかずのインスツルメントで取引を行うExpert Advisorの作成"についてのディスカッション - ページ 5

 
Interesting:
ByTnew[1] 無効な配列範囲- 範囲オーバーランのようです。配列の要素番号は配列範囲の先頭から始まることをお忘れなく。

no access to edit message from2010.07.16 22:41 2010.07.16 22:41:25 #.

Replace:8.Exp_TEMA.mq5で、テスト時にバー内部でオープンしてしまうのはなぜですか?

8.なぜExp_TEMA.mq5は、テスト時に、1つのバーで複数の取引を開くのですか?

 
ias:
no access to edit message from2010.07.16 22:41 2010.07.16 22:41:25 #

投稿の編集は投稿から3日以内のみ可能です。

削除済み  

ias:

8.なぜExp_TEMA.mq5では、テスト時に1つのバーで複数の取引をオープンするのですか?

以前に建てたポジションや 設定された注文があるかどうかのチェックが行われていないと考えるのが論理的でしょう。
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...


以前に建てたポジションのチェックや、未決済注文の設定は行われていないと考えるのが自然でしょう

Exp_TEMA.mq5では、未決済注文は 使用されていません。 前回オープンしたポジションはチェックされています:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

おそらく何かが間違っています:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ 変数配列のサイズを格納するための変数宣言
   static int Size_ = 0;
   
   //----+ 変数配列のサイズ変更
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ):エラー!変数配列のサイズ変更に失敗しました!!! "); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ):エラーコード ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

または

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ 貿易禁止チェック
   if (!Trade)return(true);
   
   //----+ 変数配列の合計サイズを格納する変数を宣言する。
   static int Size_ = 0;
   
   //----+ インジケータ・ハンドルを格納する配列を、静的変数として宣言する。
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ 初期化 
   if (Number + 1 > Size_) // 初回起動時のみ初期化ブロックに入る。
    {
     Size_ = Number + 1; // この番号のブロックへのエントリーはクローズされる。
     
     //---- 変数配列のサイズ変更
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- 計算に必要な小節数の最小値を決定する。 
     MinBars[Number] = 3 * period;
     
     //---- 配列のセルを予備的にゼロにする
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- 配列を時系列として使用する
     ArraySetAsSeries(TEMA, true);
     
     //----+ インジケーター・ハンドルの取得
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ 計算に必要な小節数をチェックする。 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ 売買シグナルの受信 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // 小節の変更またはデータ・コピー失敗時にブロックに入る。
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ インジケーターのハンドルを使って、インジケーターの
                   // バッファを特別に用意された静的配列に入れる
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // データを受信していないので、次のように返す。 
                                 // 次のティックで売買シグナルを受信する!
       return(false); // 取引シグナルを受信せずに、TradeSignalCounter()関数を終了します。
      }
      
     //---- インジケータ・バッファからのコピー操作はすべて成功裏に完了。
     Recount[Number] = false; // 次の小節が変わるまで、このブロックに戻らないことも可能である。
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- 入力信号の定義
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- 出力信号の定義
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

EURUSD、期間D1でExp_TEMA.mq5をテストすると、1つのバーで複数の取引が行われます。

削除済み  
イアス、それは記事の著者のところに行った方が......。
 
ias:

Exp_TEMA.mq5をテストすると、なぜバー内で取引が開始されるのですか?

なぜExp_TEMA.mq5はテスト時に1つのバーで複数の取引をオープンするのか?

重要なのは、この記事の文脈では、本質を理解するのを邪魔するような些細なディテールでメインアイデアを乱雑にすることなく、シンプルな多通貨エキスパートアドバイザーを実装することが課題だったということです。 細部を埋める方法は人それぞれだ。あなたの状況では、すべてが初歩的に解決されます。取引シグナルの変数は取引機能の入力として作られ、リンクによってリンクされ、これらの変数は取引機能 内部での取引後にリセットされます。
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
重要なのは、この記事の文脈では、本質を理解するのを邪魔するような細部で主要なアイデアを乱雑にすることなく、シンプルな多通貨エキスパート・アドバイザーを実装することが目標だったということだ。細部を埋める方法は人それぞれだ。あなたの状況では、すべてが初歩的に解決されます。売買シグナルの変数が売買関数の入力として作られ、リンクで結ばれており、売買関数 内で取引が実行された後、これらの変数はリセットされます。
ExpertAdvisorのExp_TEMA.mq5を例に、どのようにすればよいか教えてください。
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

私の考えでは、プログラミング言語を学び理解することは、個人が自分の必要に応じてコードをアレンジする小さなタスクを解決することにある。そうでなければ、なぜこのサイトやプログラミング記事が必要なのか?記事の著者の能力を示すため?自分で理解したくない人は、https://www.mql5.com/ru/job
例えば、MQL4では、このhttps://www.mql5.com/ja/articles/1516 のように最も単純な形でこのアプローチを実装した。MQL5では何も変わらず、すべて同じ方法で行う。

 
GODZILLA:


1.記事で紹介されているExpert Advisor Exp_TEMA.mq5のコードは、このトピックで以前に報告されたように、テスト中に1つのバーで複数の取引をオープンしています。 。この事実は、Expert Advisorに不正確なコードまたはバグが存在することを裏付けるものであり、多くのサイト訪問者がその排除に関心を寄せています。 2..ロシュの「Expert Advisors:Multicast」トピックに関する回答:「その上、

新しいバーを 決定する機能は、時間コピーの機能を使用せずに実装することができます。」 - また、Expert AdvisorのIsNewBar()関数をより合理的に記述する可能性を確認します。 私は、誰もが間違いを犯す可能性があり、それを正しく修正できるのはプロだけであるため、作者が専門的にこれらの欠陥をどのように排除するのか見てみたい。
 
ias:

この記事で紹介されている取引システムをよく見れば、それらはオーバーターンシステムであると結論づけることができる。このようなシステムにおけるストップロスは二次的な役割を果たし、少なくとも数本のローソク足で数えて、エントリーから非常に適切な距離に置かれます。教材のプレゼンテーションにおけるプロフェッショナリズムとは、自分で考えたくない一般大衆を基準にするのではなく、追加のギミックでごちゃごちゃさせることなく、可能な限りシンプルな形で主題を展開することにある。どんな教科書にも、理想から見れば必ず欠陥がある。そして、それが許容され、普通とされている。将来は、取引システム構築のこのような詳細なプレゼンテーションの順序があるでしょう、実装の詳細なレビューがあるでしょう、それもそれほど単純ではありません。
時間コピーに関しては、私自身はExpert AdvisorのIsNewBar()関数をより合理的に記述することによる有意な差は、計測はしたものの、全く見られなかったと断言できる!このトピックに関する記事も書きました。
、その気になれば、例えばこのサイトのどんな記事でも問題なく破り捨てることができる。しかし、私が情報を高く評価するのは、それが手に入るからであって、理想に対する私の考えと一致するからではない。
だから、私は遠回しな欠点を排除するつもりはないし、同時に、かなり理解しやすく、かなり専門的な理由から、それほど単純ではないコードを大幅に乱雑にするつもりもない。