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

 
Valeriy Yastremskiy #:

コードを正しく挿入する、alt Sまたはアイコンで、ヒントコード。

なぜSaveTickの 配列が必要なのですか?

配列の2要素しか使っていない。関数内で宣言する場合は、グローバル変数やスタティック変数に置き換えてください。

2つの変数に配列を使用するのは賢明ではありません。

また、FindTick() 関数が呼ばれる前に配列を呼び出して いるようですが、ここでSaveTick 配列のサイズが設定されます。そして、アレイのオーバーランが発生しています。

ありがとうございます。了解です。
関数が正しくカウントされていないようなのですが、どのようなエラーか教えてください。


***
 
makssub #:

ありがとうございます。了解です。
関数が正しくカウントされていないようなのですが、どのようなエラーか教えてください。


コードを正しく挿入してください。回答ウィンドウの上部にある13番目のボックスです。

そして、その関数が何をするのか、一行ずつ言葉で書くことができるのです。

確かに、見た目は正しくないですね。

注文チケットにTickという 変数がどこでどのように代入 されているのかがわかりません。そして、次の条件に従ってマジックナンバーとオーダータイプをチェックする必要はありません
_magic < 0 || OrderMagicNumber() == _magic
もし、関数が0より小さいマジックナンバーで呼ばれるか、マジックナンバーが選択したオーダーの番号に等しければ、ポイントサイズを要求し、もしそれが0に等しければオーダーシンボルに空の値を探
します......。といった具合に。

あ、そうそう、オーダーセレクトはオーダーのデータ構造を埋めて保存するんだったね。そして、次に別のオーダー番号やチケットでオーダーセレクトした場合にのみ、この構造体のデータが変化します。

すなわち、OrderSend はオーダーデータ構造体を充填せず、オーダーチケットまたはマイナス 1 を返す。そして、注文構造はOrderSelectによってのみ記入される。そして、この構造体から、このオーダーのデータを得ることができる。

 
Valeriy Yastremskiy #:

コードを正しく挿入してください。回答ウィンドウの上部にある13番目のボックスです。

そして、その関数が何をするのか、一行ずつ言葉で書くことができるのです。

もちろん間違っているようです。

そして、Tickという 変数がどこでどのようにオーダーチケットに代入 されているのかが不明です。そして、次の条件に従ってマジックナンバーとオーダータイプをチェックする必要はありません
_magic < 0 || OrderMagicNumber() == _magic
もし、関数が0より小さいマジックナンバーで呼ばれるか、マジックナンバーが選択したオーダーの番号に等しければ、ポイントサイズを要求し、もしそれが0に等しければ、オーダーシンボルで空の値を探
します...。といった具合に。

あ、そうそう、オーダーセレクトはオーダーのデータ構造を埋めて保存するんだったね。そして、次に別のオーダー番号やチケットでオーダーセレクトした場合にのみ、この構造体のデータが変化します。

すなわち、OrderSend はオーダーデータ構造体を充填せず、オーダーチケットまたはマイナス 1 を返す。そして、注文構造はOrderSelectによってのみ記入される。そして、この構造体から、この注文のデータを得ることができるのです。

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番目のボックス)

 
makssub #:

最初の関数では,必要な注文のチケットを見つけ,2番目の関数では,このチケットの後に決済されたすべての注文の利益を計算する必要があります。それ以前のものの利益には興味はない。
PSはあなたのアドバイスを受けて、私は配列を拒否しました)
上から12番目の正方形)。

最初の関数は、チケットは番号で増える場合、最も大きい番号のチケットを見つけます)))ループの次の繰り返しで、次の番号のオーダーのチケットが前のオーダーのチケットと比較される。オーダーセレクトはオーダー構造体を満たし、オーダーチケットはこの構造体からチケット値を取得する。

各コードの行が何をするのか、自分で書くか読むか。

2番目の関数では、OrderSelectがオーダー構造体に同じチケットデータを記入します)

 
Valeriy Yastremskiy #:

最初の関数は、チケットは番号で増える場合、最も大きい番号のチケットを見つけます)))ループの次の繰り返しで、次の番号のオーダーのチケットが前のオーダーのチケットと比較される。オーダーセレクトはオーダー構造体を満たし、オーダーチケットはこの構造体からチケット値を取得する。

各コードの行が何をするのか、自分で書くか読むか。

2番目の関数では、OrderSelectがオーダー構造体に同じチケットデータを記入します)

スペルアウトしたが、この言語に関してはロジックが悪いようだ。最後にオープンした注文のチケットを決定する方法を教えてください。

