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

 
Alexander_K2:

でも、何かすごく変なんです...。

つまり、OrderSelectを一度やって、関数からもう一度...ということです。とんでもないことだ...。

  1. チケットで注文を選択した場合
  2. 注文 数を確認する機能に行くのです。複数のオーダーがある場合、選択可能なオーダーはすべて1つずつ選択されるサイクル
  3. この機能から戻ったとき、選択されている注文は、クライアント端末の注文一覧で最後に表示されたものです(必ずしも1.で選択した注文とは限りません)。
  4. そして、新規注文のクローズ時間を確認し、チケットで選択されたはずの注文をクローズしようとしているが、その選択はすでに失われている。

単純な論理だ...

自分が行っている操作の順序を見る。

当然ながら、まず数量を確認し、必要なオーダーを選択し、それに対して必要な操作を行う必要があります。

 
Maxim Kuznetsov:

オーダー配列はどちらを向いているのでしょうか?

改訂」時に閉鎖/削除の可能性がある場合は、反対側を見た 方が良い。OrdersTotal()-1 から 0 まで(0 を含む)。

そうでなければ、トラブルに巻き込まれるかもしれません :-)


私も一度、この方法で個人的な宝物を 発見しそうになったことがあります :-)

そして、「時の深み」から現在に至る古い注文の削除(全部ではなく、たまに)により、テスターの収益性が天にも昇るほど上がりました :-)

 
Artyom Trishkin:
  1. チケットで注文を選択した場合
  2. 注文 数を確認する機能に入りましたね。複数の注文がある場合、利用可能なすべての注文が1つずつ選択され、サイクルにカウントされます
  3. この機能から戻ったとき、選択されている注文は、クライアント端末の注文リストの中で最後に表示された注文になります(必ずしも1.で選択した注文である必要はありません)。
  4. そして、新規注文のクローズ時間を確認し、チケットで選択されたはずの注文をクローズしようとしているが、その選択はすでに失われている。

単純な論理だ...

自分が行っている操作の順序を見る。

まず数量を確認し、次に正しい順序を選択し、それに対して必要な操作を行うことは当然である

私はこのようにしました。

RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(OrderSelect(ticket_sell_NZDUSD, SELECT_BY_TICKET)==true)
         {
         ctm_ticket_sell_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_sell_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_SELL)
                  {
                  double AskNorm=NormalizeDouble(Ask,Digits);
                  OrderClose(ticket_sell_NZDUSD,0.01,AskNorm,0);
                  }
               }
            }
         }

ただ、オーダーカウントを優先し、それ以外はすべて後回し。

アルテムさん、ありがとうございます。聖杯のおかげです。この失敗が、私を苦しめることになったのです......。

 

小数点 以下の桁数を計算するにはどうしたらよいですか?

例えば、最小ロットが0.01であることを知りました。

MarketInfo("EURUSD",MODE_MINLOT)

小数点 以下の桁数が2であることはどのように推測すればよいのでしょうか?
で、オーダーボリュームを小数点以下2桁に正規化します。

 
multiplicator:

小数点 以下の桁数を計算するにはどうしたらよいですか?

例えば、最小ロットが0.01であることを知りました。

小数点 以下の桁数が2であることはどのように推測すればよいのでしょうか?
を使い、後でオーダーボリュームを小数点以下2桁に正規化します。

これを試してみてください。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}
 
Alekseu Fedotov:

これを試してみてください。

なぜ、そんな古いものを提供するのか?

乗算器 です。

小数点 以下の桁数を計算するには?

例えば、最小ロットが0.01であることを知りました。

小数点 以下の桁数が2であることを調べるにはどうしたらよいですか?
その後、オーダーボリュームを小数点以下2桁に正規化する。

ここでは、記事中の 既成の機能を紹介します。

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }

あとは、この関数が返す結果に応じたアクションを追加するだけです。

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 
開くとターミナルで必要な小数点 以下の桁数に正規化されるんですね。
こんな感じでたくさん入れました。
OrderSend(Symbol(),OP_BUY,1.11111111,Ask,3,0,0);
となり、取引は1.11の出来高で開始されます。

では、何も正規化する必要はないのでは?
 
multiplicator:
ターミナルを開くと、必要な小数点 以下の桁数に正規化されていますね。
何も正規化する必要はないのかも?

編集者が同じことをするならば......必要ないですね。

 
multiplicator:
ターミナルを開くと、注文が必要な小数点 以下の桁数に正規化されますね。
もしかして、何も正規化する必要はないのでは?

エラーに次ぐエラーを出したい場合は、ノーマライズをしないでください。

 
Artyom Trishkin:

もし、その後にエラーが続出するようであれば、正規化しないことです。

なぜか端末にエラーが表示されない)
理由: