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

 

こんばんは!問題が発生しました。

ポジションを決済したいのですが。インジケーターの信号によってさらに、ストップロスやテイクプロフィットでポジションを閉じることができるようにする必要があります。(指示信号が遅い場合に備えて)。- ということがよくあります)。

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

その後、オープンポジションをクローズするために、私は次のように規定します。

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>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

ただし、ポジションはストップロスまたはテイクプロフィットでのみ決済されます。(ごく稀に、たった一度の例外を除いて!)

チャート上のインジケータは、ほぼすべてのオープンポジションがインジケータの信号だけで閉じられるべきであることを示しますが。間違いがあるかもしれないので教えてください.?

 

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

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
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);
    }
  }
}
このように、かなり特殊な動作をする関数が書かれています。そして、これらの機能を組み合わせることで、ポジションに応じた戦術を実現するのです。
 
Stochast_1、Stochast_0に何かあるのだろう、他は問題ない
 
KIM IVさん、ありがとうございました。何とかしてみます。
 
Integer:
Stochast_1、Stochast_0に何かあるのだろう、他は問題ない


いや......。ストキャスティクスは問題ない。(価格を開く 作業)

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);
 
買いはビッドで決済される。この場合、指定したスプレッドと異なる気配値が最新の気配値ストリームにある場合にのみ、クローズがトリガーされます。 そのような気配値がブローカーが考慮する気配値のリストからまだ(老朽化して)外れていない場合、クローズ注文は実行される可能性があります。
 

ちゃんと理解できたかな?買いポジションが閉じること

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green)。

また、売りポジションは閉じている必要があります。

オーダークローズ(OrderTicket(),OrderLots(),Ask,3,Green); ?
 
rid:

ちゃんと理解できたかな?

全般的にうまくいったね。

 
そのとおりです。問題はAskにある
 

ストキャスティクスでポジションをクローズするのはまだ嫌ですちゃんとやったよ!外部パラメータにスイッチを挿入しました。コードの最後に、ポジションを閉じるための別のブロックがあります。クロージングのための緑の三角形を用意しました。

戦術は簡単で、上下に乖離した遅いMAで形成されたチャネルボーダーを越えることです。コードはとてもシンプルです。以下はExpert Advisorです。

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
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()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>75 && Stochast_0<75)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<25 && Stochast_0>25)    {
                 OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

どなたか見ていただけませんか?そして、どこが悪いのか教えてください...。

もしかして、注文を開くときに、ビッドとアスクチが不正確に設定されているのでは? と、いつも困惑しています。

ticket=OrderSend(Symbol(),...)とする。....
ファイル:
 
コードは見ていない。
ただ、ひとつだけ確かなことは、「if(Stochast_1>75 && Stochast_0<75)」ではなく、「if(Stochast_1>75 && Stochast_0<=75)」にすることです。
理由: