初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 250

 

すぐに確認できるような簡単なものであれば、こんな感じです。

   double profit = 0;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if(OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                  if(profit>max)
                    { 
                    cnt=OrdersTicket();
                    break;
                    }                  
                 }
              }
           }
        }
     }

通常、注文は時間的に互いに続きますが、これは保証されたものではありません。そのため、年表を確認する必要があります。でも、実験用にはこれで十分です。

 
Aleksei Stepanenko #:

すぐに確認できるような簡単なものであれば、こんな感じです。

通常、注文は時間的に互いに続きますが、これは保証されたものではありません。そのため、年表を確認する必要があります。でも、これなら実験に使えます。

そうですね、タイミングが保証されていない。 だからこそ、チケットでクローズドオーダーを全部調べたいんです。オーダーチケットを知っていて、そこから数えようとしているのですが、何かが間違っているようです)正しい方法は何でしょうか?

 
Aleksei Stepanenko #:

すぐに確認できるような簡単なものであれば、こんな感じです。

通常、注文は時間的に互いに続きますが、これは保証されたものではありません。そのため、年表を確認する必要があります。でも、これなら実験に使えます。

履歴に目を通すと、成行注文は大きいものから順に考えるので、再計算の瞬間に閉じるであろう注文は、小さいものから大きいものへと目を通した方が、同じティックで開いたもの、閉じたものを正しく考慮できるのではないでしょうか。だと思う)

Aleksei Stepanenko(アレクセイ ステパネンコ #:

すぐに確認できる簡単なものであれば、このようなものです。

経験則上、オーダーは時間的に互いに追随しますが、これを保証するものではありません。したがって、良い意味で、年表を確認する必要があります。でも、実験には使えるでしょう。

Alexeyのコードも正しく表示されないのでしょうか?

 
Valeriy Yastremskiy #:

履歴では、再計算時にクローズする注文を考慮し、成行注文は同じティックでオープンとクローズを正しく考慮するため、少ないものから多いものへとカウントするのがよいでしょう。だと思う)

Alexeyのコードも計算がおかしいのでしょうか?

試していません。これから試してみます。お知らせします。

 
Aleksei Stepanenko #:

すぐに確認できるような簡単なものであれば、こんな感じです。

通常、注文は時間的に互いに続きますが、これは保証されたものではありません。そのため、年表を確認する必要があります。でも、実験には使えるでしょう。

確認したところ、コンパイル時に多くのエラーが発生したため、.NETを除き、すべて修正しました。

if(profit>max)

このセリフ、よくわからないんです。説明できますか?

 
makssub #:
一定の利益が出た後にチケットを変更するというものです

最大値は、チケットが変更された後の利益の限界値です。値は自分で設定します。

 
Aleksei Stepanenko #:

最大値は、チケットが変更された後の利益の限界値です。その値は、あなたが設定します。

私の理解が正しければ、問題は別にあるのです。1次、2次、3次があります。建値がどのように形成されているのかわからない。注文3が終了すると、合計の利益は注文3の利益と同じになる。つまり、注文3より前にオープンした注文のチケットを計算する必要があるのです。そうすると、オーダー2はクローズドになります。注文2の前に開かれた注文のチケットを見つける必要があります。合計の利益は、注文2と3の利益と同じになります。

理由は分かりませんが、理屈はそうなっているようです)。

 
ヴァレリー この2つの文章の論理がよくわからないのですが。
 
Aleksei Stepanenko #:
ヴァレリー あの2つの文章は、ロジックがよくわからなかったんです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者からのFAQ MQL4 MT4 MetaTrader 4

マックサブ さん 2021.09.01 16:38

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   
   
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return(tick); 
   }              
int TickF = FindTicket();
int CalculateProfitHistory() 
{
  double _point;
  int    i, _ototal = OrdersHistoryTotal(), _profit=0;
  for   (i = 0; i < OrdersHistoryTotal(); i++) 
  {
    if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
      if (OrderSymbol() == Symbol())
      {
        if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0) 
           {
              if (StringFind(OrderSymbol(), "") < 0) 
                 _point = 0.0001; 
              else _point = 0.01;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
  return(_profit);
}

最初の関数で必要なオーダーチケットを見つけ、2番目の関数でそのチケットに続くすべてのクローズドオーダーの利益を計算する必要があります。それ以前のものの利益には興味がない。しかし、2つ目は正しく計算されない。注文が開始されると、これら2つの関数が呼び出されるため、0になるはずですが、そうではありません。
PS あなたのアドバイスで、配列をあきらめました)
上の12番目のボックス)


 

皆さんのヒントをもとに、すべてを考え、自分なりに工夫しました)

負けた注文を他の注文でカバーし、利益を得るという仕事である。

実施しました。負けた後に開いた注文のチケットを 記憶しておき、それを報告地点とした。この時点から、損切りした注文の利益と、それ以降の決済した注文の利益の計算を開始します。最初の注文はオープンで、利益になった時点でクローズすることを忘れないようにしましょう。

if ( (CalculateProfitHistory() + FirstProfit() >= プロフィット)

{

CloseFirst()。

プリント(「最初の負け注文を閉じる」)。

}


double CalculateProfitHistory() 
{
   double profit = 0;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderMagicNumber() == Magic )
               {
                  if (Ticket !=0)
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return(profit);
}