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

 
novichok2018:

ありがとうございます。休憩が効いたようです。この先どうなるのか、見てみましょう。

いや、本当に役に立っていない。1種類のポジションを開いた場合のみ機能します。例えば、売りポジションが開設され、まだ決済されておらず、同時に買いポジションが開設され、決済された場合、売りポジションは、他の売りポジションが(自身の条件に従って)開設・決済されるまで、自身の決済条件を確認することができないのです。そして、BAYが再びオープンしてクローズすると、再びクローズ条件を逃すことになる。I.Kimさんの関数ExistPositions()を使ってBAYを閉じた後のオープンポジションの 有無を判断しようとしましたが、どこに挿入して、どこにPrintを配置すれば実行制御できるのかが分かりません。何か手がかりは?

 
novichok2018:

いや、本当に役に立っていない。同じ種類のポジションが開いている場合のみ有効です。例えば、最初に売りのポジションが開かれ、まだ閉じられていない場合、同時に買いのポジションが開かれ、閉じられると、売りのポジションは、別の売りのポジションが開かれ、その条件に従って閉じられるまで、その終了条件を見ることはありません。そして、BAYが再びオープンしてクローズすると、再びクローズ条件を逃すことになる。I.Kimさんの関数ExistPositions()を使ってBAYを閉じた後のオープンポジションの 有無を判断しようとしましたが、どこに挿入して、どこにPrintを配置すれば実行制御できるのかが分かりません。ヒントを教えてください。

誰も解決策を知らないのだろうか?しないんです。

 
novichok2018: 誰も解決策を知らないのだろうか?しないんです。

フォーラムにログインしてみると、独り言を言っているようですが...。会話の始まりはどこなのか、何の話なのか......わかりにくい。プログラムのデバッグには、Printの代わりにAlertを 使うと、画面に一度に表示されるので便利です。これらのAlertは、if条件がチェックされる前に置かれます。鉛筆を使ったもう一つのデバッグ方法 - プログラムをあるべき姿で実行し、変数の値を書き留める。変更したら、古い値を消して、新しい値を書き込む。以前はこうでした。MetaEditorにデバッガが搭載され、変数の値を監視できるようになりました。最も単純な構造は、スクリプトを書くことで別途チェックする必要がある

 
novichok2018:

誰も解決策を知らないのだろうか?しないんです。

この方法で試してみてください。

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
iCustomはどこからデータを取得しているのですか?
 
Igor Makanu:

は、このように試してみてください。

ありがとうございます、試してみましたが、調整してもポジションが閉じないので、コンパイラは誓いません。

 
STARIJ:

掲示板に入ると、独り言のように...。どこから何を言っているのか、わかりにくいですね。プログラムのデバッグには、Printの代わりにAlertを 使う方が便利です - 一度に画面に表示されます。これらのAlertは、if条件がチェックされる前に置かれます。鉛筆を使ったもう一つのデバッグ方法 - プログラムをあるべき姿で実行し、変数の値を書き留める。変更された場合は、古い値を消し、新しい値を記入してください。以前はこうでした。MetaEditorにデバッガが搭載され、変数の値を監視できるようになりました。最も単純な構成は、スクリプトを書くことで別途チェックする必要がある

お薦めをありがとうございます。しかし、私の状況には、それらは全く正しくありません。念のため、以下はカスタムクロージング関数のコードです。

 

正しく動作しません。ポジションのクローズは最初のオープンポジションの条件 下で行われます。つまり、最初に条件1で買いまたは売りのポジションを建て、次に条件2で2つ目のポジションを建てた場合、マジックナンバーが異なるにもかかわらず、終値条件は無視され、2つ目のポジションも条件1でクローズされます。

注文終了後にブレークをかけましたが同じ種類のポジションが1つでも開かれていれば いいという中途半端な解決 策になっています。例えば、買いポジションが開閉されている間に、先に売りポジションが開かれ、まだ閉じられていない場合、売りポジションは、他の売りポジションが開かれ、その条件に従って閉じられるまで、閉じられるべき条件を見ないことになります。そして、BAYが再びオープンしてクローズすると、再びクローズ条件を逃すことになる。では、どうすればいいのか?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
iCustomはどこからデータを取得しているのですか?

カスタムインジケータの バッファから、例えばMAで実践

novichok2018 です。

注文を決済した後にブレークをかけたのですが同じ種類のポジションを1つだけ建てた 場合のみという中途半端な解決 方法になっています。例えば、BAYポジションが開閉している間にBOYポジションが開かれてまだ閉じていない場合、BAYポジションは他のBAYポジションが(自分の条件で)開閉するまで閉じる条件を見出さない。そして、BAYが再びオープンしてクローズすると、再びクローズ条件を逃すことになる。では、どうすればいいのか?

breakをcontinueに置き換えてみてください。

私のコード例が何もクローズしないのは不思議です。おそらく価格の正規化についてでしょう。

 
Igor Makanu:


breakをcontinueに置き換えてみてください。


交換された。呪われたエラー138(リクオート)。その後、ブレイクバックを与えたら、また138になりました。不思議なことに、今まで気づかなかったのかもしれません。

 
Igor Makanu:

カスタムインジケータの バッファから、MAで練習して、例えば


端末のデータウィンドウに表示されるフィールドからでしょうか?