どのデザインが正しいのでしょうか? - ページ 3

 
Techno:
PapaYozh いずれもクローズのみですが、モディファイについてはいかがでしょうか。クローズと修正のために2つの異なるループを持つよりも、完全な処理のために2つのティックを持つ方が良いですか?


もし何かが閉じられ、何かが修正されなければならないのなら、for (i=0; i<OrderTotals(); i++)という構造はすべて不正確です。

OrdersTotal()-1を0にする必要があります。

for ( i=OrderTotals()-1; i>=0; i-- )
{ 




 

つまり、このデザインでいいのでしょうか?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}
 

しかし、やはり正常化は理解できない。

価格を計算すれば、端末の桁まで持っていかなければならないことは明らかなのですが、それは一つです。

しかし、この場合、フローから得られた現在値で 決済しているので、当然ながらDigitsより長くなることはあり得ません。

 
valenok2003:

しかし、ここではフローから導き出された現在値で決済しており、当然ながらDigitsより長くなることはありえない。

これは、正規化されていない見積もりを持つテスターの場合です。
 
valenok2003:

しかし、やはり正常化は理解できない。

価格を計算すれば、端末の桁まで持っていかなければならないことは明らかなのですが、それは一つです。

しかし、この場合、フローから得られた現在値で決済しているので、当然ながらDigitsより長くなることはあり得ません。

桁数が4の 場合、Bidが1.32343545654になることがあります。滅多にないことだが、そういうこともある。
 
Techno:
Digits=4 の時、Bid が 1.32343545654 になることがありますが、この現象が発生します。滅多にないことだが、そういうこともある。


生きて、学ぶ。ありがとうございます。
 
valenok2003:

つまり、このデザインでいいのでしょうか?


そうではありません。楽器の「記号」に対するチェックはありません。複数の商品で注文を出す場合、一方の商品の注文を他方の商品の価格で決済するリスクがあります。EAが移動したチャートのシンボルの注文を決済する必要がある場合は、チャートの「シンボル」を使用する必要があります。 EAが移動したチャートに関わらず、すべての注文を決済する必要がある場合は、注文の「シンボル」を読み取り、該当する「シンボル」のアスクとビッドの使用を要求する必要があります。そして、コードには不要な動作があります。

頑張ってください。

 
valenok2003:

つまり、このデザインでいいのでしょうか?

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, Red);
            Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);            
         }
      }
   }
}
こんな感じでやってください。
 
VladislavVG:


はい、そしてコードに余分なアクションがあります。

このような意味であれば
int Total = OrdersTotal();

の場合、コードの透明性を高めるために、ここに余分な変数があります。

それとも、何か別の話をしているのでしょうか?

 
Techno:
Digits=4でBidが1.32343545654になることもある。滅多にないことだが、そういうこともある。

ただし、close.mq4 スクリプトの例(MT4標準配信)では、正規化は行われない。

   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      cmd=OrderType();
      //---- first order is buy or sell
      if(cmd==OP_BUY || cmd==OP_SELL)
        {
         while(true)
           {
            if(cmd==OP_BUY) price=Bid;
            else            price=Ask;
            result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else error=0;
            if(error==135) RefreshRates();
            else break;
           }
        }
     }