初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 115

 

みんな、ここで質問なんだけど、一次元の配列に変数の値を入れるにはどうしたらいいの?

このような問題に対応する例はありません。


ある条件下で変化する変数aがあるとする。

この変数の最後の3つの値を格納するための配列が欲しいのです。mql4ではどのように実装されているのですか?


int mas[3]を書いています。

mas[]=a; ループ内で、aを変化させる条件の後。

コンパイラは ']' を出力しますが、論理的にはそうなるはずなのに、何も動作しません。- mas[]=aの括弧の中に未知の式を入れるように要求されました。

MQL4には、ループの反復ごとに配列に変数値を入れるような関数はありますか?


 
Igor Makanu:

私は通信の開始を見つけることができないことをお詫びしますが、私はすぐにそれらの中に複雑な条件や計算を避けるために助言したいと思います - これはコードが読めなくなり、結果として論理的なエラーの検索を複雑にする、私は次のようにあなたのコードを記述します。

もし、私の言っていることが理解できるのであれば、私があげたコードをもう少し修正して、別の条件if(OrderType()==OP_BUY...) に入れるということです。

そうすれば、ロジカルエラーを見つけるのがより簡単になります。

各OrderSendの 後に挿入 => return

またはスイッチで選択します。

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

これを試してもうまくいかない。

カスタムインジケータの 入力パラメータが少ないようですが、Morning Flat インジケータの外部変数の 数を数えてみてください。(extern) - iCustomを使用する際に渡すべきパラメータの数です。

 
John Smith:
.....

aが変化したときの条件の後に、int mas[3]=a;とループ内に書いています。

が、論理的には動くはずなのですが、何も動きません。

すべての行動を一度に行うのではなく、段階を踏んで行うことを学ぶ。

例:

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

カスタムインジケータの 入力パラメータが少ないようですが、Morning Flat インジケータの外部変数が いくつあるか数えてみてください。(extern) - iCustomを使用する際に渡すべきパラメータの数です。

もう、全部試しましたよ。

私は別の方法でそれを解決しました。Expert Advisorにインジケーターの価格計算コードを挿入しています。

 
Igor Makanu:

コードのロジックは同じですが、条件を分割すれば、論理エラーがどこにあるのかを見つけるのが早くなりますし、あなたの場合、別の条件に入れれば、条件が4回チェックされるのではなく、1回チェックされるので、最適化ができます。

を別の条件に置き換えることで、コードを最適化 することができます。この例のように4回チェックするのではなく、1回で済みます。

を使用してExpert Advisorのジャーナルで出力を確認します。

どのコードがどのようなパラメータで実行されたかを知ることができるように、ログを記録します。

ご返信ありがとうございました。条件を限界まで割り切る。コメントでロジックを確認。ポジションクローズは、最初のオープンポジションの条件に基づいて行われることが判明しました。つまり、最初に条件1で買いまたは売りのポジションを建て、次に同じ条件だが条件2で2つ目のポジションを建てた場合、この決済条件は無視され、他のマジックナンバーに関係なく、2つ目のポジションも条件1で決済されるということです。どうしたらいいのでしょうか?

 
Vladimir Tkach:

もう、全部やりつくしたよ。

私は別の方法でこの問題を解決しました。インジケータからExpert Advisorに価格計算のコードを貼り付けました。

iCustom()が正しく呼び出されていないことに気がつきました、そのようにすべきです。

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

インジケータを呼び出す 際に7つのパラメータを渡しますが、あなたは3つのパラメータで呼び出しを行いました。

インジケーターの呼び出しは残すが、インジケーター自体を修正する - インジケーターのコードから外部変数とグラフィックオブジェクトを削除する


novichok2018 です。

コメントでロジックを確認しました。その結果、最初に開いたポジションの条件に従って、ポジションが閉じられることが判明しました。

おめでとうございます。正しい方向に進んでいますが、デバッグの段階では、コメント( Commetn() )ではなく、ジャーナル( Print() )で表示する方が良いでしょう。

コードを見せてください。

 
Igor Makanu:

それで、iCustom()を正しく呼んでいないことに気づいたのですが、このようにする必要があります。

インジケータを呼び出す 際に7つのパラメータを渡しますが、あなたは3つのパラメータで呼び出したのですね。

インジケーターの呼び出しは残すが、インジケーター自体を修正する - インジケーターのコードから外部変数とグラフィックオブジェクトを削除する


お目出度うございますしかし、デバッグの段階では、コメント( Commetn() )ではなく、ジャーナル( Print() )に出力する方がよいでしょう。

コードを表示する

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

プリントを削除しました。

 
novichok2018:

プリントを削除しました。

私はあなたのコードのすべてのロジックを知っているわけではありませんが、各注文が クローズした後、あなたは間違いなくブレークを介してループを終了する必要があり、次のティックで、あなたの条件に再び注文をチェックする必要があります - 私は注文がクローズした後にOrderSelect( )がどう動作するのか分からない- 注文がクローズした場合、何が選択され、エラーが発生するでしょうか

基本的に、あなたの問題は、1つのループですべてを一度にチェックし、クローズしたいことです。

スイッチ()

または、注文を閉じる関数を作成する(注文用の既成関数がある https://www.mql5.com/ru/forum/131859/page2#434206 )。

または、コード内で注文がクローズされた後にブレークを使用します。

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

私はあなたのコードのすべてのロジックを知らないが、各注文の クローズ後、あなたは間違いなくブレークを介してループを終了する必要があり、次のティックで、あなたの条件を再度確認する必要があります - 私は注文が閉じられた後OrderSelect( )が動作する方法がわからない- 注文は閉じている場合は、何が選択されているか、エラーが発生するのだろうか?

基本的に、あなたの問題は、1つのループですべてを一度にチェックし、クローズしたいことです。

スイッチ()

または、注文を閉じる関数を作成する(注文用の既成関数がある https://www.mql5.com/ru/forum/107476 )。

または、コード内で注文がクローズされた後にブレークを使用します。

ありがとうございます。ブレイキングが効いているようです。今後の展開に注目です。