クローズドオーダーの利益計算 "HELP" - ページ 7

 
Sergey Gritsay:
そして、それはどこに存在するのでしょうか? 変数や配列のどこかに書いているのでしょうか? まずどこに保存しているのかを見せてください、そうすれば次に何をすればいいのかがわかります。
どこにもない。すべて有能に作成し、利益データを収集する必要があります。
 
Natashe4ka:

なるほど、では分解してみると、注文の締切時間があり、締切時間と一致するチケットや注文数がある、ということですね。これらの注文を どのように組み合わせ、利益を計算 するのでしょうか?
簡単なようで、やっぱりわからない。

今のところ、どれが赤くハイライトされているのか、誰もわからない。これらの注文を見つけるには、正確な基準が必要です。ですから、よく言われるように、指で、絵で、などの説明を心がけてください。
 
Sergey Gritsay:
今のところ、どれが赤くハイライトされているのか、誰もわからない。これらの注文を見つけるには、正確な基準が必要です。だから、指で言うように、絵などを使って説明してみてください。

?

なぜ、誰も これを理解できないのか、おそらく自分のことだろう。

もうずっと前から、すべてがクリアになっている。

マダムは、プログラムの詳細を誇示することなく、自分一人でやりたいだけなのです。

 
Sergey Gritsay:
今のところ、どれが赤くハイライトされているのか、誰も理解できていない。このような注文を見つけるためには、正確な基準が必要です。このため、指で言うように、絵などを使って説明するようにします。

はい、すでに100%動作する状態を示し、レディメイドのコードとして添付しています。また、このコードでは端末の再起動に影響されない方法を採用しており、端末の電源を入れたときに何も失われず、そのまま動作し続けることにも注意が必要です。しかし、ここではテスターでしか使えないホイールを発明しています。

Sergey、また、オリジナルのTSコードでは、5つのポジションのシリーズを閉じるときに、閉じる途中の注文も削除され、これは順番に実際の取引では何も良いことにつながらないことに注意してください。一般的には、TS以外は全てクリアしています。

 
ナターリアが何を得たいのかがわかった気がする
//+------------------------------------------------------------------+
//|                                                   Natashe4ka.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   color ProfitColor=0;

// START //
   LastProfitCL_1(Profit,TimeCurrent(),-1);
  
   if(Profit<0)ProfitColor=clrRed;
   else if(Profit>0)ProfitColor=clrLimeGreen;
   else ProfitColor=clrDarkGray;
  
   ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
   ObjectSet("Last Profit",OBJPROP_CORNER,1);
   ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
   ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //

  }
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();

   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderCloseTime()!=timecurent)continue;
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Вариант 2                                                               |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
     {
      timecurents=OrderCloseTime();
     }
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderCloseTime()<timecurents)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
....
 

関数の2番目のバージョンを修正

bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                    datetime timecurent,// текущее время
                    int op=-1//"op" позиция (-1 любая позиция)                
                    )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()!=op && op!=-1)continue;  
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
      if(OrderCloseTime()<timecurents)continue;

      profit+=OrderProfit()+OrderCommission()+OrderSwap();
      cnt++;
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }

..........

 
Sergey Gritsay:

関数の2番目のバージョンを修正

よろしくお願いします。
Variant 1 は正常に動作しません
Variant 2 は正常に動作します。
私のバリアントも正常に動作しますが、注文を別の日以上に持ち越すと、値が4.27になるはずなのに、Profit 190がクリアされません。

スクリーンショット#3https://www.mql5.com/ru/forum/162930/page3 をご覧ください。

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
  datetime t=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
       if (t<OrderCloseTime()) {t=OrderCloseTime();}
       if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 
結論から言うと、問題は注文数ではなく、注文を別の日以上に振り替えることである。
 
Natashe4ka:
結論から言うと、問題は注文数ではなく、注文を別の日以上に振り替えることである。
直列で閉じるのか、何なのか?すべての注文を1サイクルでクローズした場合の転送はどうなりますか?
 
Vitalie Postolache:
では、シリーズで閉じるのか、それとも何なのか?1サイクルですべてのオーダーをクローズした場合のキャリーオーバーはどうなりますか?

注文はシリーズごとにクローズされますが、クローズする条件がない場合は、1日、2日など、注文が集まります。
ただし、受注件数も利益額に影響する。
注文が3つ以上ある場合は、最後に決済された注文に対してのみ値が計算されます。