未決済注文の総量に関する問題 - ページ 4

 

みなさん、こんにちは

申し訳ありませんが、早とちりしてしまいました。 RefreshRates()を追加すると違いが出るようですが、まだ同じ問題があります。保留注文を 両方開くこともあれば、どちらかのみ、またはどちらも開かないこともあります。 注文が開かないとき、または両方が開くときにエラー130が発生しますが、実際に両方とも開くときはエラーが発生しません。また、私の入力が MODE_STOPLEVEL より下にあるペアでは、プログラムが私の入力を要求通りに調整しても、決して注文は開かず、常にエラー 130 が発生します。 私は値を印刷して、期待通りに調整されています。 そこで、なぜ私の OrderSend が実際に機能しないのかを考えようとしています。

EURUSDのようにstoplevelが5のペアでは、通常両方の注文を送りますが、常にではありません。 しかし、EURAUDのようにstoplevelが10のペアでは、決して注文を送りません。

extern int TrailingStart=20;
extern int TrailingStop=5;

extern int Hedge=10;
extern double Multiplier=3;

extern int StopLossOriginal=11;

extern int StopLossHedge=9;

extern double Percentage=1;
extern double Lotsize=0.01;
extern double MyMaxlots=30;

extern datetime StartTime1 = D'2016.03.25 16:50';

extern int Pipmove=5;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
//---
  {
   int TS=TrailingStart-TrailingStop;
   double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
   if(StopLossOriginal<stoplevel || StopLossHedge<stoplevel || TS<stoplevel)
     {
      MessageBox("Please note: Your inputs for StopLossOriginal, StopLossHedge and/or"+
                 "\nTrailingStop are below the minimum levels required by your broker,"+
                 "\nand have been increased automatically to "+StringConcatenate(stoplevel)+" Pips");
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int TS=TrailingStart-TrailingStop;
   Print("TS = ",TS);
   int sloss=StopLossOriginal-Pipmove;
   int stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
   Print("stoplevel = ",stoplevel);
     
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2),
          point=Point*10,
          Price=Pipmove*point,
          SL=(StopLossOriginal-Pipmove)*point,
          MinLots = MarketInfo(Symbol(),MODE_MINLOT),
          MaxLots = MarketInfo(Symbol(),MODE_MAXLOT),
          HedgeLots=NormalizeDouble(OrderLots()*Multiplier,2);
          
   if(sloss<=stoplevel) SL=stoplevel*point;
   Print("SL = ",SL);
   if(StopLossHedge<=stoplevel) StopLossHedge=stoplevel;
   Print("StopLossHedge = ",StopLossHedge);
   if(TS<=stoplevel) TrailingStart=(stoplevel+TrailingStop); 
   Print("TrailingStart = ",TrailingStart);     
          
   datetime time1=StartTime1-3300;      

   if(Lots>MaxLots) Lots=MaxLots;
   if(Lots<MinLots) Lots=MinLots;
   if(HedgeLots>MaxLots) HedgeLots=MaxLots;
   if(Lots>MaxLots || Lots<MinLots || HedgeLots>MaxLots)
     {
      MessageBox("Lotsize have been adjusted automatically");
     }

   int buy_ticket=0, sell_ticket=0, buystop_ticket=0, sellstop_ticket=0, total=0;
   for(int i= OrdersTotal()-1; i>= 0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()==Symbol())
        {
         total++;
         if(OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if(OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if(total==0 && Time[0]==time1)
     {
      buy_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,0,0,"Pending",magic,0,Lime);
      OrderModify(OrderTicket(),OrderOpenPrice(),Ask-SL,OrderTakeProfit(),Yellow);
      Print("Buystop = ",GetLastError());
      Sleep(1000);
      RefreshRates();
      Sleep(1000);
      sell_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,0,0,"Pending",magic,0,Red);
      OrderModify(OrderTicket(),OrderOpenPrice(),Bid+SL,OrderTakeProfit(),Yellow);
      Print("Sellstop = ",GetLastError());
     }

私はまたこのようにそれを試みたが、それは違いを生じない。

buy_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      RefreshRates();
sell_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);

そして、私がこれを行う場合でも、それは何の違いもありません。

if(total==0) // && (Time[0]==time1)
 

ありがとうございました。

 if(total==0)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      Print("buystop = ",GetLastError());
      RefreshRates();
     }
   if(total==1)
     {
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
      Print("sellstop = ",GetLastError());
     }

また、保留中の注文が 有効になる前のPipmoveレベルもstoplevelより高くなければならないことが分かりました。 これですべてがうまくいくようです... ありがとうございます。

 
Trader3000:

ありがとうございました。

また、保留中の注文が有効になる前のPipmoveレベルもstoplevelより高くなければならないことが分かりました。 これですべてがうまくいくようです... ありがとうございます。

いいえ、これもうまくいきません。なぜなら、1つの取引が開かれている限り、sell_stopを開き続けるからです。
 
