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

 
Natashe4ka:
注文は一連で決済されますが、決済条件がない場合は、1日、2日など、注文が回収されます。

もし、系列が実質的に1周間、例えば1バーの寿命の 間に閉じられたなら、閉じられた時間+1バーで系列の基準を取ることができます。つまり、それ以下の時間帯の注文は全て破棄されます。

ただし、これはテスターでしか動作しないため、手動で 操作すると利益計算が正しく行われない(EAの利益のみが考慮され、手動での取引は考慮されない)ことが懸念されます。

 
Vitalie Postolache:
もし、系列が実質的に1周間、例えば1バーの存続 期間中に閉じられた場合、閉じられた時間に1バーを加えた時間を系列の基準とすることができる。つまり、終了時刻がそれ以下の注文はすべて破棄されるはずである。

すなわち

if ((op<0||OrderType()==op) && (t==OrderCloseTime() ||  t==OrderCloseTime()+60)) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}

(t==OrderCloseTime()||t==OrderCloseTime()+60)?

 
Natashe4ka:

すなわち

if ((op<0||OrderType()==op) && t==OrderCloseTime()+60) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}

+60 ?

PeriodSeconds() の方がより正しいでしょう。それとも、M1だけで仕事をするのですか?

こんな感じ。

double lastloss()
{
double lastlos=0.0,op=0.0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
         {
            if(cnt==0) time=OrderCloseTime();
            op=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()+PeriodSeconds()<time && op>0.0) break;
            lastlos+=op;
            if(cnt!=0) cnt++;
         }
      }
}
return(lastlos);
}
 
Vitalie Postolache:

こんな感じ。

これは、前の値に新しい値を追加するものです。しかし、新たにクローズするごとに、利益の値も新しくなる。
 

また、コメントを上書きしないDCのために、コメントに注文の番号をつけることができます。そして、試しにコメントから数字を出してみると、その数字が順番通りでない時点で、そのシリーズは終了となります。

例:受注シリーズ番号1,2,3,4,5。5,4,3,2,1の順で閉じる - ループは1を見て割り込みます。1,2,3,4,5と1(前のシリーズのオーダー番号)の順に閉じる - ループは差分5-1>1を見て、アボートする。これをどのようにコードに変換するか考えないといけない ))))

 
Natashe4ka:
つまり、前の値に新しい値が追加されるわけです。そして、新たにクローズするごとに、新たな利益の価値が生まれる。
なんだか、腑に落ちないんです。
 
Vitalie Postolache:
なんだか、腑に落ちないんです。

情報をつけてみると、それが加算されていくのがわかる。

color ProfitColor;

   if(lastloss()<0) ProfitColor=Red;
   if(lastloss()>0) ProfitColor=LimeGreen;
   if(lastloss()==0)ProfitColor=DarkGray;
   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(lastloss(),2)),10,"Arial",ProfitColor);
 
Natashe4ka:

情報を入れれば、すぐに何が加算されるかがわかります。

うーん、確かにそうですね...。考え続けよう ))))
 
テスターでのテストとのことですが...。
 
Vitalie Postolache:
うーん、確かにそうですね...。考え続けよう ))))

また、当然のようにカウントされていると思いました。
この情報をコードに書き込まなければ、もっと簡単に生活できたはずです))

そして今、どうしてこの機能が今までちゃんと動かなかったのか、不可解でなりません!!!!