反対注文を開く - ページ 2

 

4桁/5桁のBrokerのSlippageを調整するためにこれを行うことはできません、それはちょうど意味をなさない。

4桁のBrokerの場合、SlippageはPipsなので、Slippage = 3は3 Pipsを意味し、5桁のBrokerの場合、Slippageはポイントなので、Slippage = 3は3ポイントまたは0.3 Pipsを意味します。したがって、5桁のブローカーの場合、スリッページの数字を10倍して、30 ... 30ポイント=3ピップを与える必要があります。

だから、このコードは間違っている......

int init()
   {
   if (Digits ==3 || Digits ==5) pt = 10 * Point;
   else pt = Point;
   Slippage = Slippage * pt;    
   }
 

OpenOppositeOrder()関数を 修正したものを試してみてください ... ...

void OpenOppositeOrder() 
   {
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  // only continue if the OrderSelect() worked
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
RaptorUK:

OpenOppositeOrder()関数を修正したものを試してみてください ... ...


RaptorUkさん、こんにちは。

すべての前に、これまで提供されたヘルプに感謝します。これでEAが動き出しました。私は、注文が利益を持っている場合、すべてを閉じる方法について他の修正を行っており、それはOKですが、すでにあなたが見たように、この戦略の仕事のために予測することは、利益に到達した順序は、以前の注文を補償するためにロットサイズを増加させる必要があります。 それを念頭に置いて私はそれを行うためのコードを導入しました。 だから私はここで混乱して対処しています。最後の注文が利益を出したかどうかを確認する必要があり、次の注文のロットサイズを調整する方法でOrderProfit()を使いたいのですが、その情報を得るためには前の注文を閉じる必要がないのでしょうか?

ここにあるのは、反対側の注文を出すためのコードで、うまくいっています(ありがとうございます)。私はそれを得るために正しい方法であるのでしょうか?

ありがとうございます。

ルイス

 void OpenOppositeOrder() 
 {
// LastOrder Loss Compensation 
   int Orders;
   Orders= OrdersTotal();
   if (Orders>0)
   {  
    for(i=0;i<Orders;i++)
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()== MagicNumber)
   {
    lastprofit = OrderProfit();
    lastlot = OrderLots();
   }
  }
 }
  mlots=0;
  if (lastprofit<0)mlots=NormalizeDouble(lastlot*Multiplier,Digits);
  else mlots=LotSize;
 
//+------------------------------------------------------------------+ 
//Open Opposite Order 
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {  
               if(Martingale)ilots=mlots;else ilots=LotSize; 
               Ticket = OrderSend(Symbol(), OP_SELL, ilots, Bid, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               { 
               if(Martingale)ilots=mlots;else ilots=LotSize;
               Ticket = OrderSend(Symbol(), OP_BUY, ilots, Ask, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
luisneves:


こんにちは、RaptorUk。

まず、これまでのご協力に感謝します。さて、EAが動き出しました。しかし、このストラテジーは、利益を出した注文はロットを大きくして、前の注文の分を補う必要があります。 そのことを念頭に置いて、そのためのコードを導入しました。最後の注文が利益を出したかどうかを確認する必要があり、次の注文のロットサイズを調整する方法でOrderProfit()を使いたいのですが、その情報を得るためには前の注文を閉じる必要がないのでしょうか?

ここにあるのは、反対側の注文を出すためのコードで、うまくいっています(ありがとうございます)。私はそれを得るために正しい方法であるか。

私は、これはあなたに問題を引き起こすつもりであることを疑う... ...

mlots = NormalizeDouble(lastlot * Multiplier, Digits);

例えば、結果は1.12316734 ロットだった場合、5桁のパー上のあなたのNormalizeDouble()は1.12316に 変更され、これはロットステップの要件に 準拠しません. ....修正したロットサイズをロットステップの倍数にするために、何らかの数学を使用 する必要があります MarketInfo(Symbol(),MODE_LOTSTEP)

 
RaptorUK:

私は、これが問題を引き起こすと思います。

例えば、結果が1.12316734 ロットだった場合、5桁のパーでNormalizeDouble()を使用すると、1.12316に 変更され、これはロットステップ要件に 適合しません ....... 修正したロットサイズをロットステップの倍数にするために、いくつかの数学を使用 する必要があります MarketInfo(Symbol(),MODE_LOTSTEP)


RaptorUKさん、こんにちは。

私のロットサイズをロットステップの倍数に維持するために探すようにあなたの助言に関して、私は主題について自分自身を文書化するために探しています。

今、私は別の問題(より多くの1...)を持っています。

現在の価格の上下に注文を出すために、Eaが動き出したら、そのラインと価格を比較するラインを使いたいのです。

最初の問題は、価格差のあるラインをどのように比較するかということです。

以下は、私がこれまでに作成したコードです。ここで、私はpricelineの後にiHighを出すと、それはちょうど動作しないので、私は比較するために名前を与えることができます。

これらの問題で任意の手がかりをfo事前にありがとうございました。

ルイス

priceline=iHigh(Symbol(),0,0);
 ObjectCreate("highline",OBJ_HLINE,0,0,Bid); 
 ObjectSet("highline",OBJPROP_COLOR,LimeGreen);
 ObjectSet("highline",OBJPROP_WIDTH,1);
 WindowRedraw();

これはちょうど全く動作しないようです(...)

if(Bid > priceline+Distance*pt)                      
                {       
// Open buy order

                            while(IsTradeContextBusy()) Sleep(10);
                                 RefreshRates();        
                       
             Ticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
             if(Ticket>0)AddLimitsBuy();
            }

私はここにオブジェクトの削除を置きました、私はすべての注文の終了時に行を削除する必要があるためです。

void CloseAll()
      {
         int i,Op,Error;
         int Total=OrdersTotal();
     
         if(Total>0)
         {
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         else
         {
         ObjectDelete("highline");
         }
        }
       }
      }
 
luisneves:

これだけでは、全く効果がないようです(...)

私はここにオブジェクトの削除を置きました、私はすべての注文の終了時に行を削除する必要があるためです。

オブジェクト名とオブジェクトプロパティインデックスOBJPROP_TIME 1を指定してObjectGet() を使用すると、ラインが置かれている価格が返されます。

私はObjectsDeleteAll()の使用は特に嫌いです、怠慢で危険だと思います。

 
RaptorUK:

オブジェクト名とオブジェクトプロパティのインデックスOBJPROP_TIME 1を指定してObjectGet() を使用すると、ラインが置かれている価格が返されます。

ObjectDelete()の呼び出しは、私には問題ないように見えます。


こんにちは、RaptorUKです。

私は、1つの注文が利益でクローズした場合、すべての注文をクローズしようとしていますが、クローズする命令がCloseAll()関数に含まれているにもかかわらず、それが起こったとき、保留中の注文はまだ開いています。この問題に関して何か手がかりはありますか?

あなたが提供する任意の助けを事前にありがとうございました

ルイス

int GoToClose()
 {
  int pos;  
 {
  for(int Profit=OrdersTotal()-1;pos>=0;pos--)
  if(OrderSelect(Profit,SELECT_BY_POS)
  && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()
  && OrderProfit()+OrderSwap()+OrderCommission()>0||OrdersTotal()> MaxOrders)CloseAll();  
 }
}
//+---------------------------------------------------------------------------+  
      void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }             
 
luisneves:


こんにちは、RaptorUK。

私は、1つの注文が利益でクローズした場合、すべての注文をクローズしようとしていますが、クローズする命令がCloseAll()関数に含まれているにもかかわらず、それが起こったとき、保留中の注文はまだ開いています。この問題に関して何か手がかりはありますか?

あなたは、式がどのように動作するかを理解する必要があります ... あなたはこれを行うことはできません ...

if(Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)

というのは、これと似たような状況ですが、まったく同じというわけではありません: https://www.mql5.com/en/forum/141790


の結果は何ですか?

WhatValue = (5  || 4  ||  3  ||  2 );

||は ブール演算子なので、ブールに対してのみ動作します ... ...


この結果は、boolの結果値です。

( Op == OP_SELLSTOP )

. .もしあなたが値に対してビット演算 子を使いたいなら、これを使うことができます ... ...

int WhatValue = (5  | 4  |  3  |  2 );

しかし、それはあなたがやろうとしていることではありません。

 
RaptorUK:

式の仕組みを理解する必要がある ...... これをすることはできない ......

というのは、これと似たような状況ですが、まったく同じではありません: https://www.mql5.com/en/forum/141790


の結果は何ですか... .

||は ブール演算子なので、ブール値に対してのみ動作します .


この結果はboolの結果値である ... ...

. .もしあなたが値に対してビット演算 子を使いたいなら、これを使うことができます ... ...

しかし、それはあなたがやろうとしていることではありません。


RaptorUKさん、こんにちは。

なるほど、でもそれを踏まえてコードを修正したら、保留中の注文がまだ残っているんだ...。

void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         if(Op==OP_BUYSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }        
 
luisneves:


こんにちは、RaptorUKです。

なるほど、でもそれを踏まえてコードを修正したところ、保留中の注文はまだ残っていますね...。

MagicNumberと 異なるマジックナンバーを持つ場合、EAが実行されているシンボル以外のシンボルの場合、OP_SELLLIMITまたはOP_BUYLIMITの場合などが考えられます。.また、OrderDelete() と OrderClose() 呼び出しからの戻り値を確認する必要があります ... ...

なぜRefreshRates()を呼び出す必要があるのですか? それを取り除くという意味ではなく、なぜあなたがRefreshRates()を呼び出しているのかを説明してくださいませんか?


関数の戻り値とは何ですか?どのようにそれらを使用するのですか?