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

 
goldtrader:

第一に、実数の Stochast_ と整数の 75 を比較するのは誤りであり、第二に、それらの差を 0 と比較するのがより正しいのです。

この状況では、小数点以下8桁の誤差は結果に影響を与えないと思うのですが。
 

もう一つの問題は、Position Closing Blockで発生します。私はこのブロックをお気に入りのExpert Advisorに入れました。トレンドの方向にしか取引しない(その点では、深く感謝しています...)。

しかし、トレンドの強さに応じて、エキスパートアドバイザーは一貫して複数の取引を次々と開くことが可能です(実際にそうしています!)。そこで、インジケーターのシグナルで決済ポジションのブロックが必要です。しかし、ここで問題です!トレンドの中でいくつかのポジションを持ち、トレンドに反する調整が始まった場合、ブロック内のインジケータはクローズのシグナルを出します。必要な時に必要なだけ。

しかし、何らかの理由で、すべてのオープンポジションがクローズされるわけではありません。基本的に、一番最初のものだけです。後から開いたものは、クローズ信号に反応せず、そのまま動き続ける。そしてさらに、-「歴史は茶番劇のように繰り返される」のだ!各クローズ信号で、1つだけ、最も早いオープンポジションがクローズされ、他のポジションは動き続けるのですすべてのポジションのロットは一定です。

こちらがビジュアルモードチャートです。インジケーターのシグナルによる終値は、緑の三角形で表示されます。信号によって毎回1つのポジションだけがクローズされることがよくわかる。すべての募集を締め切ってほしい!」。何が原因なのか、アドバイスをお願いします。

コードの備忘録 :

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

Closing Blockではもう一つ問題が発生します...。

OrdersTotal()のループはどこにあるのでしょうか?
 
granit77:
OrdersTotal()のループはどこにあるのでしょうか?
あるとしても、0からOrdersTotal()-1までであり、その逆であるべきです ;)
 

いいえ、ここではそうではありません。注文の定義が違う -。

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

そして、このバージョンのコードは、私にとってより快適なものなのですなぜなら、私のロングとショートのポジションは互いに独立して開くからです。

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

ただし、標準のクロージャーではそのまま ...

if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

ただし、標準のクロージャーではそのまま ...

if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

OrdersTotalから 0への逆ループを試してみるとよいでしょう。
 

どうすればいいのか?それは負担のあまりでない場合は、書いてください。 ここでは、ところでチャートだ - 上記の "標準 "で:すべてが同じです - 唯一の位置は、指標の信号で閉じます - 。

 
rid:

どうやるんですか?

komposterとVininによると、その代わりに。
for (int v=0; v<OrdersTotal(); v++)

を書きます。
for (int v=OrdersTotal()-1; v>0; v--)

私には効果的です。
 
granit77:
ライドを 行います。

どうやるんですか?

komposterとVininが信じるなら、代わりに。
for (int v=0; v<OrdersTotal(); v++)

を書きます。
for (int v=OrdersTotal()-1; v>0; v--)

私には効果的です。

まったくその通りです。KimVにはこれらを実装したスクリプトやライブラリがありますが。彼のフォーラムで探した方がいいかもしれませんね。