エラー、バグ、質問 - ページ 1930

 
ほとんど子供じみた質問ですが、なぜそうなのでしょうか?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

なぜか、DoubleToStringは 正規化したら意味がないと思い込んでいました。しかし、いや、台本にあるようになぜそうなのでしょうか。

double -> string の変換が正しく行われないようです。

 
テスターでPositionGet関数が非常に遅い。デモのために、以下のExpert Advisorを書きました。
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


イエローラインをコメントアウトしたシングルランの結果

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


黄色い線がコメントアウトされていない状態でのシングルランの結果

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


TesterBenchライブラリでも 同様に実行時間が低下していることがわかります。


HH PositionGetだけでなく、OrderGet、HistoryDealGet、HistoryOrderGetも遅い。

 

テスター(1629)では、取引はゼロ価格で開始されます。

FIBOGroup-MT5 Server のリアルティックを使ってテスターで Expert Advisor を実行する。


 

開発者や興味のある同僚に質問です。

Testerのビジュアライゼーションモードでは、CiMAクラスで あるmuwingsというオブジェクトが 存在します。

Mode = "Every tick based on real ticks".ビジュアライザーのスピードは最大に近いです。

問題はこれだ。新しいバーが表示されると、CiMAミューウィングの値、つまりミューウィングバッファの値を更新するために、クソほど新しいティックを待つ必要があります。

そして、毎回のティックでは、CiMA::Refresh(-1)メソッドによって更新が加速されます。

なぜテスターの動作が悪いのか?

実取引ではそのような問題はありません。

 

最近のプーシャは変だ。

uest/302788

request/302788

察するに、候補として下ろされ、同じ順番でコメントされたのは私の方だったのでしょう。

でも、メッセージはコーダー向けと同じです)

 

ドキュメントより

enum_base_corner

識別子

商品説明

コーナーレフトアッパー

チャート左上隅の座標の中心値

コーナー左下

チャート左下隅の座標の中心値

コーナーライトロワー

チャート右下の座標の中心値

コーナーライト・アッパー

グラフの右上の座標中心

質問:なぜ表は数字順に描けないのですか? 1を入れると、期待された「チャートの左上隅に座標中心」ではなく、 チャートの右下隅に座標中心」となってしまいます。

現在はこのように表示されます。

1 - チャートの左下隅にある座標中心。
2 - グラフの右下隅にある座標中心
3 - チャートの右上にある座標センター
4 - チャートの左上隅にある座標中心

 
Aleksey Vyazmikin:

ドキュメントより

enum_base_corner

識別子

商品説明

コーナーレフトアッパー

チャート左上隅の座標の中心値

コーナー左下

チャート左下隅の座標の中心値

コーナーライトロワー

チャート右下の座標の中心値

コーナーライト・アッパー

グラフの右上の座標中心

質問:なぜ表は数字順にならないのですか? 1を入れると、期待された「座標中心はグラフの左上隅」ではなく、「座標中心は グラフの右下 隅」となってしまうのです。

このように見えます。

1 - チャートの左下隅にある座標中心。
2 - グラフの右下隅にある座標中心
3 - チャートの右上にある座標センター
4 - チャートの左上隅にある座標中心

カウントはゼロから始まります。

CORNER_LEFT_UPPERを 数値の代わりに入力することを妨げるものは何ですか?そのために列挙があるのだから、数字について考える必要はない。

 

ヘルプデスクにて

MT4です。

固定サイズのオブジェクトの場合: OBJ_BUTTON,OBJ_RECTANGLE_LABEL, OBJ_EDIT プロパティ OBJPROP_XDISTANCE と OBJPROP_YDISTANCE はチャートコーナー(OBJPROP_CORNER)を基準にして左上のオブジェクトポイントの位置を設定し、そこからXとY座標がピクセルでカウントされることになります。


MT5です。

固定サイズのオブジェクト:OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT, OBJ_CHARTでは、OBJPROP_XDISTANCEとOBJPROP_YDISTANCEプロパティは、チャートコーナー(OBJPROP_CORNER)に関連してオブジェクトの左上点の位置を設定します、そこからXとY座標はピクセルで測定されることになります。

旧バージョンのMT4では、ObjectSetを 使用して、オブジェクトをそのエッジ(コーナー)に相対的に配置できます。左側のオブジェクトでは、ピクセル計算は最初のシンボルから、右側のオブジェクトでは、最後のシンボルから行われますが、新バージョンでは、常に最初のシンボルから計算されるため、テキスト付きのラベルの配置が困難 です。開発者にお願いしたいのは、文字揃えの方法を選べるようにしてほしいということです

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }  


MT5で左右のアライメントを取る方法をご存知の方がいらっしゃいましたら、該当する機能を教えてください!よろしくお願いします。

 
Artyom Trishkin:

カウントはゼロから始まります。

CORNER_LEFT_UPPERを 数値の代わりに入力することを妨げるものは何ですか?そのために列挙があるのだから、数字について考える必要はない。

ゼロから?まあ、いいや~ゼロにしちゃえ~、考慮してなかった~、でもやっぱりダメなんだ~、と。

その方が理にかなっているし、以前も使ったことがあるから。

 
Aleksey Vyazmikin:

ゼロから?まあ、いいや~、ゼロからでも~、考えてなかった~、でも、やっぱりダメなんだ~、と。

その方が理にかなっているし、使ったことがあるから...。

4番で特定しようとしているリスト項目を繰り上げましょうか、それはないのですが。ゼロになる--と、すべてが整う。