どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 66

 
Roger:

トレーリングと呼ばれるものは実際にはそうではなく、異なる方法で計算され、その動作は非論理的であることがあります。


言葉の概念が一致していなくても、私のことを理解してくれているのですね?

問題を解決したのは、ここだった。

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

この関数では、すべてのオープントレードを考慮していなかったので、ループの条件を変更する必要がありました。今はこんな感じです。

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

この機能は、指定された価格水準でのすべての未決済取引の利益の合計を計算します。ただし、スプレッドを考慮していないという意見も引用されており、私も同意見です。この意見の筆者は、この解決策を提案した。

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

しかし、正直に告白すると、私は彼が書いているように理解できないのです。

スプレッドが計上されていない。これは、現在の価格から結果をカウントすることで修正することができます。
彼が提案したアルゴリズムがよくわからないのですが、スプレッドはどのように考慮されているのでしょうか?どなたか解説してください。
 
Mepkypuu:

でも、正直なところ、書いている彼のことはよくわからないんです。

私は彼のアルゴリズムを理解していないようだ、どのようにスプレッドがそこで考慮されるのですか?どなたか説明してください。

OrderProfit() は、現在のAskでのショートポジションをカウントし、ここで現在のスプレッドの値が考慮されます。スプレッドが変化しない場合、価格が現在のBidからnewSLに変化すると、ポジションの1ロットの利益(BuyまたはSellのいずれか、適切な符号付き)は、オペレータに書かれているdeltaの値だけ変化します。

delta = ( newSL - Bid ) * TickValue;

簡単に説明すると、OrderProfit()はスプレッドも含めてすべてをカウントし、ある瞬間(現在の価格)の結果をOrderProfit()で確定させるのです。これからは、価格の変化を見守るだけでいいのです。

 
Mislaid:

OrderProfit()は、現在のAskのショートポジションについてカウントされ、ここで現在のスプレッド値が考慮されます。スプレッドが変化しない場合、価格が現在のBidからnewSLに変化すると、ポジションの1ロットの利益(BuyまたはSellのいずれか、対応する記号)は、文中に書かれているdeltaの値だけ変化します。

delta = ( newSL - Bid ) * TickValue;

簡単に説明すると、OrderProfit()はスプレッドも含めてすべてをカウントし、ある瞬間(現在の価格)の結果をOrderProfit()で確定させるのです。ここからは、価格の推移を見守るしかない。

わかってきたような気もしますが、もしかしたらもっと正しいのかもしれません。

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

ショートポジションのOrderProfitは、Ask価格から計算されますよね?

ちなみに、EURUSDの場合MarketInfo( SymbolName, MODE_TICKVALUE)は 329.02を返すので、この関数が正しく 動作しないのですが、どうすればよいでしょうか?

 

今のところ、トリック、つまりMarketInfo(SymbolName, MODE_TICKVALUE) でカウントを変えて 行くことにしています。

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

今のところ、トリック、つまりMarketInfo(SymbolName, MODE_TICKVALUE) でカウントを変えて 行くことにしています。

その書き方は正しい。スプレッドはそのままに、Bidをどれだけずらすか、Askをどれだけずらすか。
 
Mislaid:
その書き方は正しい。Bidが動いた分だけ、Askが動いた分だけ、スプレッドが変わらなければ。

個人的な経験では、スプレッドは通常、変化せず、かなり強いです)。急激な動きの中で、5桁の スプレッドで8ポイントから80ポイントまで広がったこともあります。
 
ダブルトップの コーディングは可能ですか?
 
001:
ダブルトップは符号化できるのか?
可能です。
 

ジャーナルでExpert Advisorをテスト すると、エラーがポップアップ表示される

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: エラー 4002 (配列インデックス - 範囲外)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 買い注文を出そうとしています。答えを待っている。

従って、この注文は開封されません。エラーをなくすには?その理由は何でしょうか?

喜んでお手伝いさせていただきます。

 
alexey1979621:

EAをテストすると、ログにエラーが表示される

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: エラー 4002 (配列インデックス - 範囲外)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 買い注文を出そうとしています。答えを待っている。

従って、この注文は開封されません。エラーをなくすには?その理由は何でしょうか?

喜んでお手伝いさせていただきます。

ターミナルのメッセージだけではあまりわからないでしょう、EAコードを掲載しないとあまり参考になりません。配列のどこかに、存在しないデータのバッチを、仮定の一つとして書いているのですが、推測は私のプロファイルではありません。