簡単な答えは、現在の価格の すぐ近くで保留中の注文を開こうとしないことです。5 ポイントは通常半ピップです。
 
GumRai:
簡単な答えは、現在の価格に近いところで保留中の注文を開こうとしないことです。5 ポイントは通常半ピップです。

ご回答ありがとうございます。 私の計算はpips単位なので、保留中の注文は少なくとも50pips(現在の価格から 5pips)離れていますが、EURUSDでは50pipsの水準から少なくとも1pip離すと動作するようです。 チャートにドラッグすると、最初の取引を除いて両方の取引が開かれたように見えます。 でも、今はこれで大丈夫です 私のコードは今このようになります。

extern int TrailingStart=20;
extern int TrailingStop=5;
extern int Hedge=10;
extern double Multiplier=3;
extern int StopLossOriginal=11;
extern int StopLossHedge=9;
extern double Percentage=1;
extern double Lotsize=0.01;
extern double MyMaxlots=30;
extern datetime StartTime1 = D'2016.03.25 14:50';
extern int Pipmove=5;
int i,TS=TrailingStart-TrailingStop,stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; //stoplevel has been converted from points to pips (/10)

int start()
  {
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2),
          point=Point*10,
          Price=Pipmove*point,
          SL=StopLossOriginal*point,
          MinLots = MarketInfo(Symbol(),MODE_MINLOT),
          MaxLots = MarketInfo(Symbol(),MODE_MAXLOT),
          HedgeLots=NormalizeDouble(OrderLots()*Multiplier,2);

   if(StopLossHedge<stoplevel) StopLossHedge=stoplevel;
   if(TS<stoplevel) TrailingStart=(stoplevel+TrailingStop);
   if(Pipmove<stoplevel+1) Pipmove=stoplevel+1;
   if(StopLossOriginal<=StopLossHedge) StopLossOriginal=StopLossHedge+1;

   datetime time1=StartTime1-300;

   int buy_ticket=0,sell_ticket=0,buystop_ticket=0,sellstop_ticket=0,total=0;
   for(i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()==Symbol())
        {
         total++;
         if(OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if(OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if(total<1 && Time[0]==time1)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      RefreshRates();
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
     }

私は別の、しかし似たような問題にぶつかりました。 保留注文の一つがトリガーされると、二つのことが起こります。 TrailingStopがトリガーされ、その時点で他の保留注文が削除されるか、その取引が私に反対する場合、反対方向にヘッジを開くべきです。 私がどう書くかで、それは複数のヘッジを開くか全くヘッジしないかになります。 私は以下の二つを含むあらゆることを試してきました。

if(OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY)
     {
      if(Bid-OrderOpenPrice()>TrailingStart*point)
        {
         if(OrderStopLoss()<Bid-TrailingStop*point)
           {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*point,OrderTakeProfit(),Blue))
              {
               if(OrderSelect(sellstop_ticket,SELECT_BY_TICKET) && OrderType()==OP_SELLSTOP)
                 {
                  if(OrderDelete(sellstop_ticket,Orange))
                     return(0);
                 }
              }
           }
        }
      if(OrderOpenPrice()>Bid+Hedge*point && buy_ticket==1 && sell_ticket<=1)
            {
              sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Red);
            }  
        }
//Same for Sell

それとも


//Same up to here:
else if(total<=2 && OrderOpenPrice()>Bid+Hedge*point)
        {
         sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Red);
        }

このために別のforループを使うべきでしょうか? ありがとうございます。

 

みなさん、こんにちは

何週間も試していますが、まだ何も進展がありません。 今はすべて動いていますが、ある条件下でEAが元の取引の上に複数のヘッジ取引を開きます。 元の取引のSLは11 pipsで、ヘッジ取引のSLは9 pipsです。時々、元の取引がまだ開いている間に、ヘッジトレードが9ピップで停止されます。 その後、元の取引がまだ開いている間に、2番目のヘッジトレード、さらには3番目と4番目のヘッジトレードを開きます。 私は単にヘッジトレードの量を1つに制限し、それが停止した場合、元の取引がどうなるか待つだけでいいのです。

こんな感じの結果です。

576 2015.01.15 11:39 buy stop 29 0.48 1.16786 1.16616 0.00000 0.00 4834.24

577 2015.01.15 11:39 sell stop 30 0.48 、1.16642 1.16812 0.00000 0.00 4834.24

578 2015.01.15 11:39 売り 30 0.48 1.16642 1.16812 0.00000 0.00 4834.24

579 2015.01.15 11:39 delete 29 0.48 1.16786 1.16616 0.00000 0.00 4834.24

580 2015.01.15 11:42 買う 31 1.44 1.16743 1.16653 0.00000 0.00 4834.24

581 2015.01.15 11:42 s/l 31 1.44 1.16653 1.16653 0.00000 -129.60 4704.64

