[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 237

 

こんにちは。

次のような状況(テスターが最初にエラーチケット15を出したが、その後やはりこの注文を閉じてしまった)に関連する可能性があることを教えてください。もっと注意したほうがいいのでしょうか?

よろしくお願いします。

 
nemo811:

もっと注意したほうがいいのかな?


もちろん、エラーは出ないはずです。
 

よろしくお願いします。

ここにエラーはありませんか?(最後の成行売り注文のチケットを返します。)

int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=0;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }

よろしくお願いします。

 
int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=-1;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell && OrdTicketSell>=0) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }
 

こんにちは。

面白いのは、mql4では{ int var; }ブロックの最後にある変数は破壊されないので、ループの中で変数を宣言するのが正しいのかどうかという疑問です。

for(int i = 0; i < 500; i ++)

{

int var; // 繰り返しの間、変数はどうなるのか?

}

ありがとうございます。

 
sergeev:

いや~、まだ正鵠を射ていないようだ。同じエラーが忍び寄っている。

最後にもう一つ、それに関連すると思われるコードが残っています。

     int SchSell=SchSell_b(MAGIC);
     int OrdTicketSell=OrdTicketSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }

最も興味深いのは、以前は指値注文であったが、その後トリガーされて成行注文になった注文を決済しようとすると、エラーが発生することである。もともと成行注文であったものを決済した場合は、エラーになりません。

 

間違いを見つけた、出口はここだ。

     int SchSell=SchSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       int OrdTicketSell=OrdTicketSell_b(MAGIC);
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }
 
nemo811:

ミスを発見、ここで解決。


くだらない質問をしていいですか?ある種の奇妙な正常化

OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);

なぜ、そのようにするのかがわからない。

 
Vinin:


くだらない質問をしていいですか?不思議な正規化

なぜこのようなことをするのか、私には理解できません。

これはロットが0.03の場合であり、許容される最小値は0.01である。0.03を2で割ると0.015となり、私の理解する限り、これは受け入れがたいものです。ですから、私はそのような正規化を行いました。

厳しく判断しないでください - 私は学んでいるだけです )) 。でも、もし間違いだったら......訂正してください。

 
artmedia70:
やり始めれば、私たちも協力します。これでは「やってくれ」と言われているようにしか見えない。必要なものはほとんど入っていますよ。あとは、ループ内の注文にテイクポイントとストップポイントを設定するだけです。

というように、注文が開始されます。

                ticketSell = OpenPendingOrderSell(1, Lots, SellLimit, slip, SellLimit, 0, 0, EAName + "-" + NumOfTradesSell, MagicNumber, 0, HotPink);
                if (ticketSell < 0)
                {
                        Print("Error: ", GetLastError());
                        return (0);
                }

こんな感じでロスレスで計算するスクリプトにしたい。

もし

if (totalBuy > 1)
{ то ордерам ticketBuy присвоить цену без убытка + TakeProfitBuy, при достижении этой цены или ниже, закрыть ордера}

я думаю, что можно что то в роде такого сделать:

if (totalBuy > 1 && (без убыток + TakeProfitBuy) >= Bid)
{
CloseAllBuy();
}

もし

if (totalSell > 1 && (без убыток + TakeProfitSell) <= Ask)
{
CloseAllSell();
}

もし

if (totalSell > 1 && totalBuy > 1 && (без убыток + TakeProfitSell) >= Ask)
{
CloseAllBuy();
CloseAllSell();
}

この損切りしないライン定義コードをEAに正しく挿入する方法。

int start()
{
   int b,s;
   double price,price_b,price_s,lot,lot_s,lot_b,SLb,SLs;
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  if (OrderSymbol()==Symbol())
         {
            price = OrderOpenPrice();
            lot   = OrderLots();
            if (OrderType()==OP_BUY ) 
               {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot;}
            if (OrderType()==OP_SELL) 
               {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot;}
   }  }  }
   ObjectDelete("SLb");
   if (b!=0) 
   {  SLb = price_b/lot_b;
      ObjectCreate("SLb",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
      ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLb",OBJPROP_COLOR, Navy);
   }
   ObjectDelete("SLs");
   if (s!=0) 
   {  SLs = price_s/lot_s;
      ObjectCreate("SLs",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
      ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLs",OBJPROP_COLOR, Maroon);
   }
}