それに続くすべてのクローズドオーダーの利益はどのように計算するのですか?

 
makssub #:

スペルアウトしましたが、この言語との関係でロジックが苦手なようです。最後にオープンした注文のチケットを決定する方法を教えてください。

それに続くすべてのクローズドオーダーの利益はどのように計算するのですか?

注文受付開始時まで。また、注文番号を使うべきではありません。あるいは、注文番号、チケット、注文の状態、開閉時間などをベースに保存しておく必要があります。

 if(OrderSelect(Ticket, SELECT_BY_TICKET)==true) // Если выбор рыночного ордера произошел успешно
        {
         if(OrderCloseTime()==0)              // Если наш рыночный ордер не закрыт           {
            
            //           Alert("Наш рыночный ордер жив, Модифицируем его если нужно ");
            if(Tral_Stop!=0 || Tral_Profit!=0)
          {     ModifyTral(); }
            return;
           }
         if(OrderCloseTime()!=0)              // Если наш рыночный ордер закрылся
         {
Alert("Our market order has closed. The Adviser's work is completed ",
                  " Swap = ", OrderSwap(), " Commission = ", OrderCommission(),"Profit/loss = ",OrderProfit());
         // ..... // получаем профит и считаем общий профит например
         }

そして、その理屈は最後まで覚えておいたほうがいい。それなら、もっと簡単です。必要なデータから始めた方が良いし、判断に必要なデータは十分にあるはずだ)

注文のオープンタイムがある(保留ではない)。彼らのチケットを持っています。各成行注文の建値、SL、TPを設定しています。そして、注文の締め切りの時期があります。そして、注文終了後、Profitの欄が埋められる。

これは、これらのフィールドからロジックを作成するために必要なデータです。

最後のオープンオーダーに続くクローズドオーダー」という文言が全く定義されていない。番号順、チケット順、時間順で行けるそうです。

 
Valeriy Yastremskiy #:

注文受付開始時間まで最大であること)

正しく書かれていますが、コードが少し複雑に見えます )))))

私なら、あなたの言うとおりにします。

int GetTicketLastOpenOrder()
{
   int ticket = -1;
   datetime t = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderType() <= OP_SELL && OrderOpenTime() > t)
      {
         ticket = OrderTicket();
         t = OrderOpenTime();
      }
   }
   return(ticket);
}


ZS: チケット番号によるOrderSelect()は、単純な未決済注文による検索よりもはるかに長い実行時間を必要とします。

 
Igor Makanu #:

正しく書かれていますが、コードが少し複雑です ))))

好きなように書けばいいんだよ。


S : チケット番号によるOrderSelect()は、単純な未決済注文の列挙よりも実行時間が大幅に長くなります。

Igorさん、ありがとうございます。ただ、本質を理解していない場合、何かの正しいコードでは本質が伝わらないので、複雑でないアルゴリズムを言葉にしてもらうようにしています)))

 
Valeriy Yastremskiy #:

注文受付開始時間まで一番大きいはずです)また、注文番号順でないだけで、発券も参考にならないことが多いです。また、注文番号、チケット、注文状況、開店/閉店時間をデータベースに記憶させることもできます。

そして、その理屈は最後まで覚えておいたほうがいい。それなら、もっと簡単です。必要なデータから始めた方が良いし、判断に必要なデータは十分にあるはずだ)

注文のオープンタイムがある(保留ではない)。彼らのチケットを持っています。各成行注文の建値、SL、TPを設定しています。そして、注文の締め切りの時期があります。そして、注文終了後、Profitの欄が埋められる。

これは、これらのフィールドからロジックを作成するために必要なデータです。

最後のオープンオーダーに続くクローズドオーダー」という文言が全く定義されていない。番号順、チケット順、時間順で行けるそうです。

ご返信ありがとうございました。
正しいティックを見つける関数を書きました。
選択した関数の希望する注文ティック以降のすべての決済された注文の利益をカウントする関数を書きました。あとは、お勧めの方法に従って修正し、時間によるチェックなどを追加するだけです。

tpl = NormalizeDouble(Bid - ProfitLock*Point, Digits);
            ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, "",Magic, 0, Red);


double CalculateProfitHistory()
{
double order=0,op=0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
      if(OrderSelect(Tick,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
         {
            
            
            op += OrderProfit();
            order +=op;
            cnt++;
            
         }
      }
      }
   return(order);
  }

ただ、今、混乱しているのは、それが正しく計算されないことです。テストの結果、TPが0.02と出た場合、Commentに0.1300と計算し、書き込んでいます。どこが悪いか教えてください。

 
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.09.02
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...