582 2015.01.15 11:44 買う 32 1.44 1.16742 1.16652 0.00000 0.00 4704.64

583 2015.01.15 11:44 s/l 30 0.48 1.16812 1.16812 0.00000 -81.60 4623.04

584 2015.01.15 11:48 modify 32 1.44 1.16742 1.16893 0.00000 0.00 4623.04

買い停止と売り停止の注文(29 と 30) は、あるべきように開かれる。 その後、価格が下がり、売り注文 (30) は満たされ、買い停止 (29) は削除される。 その後、価格が再び上がり、ヘッジ(マーチンゲール)注文 (31) はトリガーされる (3*lotsize)。その後、価格が再び下がり、ヘッジ (31) が停止されますが、30 がまだ開いているので、別のヘッジ (32) などがトリガーされます。 どのようにすれば、32 の注文がトリガーされるのを防ぐことができますか? ありがとうございます。


 

こんにちは、皆さん。 この問題を解決しようとしてから1ヶ月以上経ちますが、プログラム的にコーディングが不可能なのではないかと思い始めています。 そこで、どなたか確認していただければ、この問題を解決して次に進むことができます。 上記の投稿で説明したように、ヘッジ(マーチンゲール)注文の数に深いレベルを設定することはできないのでしょうか。 ありがとうございました。

今までのベストは

int start()
{
   int buy_ticket=0;
   int sell_ticket=0;
   int total=0;
   for(int i= OrdersTotal()-1; i>= 0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol())
     {
         total++;
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }
   /*if(total==1 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY) <------- this blocked out code is irrelevant, but I want to put it here for completeness
     {
      if(Bid-OrderOpenPrice()>TrailingStart*point)
        {
         if(OrderStopLoss()<Bid-TrailingStop*point)
           {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop *point,OrderTakeProfit(),Blue))
               return(0);
           }
        }*/
      else if(OrderOpenPrice()>Bid+Hedge*point)
        {
         sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Blue);
         return(0);
        }
     }
  }
 

これを実現するには、さまざまな方法があります。

ヘッジが開かれたとき、クライアントターミナルのグローバル変数を作成します。

この変数に、メイン・トレードのチケット番号を含む名前を付けます。

そのチケット番号のヘッジ取引が開始されたことを示すフラグとして機能する値、または必要に応じてヘッジカウントを与えます。

ヘッジを開く前にGVをチェック します。


ヘッジとメイン・トレードはロットサイズが異なります。

ヘッジを開始する前に、該当するロットサイズの反対注文が、メイン・トレードの開始時間より遅い OrderOpenTime() で開始されていないか、オープンオーダーと履歴をチェックします。

 
GumRai:

これを実現する方法はさまざまです。

ヘッジを開くときは、クライアント端末のGlobal Variableを作成します。

メイン・トレードのチケット番号を含む名前をつけます。

そのチケット番号のヘッジ取引が開始されたことを示すフラグとして機能する値、または必要に応じてヘッジ回数を指定します。

ヘッジを開く前にGVをチェックします。


ヘッジとメイン・トレードはロット・サイズが異なります。

ヘッジを開く前に、メイン・トレードのオープン時間よりも遅い OrderOpenTime()で、該当するロット・サイズの反対注文が開かれていないか、オープン・オーダーとヒストリーをチェックします。

これらのオプションを調べてお知らせします。
 

そこで、Global Variable を使ってこれを実現しようとしたのですが、このコードを追加してから、ヘッジトレードが全く開かれなくなりました。 問題は、EA が GlobalVariableCheck をしているが、まだ何も作成されていないので、続かないことだと思います。 しかし、正しいチケット番号を選択してプリントします。 たぶん、やり方が間違っていると思います。 以下は関連するコードです。

//+------------------------------------------------------------------+
//|  Hedge                                                           |
//+------------------------------------------------------------------+
void Hedgetrade(){
int buy_hedge=0,sell_hedge=0,total=0;
double Pip=Point*10,HedgeLots=NormalizeDouble(OrderLots()*Multiplier,2),SLHedge=StopLossHedge*Pip;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&& OrderSymbol()==Symbol()){
      total++;
      int ticket=OrderTicket();
      Print("ticket = ",ticket);
     }          
         if(OrderType()==OP_BUY){
            if(buy_hedge==0 && sell_hedge==0 && OrderOpenPrice()>Bid+Hedge*Pip)
               GlobalVariableCheck(ticket);
               sell_hedge=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+SLHedge,0,"Hedge",0,0,Blue);
                  GlobalVariableSet(ticket,1);
                 }
         if(OrderType()==OP_SELL){
            if(sell_hedge==0 && buy_hedge==0 && OrderOpenPrice()<Ask-Hedge*Pip)
               GlobalVariableCheck(ticket);
               buy_hedge=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-SLHedge,0,"Hedge",0,0,Red);
                  GlobalVariableSet(ticket,1);
              }
            }
          }