ポジションをクローズする。オン表示信号です。 - ページ 5

 
komposter:
ライドを 行います。

やはり結果は同じ!最後のバリエーションでは、最後のオープンポジションのみがクローズされます。

今度はOrderCloseの 後にreturnを削除して、その結果を観察してみましょう;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
指示されたとおりにやりました。そして、奇跡が起きた。すべてのオープンポジションは、インジケーターのシグナルによってクローズされます。でも、なぜ?
 
rid:
komposter
ライドを 行います。

やはり結果は同じ!最後のバリエーションでは、最後のオープンポジションのみがクローズされます。

今度はOrderCloseの 後にreturnを削除して、その結果を観察してみましょう;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
指示されたとおりにやりました。そして、奇跡が起きた。すべてのオープンポジションは、インジケーターのシグナルに従ってクローズされました。でも、なぜ?
あなたの帰国で処理サイクルが中断された。
 
了解です。ご回答いただいた皆様、ありがとうございました。
 
KimIV:

私は普段からこのような機能を実装しています。

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
このように、かなり特殊な動作をする関数が書かれています。そして、これらの機能を組み合わせることで、ポジションに応じた望ましい戦術を実現するのです。
イゴールさん、もう少し詳しく機能を説明してください。 理解したいのですが、私の知識が乏しいため、最初の方で思考が途切れてしまうのです。
 
rid писал (а):
イゴール、あなたの機能をもっと詳しく説明してください。理解したいのですが、私の知識がささやかなため、最初の段階で思考が途切れてしまうことがあります。

これは、動作中のEAから抜き出した例です。機能割り当て。

  1. 関数 GetTradeSignal() は、配列 ms[] に取引シグナルを格納します。もちろん、GetTradeSignal()関数の詰め方は専門家ごとに異なります。
  2. 関数 ExistPositions()は、位置の存在フラグを返す。
  3. 関数 ClosePositions() は、対応する信号が ms[] 配列に存在する場合、1つまたは複数のポジションを閉じます。閉じる前に、if (ExistPositions("", -1, Magic)) という条件でポジションの存在を確認する。
  4. 関数OpenPosition()は、ms[]配列に対応するシグナルがある場合、現在の価格で1つのポジションをオープンします。信号がない場合のみ、ポジションを開くことができます。

タクティクス

  1. ポジションがあり、クローズするシグナルがあれば、ポジションをクローズ する。
  2. ポジションがなく、ポジションを建てるシグナルがあれば、ポジションを建てる。

こんなに簡単なんですよ?:-)

 
はい、ありがとうございます。何か考えてみるよ。
 

皆さん、こんにちは!メリークリスマス

もうひとつ問題が出てきました。理論に目を通したが、まだ出口は見つかっていない。Expert Advisor で開いたポジションを閉じるのに、ストップロスやテイクプロフィットの代わりに関数を使用する必要があります。してきました。うまくいった!しかし...

Expert Advisorにロット(B-lot)を計算するライブラリを挿入しようとしたところ、不明な動作をすることが判明!?MMを使わなければ、(最適化後の)バランスカーブはほとんど目立たずに右肩上がりになっていたのに、MMを入れたら急降下してしまいましたさらに!Bロットライブラリを削除し、ロットサイズを0.1から0.2にするだけでも、再び急激なプルダウンが見られる。初回入金額が数倍になったとしても・・・・・・。つまり、図書館でも預金額でもなく、そもそもドローダウンが悲惨だったという...。.こんな感じでエントリーしています。

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
ここでは、すべてが明確に理解できるのです。そして、OrderClose(. ...)関数を使ってポジションをクローズしています。こんな感じ。
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
ロット=0.1に初期設定すると正常に動作するのですが、ロットサイズを変更(増加)しようとしたり、MMライブラリを有効にしようとすると動作がおかしくなってしまうのですなぜなんでしょう?OrderLots()の代わりに "Lots "を使用しましたが、何も変わりません。お願いします、教えてください。
 
rid:
初期ロット=0.1では正常に動作しますが、ロットサイズを変更(増加)したり、MMライブラリを有効にすると、動作がおかしくなります。なぜなんでしょう?OrderLots()の代わりに "Lots "を使用しましたが、何も変わりません。お願いします、アドバイスお願いします。
EAがどのように違う動きを するのか、見ていかなければなりません。
注文の開始/終了は以前と同じタイミングですか?
 

ロットを0.1から0.2に上げると、取引はより頻繁に、2倍以上の頻度で発生するようになりました。同じ外部パラメータで ...不思議ですね。 でも、あまりの手抜きのなさに!こんな感じでやりました。

OrderClose 関数によるポジションのクローズを削除し、ticket=OrderSend(... ...)関数でStop LossとTake Profitによる通常のクローズを用意しました。この場合、MMブロックはそのとおりに動作しました!どうやら、この機能が重要なようです。

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
ロットを増やす場合は、「tp」の値を適宜変更する必要があるのでは?
 
空に向かって指を差そうか?;)

エラーはコードにあります。コードもないので、どこにあるのかわかりません。隣の支店の透視能力者を呼び出す;)