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

 
Renat Akhtyamov:

いいえ、この行は削除されます。これは利益計算です、そううまくはいきません。

closeコマンドはコードのどこにあるのでしょうか?

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

とクロージング条件において

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1はカウントしない、2は正しくカウントする、3は0をカウントしない。

 
Natashe4ka:
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

とクロージング条件において

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1は数えない、2は正しく数える、3は数えない 0

ということで、終了です。

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

そしてもうひとつ。

チケットにしたがって、注文は終了しているのでしょうか?

そのため、シリーズを早めに終了させるためには、開始時刻を覚えておく必要があります

つまり、シリーズを閉じるという決定がなされたばかりの場合、実際に閉じるかどうかは問題ではないのです

 
Natashe4ka:
//+----------------------------------------------------------------------------+

あなたの主張は理解できますが、私は、テスターでは動作しない、実際の取引のための一連のポジションを閉じるという優れた機能を持つ、動作するバージョンをお渡ししました。

端末を再起動しても、すべてカウントして記憶しています。

以下、テスターで実行し、取引履歴 と結果を比較するだけです。

PS.コードを書き込むのを忘れていたため、以下のように修正しました。

ファイル:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

あなたの主張は理解できますが、私は、テスターでは動作しない、実際の取引のための一連のポジションを閉じるという優れた機能を持つ、動作するバージョンをお渡ししました。

端末を再起動しても、すべてカウントして記憶しています。

以下、テスターで実行し、取引履歴 と結果を比較するだけです。

これを自分のコードに適用するにはどうしたらよいでしょうか?

LastProfitCLの 値によって、私の次の行動が 決まります。

 
Renat Akhtyamov:

然もなくば

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

もうひとつ。

チケットで注文を締め切っていませんか?

だから、シリーズが終了する時間をもっと早く覚えておく必要があるのです

つまり、シリーズを閉じるという決定がなされたばかりの場合、実際に閉じるかどうかは問題ではないのです

注文がストップで閉じられた場合、{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();}はすでに利益の値を逃して います。
 
Natashe4ka:

これを自分のコードに適用するにはどうしたらいいのでしょうか?

次のアクションを決定 するLastProfitCL 値を持っています。

だから明確で、自分の思うように適用すればいい。

  double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit")));
  
  Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );

LastProfit"を一度宣言し、必要な場所で使用する。

 
Natashe4ka:
注文がストップで閉じられた場合、{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();}はすでに利益の値を逃す ことになります。

はい、そうなります。

ライブオーダーがどれだけ残っているか、ティックごとに 確認することができます。

もし同じなら、前の刻みの時間を覚えておくとよいでしょう。

そうすれば、必要なものが手に入るはずです。

しかし、オートマトンでは通常、停止は起こりません。

 
Natashe4ka:
ストップ高で引けた場合、{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();}はすでに利益値を逃す ことになります。

時間的に最後に閉じたものだけをカウントし、決算額には依存しない。

一般に、タスクが完全に明確ではないので、これ以上の議論はない。

//---------------------------------------------------------

ここに書き出したら、もう問題がわからなくなった。

ファイル:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

ここにきて、その作業がわからなくなりました。

OK、ありがとうございます。
 

これは「cnt」がゼロに設定されている場合も正しいのですが、その場合はスクリーンショット3のようにまた訳の分からない値になってしまいます(利益の値は4.27であるべきです)。

double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  int cnt=0;
  double LastProfit=0;
   for(i=0;i<OrdersHistoryTotal();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 ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
       }
  return(LastProfit);
   }