Ошибки, баги, вопросы - страница 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)
 

В обсуждении чемпионата 2010 https://championship.mql5.com/2010/ru/users/capr участник опубликовал код своего советника. Попробовал откомпилировать его (build 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;
     }
//---
  }

Из двух однотипных конструкций if(ticket= ... компилятор выдаёт предупреждение "expression is not boolean" только на последнюю (т.е. "маскирует" предыдущее аналогичное предупреждение). Если if, указанный в предупреждении, закомментировать (для проверки компилятора!), предупреждение выдается на вышестоящую подобную конструкцию, которая не менялась, но отсутсвовала в протоколе при предыдущей компиляции.

Это фича или баг?

 

Errors, 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 массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы).

int  FileWriteArray(
   int   file_handle,              // handle файла
   void  array[],                  // массив
   int   start_item=0,             // начальный индекс в массиве
   int   items_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 - по сути структура :)

ЗЫ: неплохо - по сути восстановили мой класс и код ;) - жаль, что не хотите сделать создание своих оффлайн графиков в МТ5- пишу для связки МТ4+МТ5, уж больно привязался я к нестандартным ТФ

Файлы:
Причина обращения: