MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1598

 
Maxim Kuznetsov:

ただし、端末が十分な履歴を持つこと、またそれを保証するものではありません。

上記の例では、履歴への言及はありません。

ので、OrderSelect()の結果が真であることが保証されます。

UPD: 4のOrderSelectは 非常によく機能します。一度テストしましたが、成行注文の場合、注文のプロパティにアクセスする時間が......。本当に毎秒何百万回なのか、調べたくありません。モデレーターのアルテムと議論していたような気がしますが、「一長一短」と言いますし、気に入ったのなら、そのままにしておきましょう。

 

こんにちは、各取引のドローダウンのデータが欲しいというニーズがあります。

このような統計情報を収集し、レポートの形で出力するスクリプトに出会える方はいらっしゃいますか?

ありがとうございました。

 
законопослушный гражданин:

こんにちは、各取引のドローダウンのデータが欲しいというニーズがあります。

このような統計情報を収集し、レポートの形で出力するスクリプトに出会える方はいらっしゃいますか?

しゃい

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

手書き」であり、未検証、バグだらけです :-) 自分のニーズに合わせて調整し、使用してください。

 
Maxim Kuznetsov:

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

手書きで書いたので、チェックはしていませんし、間違いだらけです :-) あなたのニーズと使用に合わせて調整してください。

ありがとうございます。

 
@Igor Makanu さん、ターミナルでのソート順についてのご回答、どうもありがとうございました。構造体の配列として保存して、自分でソートすることになるんでしょうね。というのも、このような動作を毎ティック行うことで、パフォーマンスに顕著な悪影響が出るのではと危惧したからです。
 
Janis Ozols:
@Igor Makanu さん、ターミナルでのソート順についてのご回答、どうもありがとうございました。構造体の配列として保存して、自分でソートすることになるんでしょうね。というのも、このような動作が毎ティック行われることで、パフォーマンスに顕著な悪影響が出るのではと危惧したからです。

では、なぜダニごとにソートするのでしょうか?エントリーの数が変わったり、リストが完全に変わったりしたときだけ十分...。

 
こんにちは ナビゲーターからダウンロードしたインジケーターがチャートにドラッグされないのですが、どうしてでしょうか?カタログに載っています。
ファイル:
image002.jpg  38 kb
 
午後マーケットプレイスから取引端末への 指標ツールの自動読み込みが行われない場合、何が問題なのでしょうか?
 
Igor Makanu:

上記の例では、歴史への言及はありません。

ので、OrderSelect()の結果が真であることが保証されます。

UPD: 4のOrderSelectは 非常にうまく機能しており、一度テストしていました - 成行注文の場合、注文のプロパティにアクセスする時間....本当に毎秒何百万回なのか、調べたくありません。モデレーターのアルテムと議論していたような気がしますが、「一長一短」と言いますし、気に入ったのなら、そのままにしておきましょう。

モデレーターのアルテムは論外。モデレーターのアルテムがディベート中 :)
 
void OnTick()
  {
    if(isCrossing() == 1)          
      
    ... 

    if(isCrossing() == 2)
      
    ... 
  }

int isCrossing(){  
  double ma = iMA(NULL, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maApplietPrice, 0);
  double low = iLow(Symbol(), g_timeFrame, 0);
  double high = iHigh(Symbol(), g_timeFrame, 0);

  if(g_barTime < iTime(NULL,g_timeFrame,0) && high > ma && Bid <= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 1;
  } 
  
  if(g_barTime < iTime(NULL,g_timeFrame,0) && low < ma && Bid >= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 2;
  }
   
  return 0;
}
isCrossing() はなぜ2を 返さないのか?isCrossing() 自体には2つ目のif 項目がありますが、そうするとisCrossing() == 2の ときにOnTick()if 項目がありません。何をバカなことを...。