错误、漏洞、问题 - 页 195

 
Interesting:
最有可能的是他们。我有一半的代码也被绑在了计时器上,现在我不得不等待新的构建或拿出拐杖:(

没错,刚把OnTimer改成OnTick,一切都和以前一样了,但按内核优化是一个一个进行的,不是同时进行的。在我看来,开发人员 会很快修复这种明显的错误(我希望)。

 
Interesting:

这段代码没有触发定时器

但这个人确实如此。

这在我的情况下并不奏效。
 
Erm955:

没错,刚把OnTimer改成OnTick,一切都和以前一样了,但按内核优化是一个一个进行的,不是同时进行的。在我看来,开发人员会很快修复这种明显的错误(我希望)。

我还以为自定义事件上的明显错误(测试人员的工作)会很快被修复。仍然需要使用拐杖...:(
Valmars
在我的情况下,它没有任何帮助。

一定有一些特殊性。

我在Win 2003 Server SP2 x32(AMD 2600+,一个核心)上试过。我可以说这是在一个 "空 "专家顾问上完成的。只添加了两个变量和几个函数(那些定义定时器状态和捕捉第一次启动的函数)。

 

代码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;
     }
//---
  }

在两个相同类型的结构中,如果(ticket= ...编译器只对最后一个 产生了 "表达式不是布尔值 "的警告(即它 "掩盖 "了之前的类似警告)。如果你把警告中的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

文件写入阵列

将任何类型的数组写入BIN 类型的文件,除了字符串数组(可以是不包含字符串的结构数组和动态数组)。

intFileWriteArray(
intfile_handle,//文件处理
空白数组[],//数组
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

例如(代码需要改进,所以它不会覆盖已经存在的记录)。

好的,非常感谢你,我只是写到一个文本文件进行测试,我开始怀疑MqlTick本质上是一个结构:)

ZS:不错--基本上恢复了我的类和代码;)- 很抱歉,你不想在MT5中创建自己的离线图表 - 我是为MT4+MT5写的,我对非标准的TF上瘾了。

附加的文件: