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

 
Interesting:
ほとんどの場合、そうでしょう。私のコードの半分もタイマーに縛られているので、新しいビルドを待つか、松葉杖をつくかしなければなりません :(

その通りです。OnTimerをOnTickに変更したところ、すべてが以前と同じようになりましたが、コアによる最適化は同時ではなく、1つずつ実行されます。このような明らかな誤りは、開発者が すぐに修正してくれるようです(期待)。

 
Interesting:

このコードはタイマーを作動させません

でも、これはそうなんです。

私の場合、うまくいかなかった。
 
Erm955:

その通りです。OnTimerをOnTickに変更したところ、すべてが以前と同じようになりましたが、コアによる最適化は同時ではなく、1つずつ実行されます。このような明らかな誤りは、開発者がすぐに修正してくれるようです(期待)。

また、カスタムイベントに関する明らかなバグ(テスター作業)はすぐに修正されると思っていました。まだ松葉杖を使わなければならないが...。:(
ヴァルマーズ
私の場合、役に立たなかった。

何かクセがあるのでしょう。

Win 2003 Server SP2 x32(AMD2600+、1コア)で試しました。そして、それは「空の」Expert Advisorで行われたと言えるかもしれません。追加されたのは2つの変数と2つの関数(タイマーの状態を定義するものと最初のスタートをキャッチするもの)だけです。

 

コード10005はどこに行ってしまったのか、またその意味は?

リクオート(10004)と「リクエスト拒否」(10006)の中間のようなもの?

2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   CTrade::PositionOpen: instant sell 0.10 #IBM at 145.38 [unknown retcode 10005]
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   prices for #IBM 0.10 (145.38 / 145.41 / 145.38)
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   CTrade::PositionOpen: instant buy 0.10 #IBM at 145.41 [unknown retcode 10005]
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   prices for #IBM 0.10 (145.38 / 145.41 / 145.38)
 

Championship 2010のディスカッションhttps://championship.mql5.com/2010/ru/users/capr で、ある参加者が自分のEAコードを投稿していました。コンパイルしてみました(ビルド355)。コンパイルの結果、いくつかの警告が表示されました。以下の断片に興味があります。コードの中にそのような断片があります。

void CountOrderStop(string symbol)
  {
   datetime from=0;
   datetime to=TimeCurrent();
//--- запросить всю историю
   HistorySelect(from,to);
//--- переменные для получения значений из свойств ордера
   ulong    ticket;
   double   open_price;
   double   initial_volume;
   datetime time_setup;
//   string   symbol;
   string   type;
   long     order_magic;
   count_sell_stop=0;
   count_buy_stop=0;

//--- количество текущих отложенных ордеров
   uint     total=OrdersTotal();
//--- пройдем в цикле по всем ордерам
   for(uint i=0;i<total;i++)
     {
      //--- получим тикет ордера по его позиции в списке
      if(ticket=OrderGetTicket(i) && (GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy stop limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy stop" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy limit") && OrderGetString(ORDER_SYMBOL)==symbol)
        {
         //--- получим свойства ордера
         open_price=       OrderGetDouble(ORDER_PRICE_OPEN);
         time_setup=       OrderGetInteger(ORDER_TIME_SETUP);
         symbol=           OrderGetString(ORDER_SYMBOL);
         order_magic=      OrderGetInteger(ORDER_MAGIC);
         int positionID =  OrderGetInteger(ORDER_POSITION_ID);
         initial_volume=   OrderGetDouble(ORDER_VOLUME_INITIAL);
         type=GetOrderType(OrderGetInteger(ORDER_TYPE));
         count_buy_stop=count_buy_stop+1;
        }
      if(ticket=OrderGetTicket(i) && (GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell stop limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell stop") && OrderGetString(ORDER_SYMBOL)==symbol)
        {
         //--- получим свойства ордера
         open_price=       OrderGetDouble(ORDER_PRICE_OPEN);
         time_setup=       OrderGetInteger(ORDER_TIME_SETUP);
         symbol=           OrderGetString(ORDER_SYMBOL);
         order_magic=      OrderGetInteger(ORDER_MAGIC);
         int positionID =  OrderGetInteger(ORDER_POSITION_ID);
         initial_volume=   OrderGetDouble(ORDER_VOLUME_INITIAL);
         type=GetOrderType(OrderGetInteger(ORDER_TYPE));
         count_sell_stop=count_sell_stop+1;
        }
        count_order = count_buy_stop + count_sell_stop;
     }
//---
  }

同じ型の2つの構文のうち if(ticket= ...)の場合、コンパイラは最後の1つに対してのみ「式がbooleanでない」警告を生成します(つまり、以前の同様の警告を「隠す」のです)。警告の中のif文をコメントアウトすると(コンパイラのチェックのため!)、変更されていないが前回のコンパイル時にプロトコルに存在しなかった同様の構成に対して警告が発生するのです。

これは機能なのでしょうか、それともバグなのでしょうか?

 

エラー,MetaTrader 5 MQL,開設済み,開始: 2010.11.06 11:32,#25823

答えを教えてください

 

そのようになっているのかどうかわかりませんが、ファイルに書き込む ときに

class tick{
   public:
      MqlTick  data;             //новые тиковые данные
      bool     refresh();        //метод обновления тиковых данных с проверкой на поступление новых данных
      void     write();          //запись тиковых данных в файл
.........

void tick::write(void){
   if (file_handle>0)FileWrite(file_handle,data.bid);
}

正規化されていない価格が表示されることがあるのですが。

81.42
81.41
81.41
81.40000000000001
81.40000000000001
81.40000000000001
81.40000000000001
81.41
81.40000000000001
81.41
81.41

なんで

で、FileWriteStruct( file_handle,data, sizeof(data))を使用してファイルに書き込むことがなぜかできなかった。

 
非正規化価格については、すべてクリアしているようです。主要なイベントでは(今のところ)見ていませんし、クロスについては、あるイベントではほとんど、他のイベントではより頻繁に、ターミナルがそのようなデータを与えてくれることを意味しています。
 
IgorM:

で、FileWriteStruct( file_handle,data, sizeof(data))を使用しても何らかの理由でファイルに書き込むことができませんでした。

バイナリファイルに書き込む必要がある -https://www.mql5.com/ru/docs/files/filewritearray

FileWriteArray

文字列配列(文字列を含まない構造体の配列、動的配列でも可)を除く、任意の型の配列をBIN 型ファイルに書き込みます。

intFileWriteArray()
intfile_handle,//ファイルハンドル
voidarray[],// 配列
intstart_item=0,// 配列の初期インデックス.
intitems_count=WHOLE_ARRAY// 要素
);

例えば、(既存のレコードを上書きしないようにコードを更新する必要があります)。

//+------------------------------------------------------------------+
//|                                         Test_FileWriteStruct.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Tick
  {
private:
   int               m_file_handle;


public:
   MqlTick           data;             //новые тиковые данные
   void Tick(){m_file_handle=FileOpen("tickrecords.dat",FILE_READ|FILE_WRITE|FILE_BIN);};
   void ~Tick(){if(m_file_handle!=INVALID_HANDLE) FileClose(m_file_handle);};
   bool              refresh();        //метод обновления тиковых данных с проверкой на поступление новых данных
   void              write();          //запись тиковых данных в файл

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Tick::refresh(void)
  {
   bool res=SymbolInfoTick(Symbol(),data);
   if(!res) Print("Неудачный вызов SymbolInfoTick(), ошибка ",GetLastError());
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Tick::write(void)
  {
   if(m_file_handle!=INVALID_HANDLE)FileWriteStruct(m_file_handle,data,size);
   else Print("Не удалось записать данные в файл. Ошибка ",GetLastError());
  }

Tick tick;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(tick.refresh()) tick.write();

  }
//+------------------------------------------------------------------+

 

Документация по MQL5: Файловые операции / FileWriteArray
Документация по MQL5: Файловые операции / FileWriteArray
  • www.mql5.com
Файловые операции / FileWriteArray - Документация по MQL5
 
Rosh:

バイナリファイルへの書き込みが必要です -https://www.mql5.com/ru/docs/files/filewritearray

例えば、(すでにあるレコードを上書きしないように、コードの改善が必要です)。

OK、どうもありがとうございます、テスト用にテキストファイルに書き込んでいただけなので、MqlTickが本質的にどのような構造なのか疑い始めていました :)

ZS: 悪くないですね。基本的には、私のクラスとコードを復元しました。)- MT5でオフラインのチャートを作成したくないというのは残念です - 私はMT4+MT5用に書いていますが、非標準のTFにはまってしまいました。

ファイル: