クローズドオーダーの利益計算 "HELP"

 

クローズした注文の利益は正しく考慮されますが、クローズ後に前のものに値が追加されます (5; 5+5=10; 10+5=15)
一連のクローズした利益を、前のもの (5; 5; 5) の代わりに新しいものにするにはどうすればいいですか。
一連のクローズドオーダーの中で、買い注文と売り注文、または買い注文のみと売り注文のみが存在することが
ある。

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==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(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
       if (op<0 || OrderType()==op) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 

決済された注文をシリーズに分ける条件を追加する必要がある

アルゴリズムや分割原理を教えてください

 
Natashe4ka:   ... クローズド・オーダーの利益...は、前の値に値を追加します(5;5+5=10;10+5=15)。

シリーズの各閉じた利益を前の利益ではなく、新しい利益にする方法 (5; 5; 5) ?・・・・・・。

算術和算の代わりに、スペースまたはセミコロンとスペース、どちらか好きなほうで文字列を追加する必要があります
 
STARIJ:
算術和算の代わりに、スペースまたはセミコロンとスペース、どちらか好きなほうで文字列に追加します

良いアイデアですね。

あるいは、配列に入れることもできる。

 
Natashe4ka:

クローズした注文の利益は正しく考慮されますが、クローズ後に前のものに値が追加されます (5; 5+5=10; 10+5=15)
一連のクローズした利益を、前のもの (5; 5; 5) の代わりに新しいものにするにはどうすればいいですか。
一連のクローズドオーダーの中で、買い注文と売り注文、または買い注文のみと売り注文のみが存在することが
ある。

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==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(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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()) continue;
       if (OrderMagicNumber()!= magic) continue;        
       if (OrderType()!= op) continue;
       if (op<0 || OrderType()==op) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
グローバル変数を入力し、そこに現在の利益を書き込むことができます。 注文を閉じた後、前の金額を引くと、残ったものが利益になり、それを記憶します。
 

複雑ですね、もっとシンプルなものはないのでしょうか?
あと、脳みそ沸騰してるから例を挙げてくれない?

 
Natashe4ka:
これはちょっと複雑ですね。もっとシンプルなものはないのでしょうか?

いや、もっと簡単にはいかないだろう。前回LastProfitCL 関数を使用した際にカウントされた注文も含め、常に全ての注文をカウントします。そして、注文がどんどん増えていくので、利益の額も増えていく。

新しい注文が完了したときに、そのループが途切れるような条件を考えなければならない。

 
Vitalie Postolache:

新しい注文がなくなったら、ループが中断されるような条件を作る必要があります。

そこ、正しい考え方です))

 
Natashe4ka:

そこ、正しい考え方です))

それで?

コンディションは?

 
Renat Akhtyamov:

それで?
コンディションはどこですか?

というようなものです。

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

で、過去
cnt 1,2,3 past
cnt 4,5,6 new から cnt new を何らかの方法で差し引かなければならない

 
Natashe4ka:

というようなものです。

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

で、過去
cnt 1,2,3 past
cnt 4,5,6 new から cnt new を何らかの方法で差し引かなければならない

いや、すでに書いてあるような意味じゃないですよ。

クローズドオーダーの利益計算について教えてください。

例えば

- 一日中

- 赤字

- ラストオーダー

なのか、それとも別の何か?

シリーズを説明する

理由: