[アーカイブ!】どんなルーキーの質問でも、フォーラムを散らかさないように。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 2. - ページ 288

 

こんにちは、どなたか問題を解決する手助けをしてください。

私は、テイクプロフィットで最後のポジションの終値フラグを返すクリマブロックを持っており、ストップでも同じです。

//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}

が、私の使い方はこうです。

bool Buystop=isCloseLastPosByStop(NULL,OP_BUY,MagBuy);
bool BuyTake=isCloseLastPosByTake(NULL,OP_BUY,MagBuy);
bool Sellstop=isCloseLastPosByStop(NULL,OP_SELL,MagBuy);
bool SellTake=isCloseLastPosByTake(NULL,OP_SELL,MagBuy);

//--------------------------------------------------------------------------------+
if(total==1) 
  {
   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }

そして、最初はすべてが計画通りに進み、ロット4で私が必要とするものと、この1つが開かれます。

if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   } 

何に使うのかがわからない。

明瞭にするため

時間 タイプ ご注文 ボリューム 価格 S / L T / P 利益 バランス
1 2011.01.03 00:00 買う 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 捌く 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 エスエル 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 捌く 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 ティーピー 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 捌く 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 買う 5 1.00 1.2946 1.2746 1.3046

 
FoxUA:

何に使うのかがわからない


そうなんです。

最初のチェック(total==1)は、オーダーがまだ1の時に行われる。ブロックの中には、最後に閉じた売り→開き、最後に閉じた買い→再び開くがあります。これで注文は3件になりました。

 
Figar0:


ええ、その通りです。

最初のチェック(total==1)は、オーダーがまだ1の時に行われる。ブロックの中には、最後に閉じた売り→開き、最後に閉じた買い→再び開くがあります。この結果、すでに3件の受注があります。


はい、しかし、それは2つだけの注文だった作る方法、それは番号6の下に順序を開くことはありません。

時間 タイプ ご注文 ボリューム 価格 S / L T / P 利益 バランス
1 2011.01.03 00:00 買う 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 捌く 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 エスエル 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 捌く 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 ティーピー 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 捌く 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 買う 5 1.00 1.2946 1.2746 1.3046

 

最も簡単な方法は、買いまたは売りのタイプの未決済注文があるかどうかを確認することです。このようにします (変数 BuyOrders, SellOrders, TotalOrders はプログラムのグローバル変数 です。これらは start() 関数の中で int BuyOrders, SellOrders, TotalOrders; として宣言する必要があります)。:

void OrdersRecount()
{
  BuyOrders=0; SellOrders=0; TotalOrders=0;
  if (OrdersTotal()>0)
  {
    for (int j = 0; j < OrdersTotal(); j++) 
    {
      if (OrderSelect(j, SELECT_BY_POS)) 
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagBuy)
        {
          if (OrderType() == OP_BUY) BuyOrders++;
          if (OrderType() == OP_SELL) SellOrders++;        
          TotalOrders++;
        }
      }
    } 
  }
}
 
Figar0:

最も簡単な方法は、買いまたは売りの未決済注文を確認することです。これを持って。


使い方がよくわからないのですが......よろしくお願いします。

 
FoxUA:


使い方がよく分からないので、できれば助けてください。


そうしますが、あなたのコードのロジックはまだ理解できません。

   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }
3ケースで買って1ケースで売るという開き方でいいんですか?左右対称でない...。
 
Figar0:


手伝いますが、あなたのコードのロジックはまだ理解していません。

3つのケースで売りポジションを、1つのケースで買いポジションを建てるというのは確かですか?左右対称でない...。


市場にポジションがないときにオープンし、いずれかの値が正しい場合、1つのオーダーをオープンし、ポジションがクローズするのを待つようにしたいのです。

bool totalBuy=ExistPositions(NULL,OP_BUY,MagBuy) ;
bool totalSell=ExistPositions(NULL,OP_SELL,MagBuy) ;


if(totalBuy==False||totalSell==False) 
 
FoxUA:

市場にポジションがない場合のみオープンし、選択した値の1つが正しい場合、1つのオーダーをオープンし、ポジションがクローズするのを待つようにしたいのです。

つまり、買い注文が 2つあって、売り注文がない場合があることが判明したのですね。
 

Figar0:

Т.е. получается что возможна ситуация когда у вас будет 2 ордера на покупку и не одного на продаж

いいえ逆に、ストップとトラッキングなしで販売を含む唯一の2つの位置があるはずです、文はそれが起こる方法を示しています。
 
FoxUA:
その逆はありません。ポジションはストップやキーパーなしの売りも含めて2つだけであるべきで、ステートメントにはその仕組みが示されています。


そうすると、すべてがもっと複雑になります。 アルゴリズムがどのように機能すべきかを言葉で説明してください、私はそれを見ている間、あなたを助けようとします)

- 2ポジション同時使用可能。

- まず、買いと売りの2つのポジションをオープンします。

- ロングポジションをストップロスで決済→SLとTPを3倍にしたショートポジションを建てた場合、通常のSLとTPの売りポジションと、3倍のTPの売りポジションの2つが得られます。

次は?