Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сотни статей помогут создать торгового робота. Заходи и изучай!
djalexv
22
djalexv 2014.08.09 08:51 

Здравствуйте.

Все файлы сделаны для проверки данной ситуации. 

Есть скрипт HST_Check.mq4 :

#property show_inputs

//#include <HST_Lib.mqh>     // 1 вар.
#include <HST_Inc.mqh>       // 2 вар.


extern int output_Timeframe = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  FileInit(Symbol(), output_Timeframe );
  savebar(); //double o,double h,double l,double c)
  Sleep(100);
  deinitSyntBar();
  }

 

Все три функции:

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql4.com"

ulong      last_fpos;
int HistoryHandle=-1;

int FileInit(string c_symbol, int OutputTimeframe )
{

   HistoryHandle=FileOpenHistory(c_symbol+(string)OutputTimeframe+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
   if (HistoryHandle<0) return(HistoryHandle);

   string c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   int      i_unused[13];
   ArrayInitialize(i_unused,0);

//---- write history file header
   FileWriteInteger(HistoryHandle,401,LONG_VALUE);
   FileWriteString(HistoryHandle,c_copyright,64);
   FileWriteString(HistoryHandle,c_symbol,12);
   FileWriteInteger(HistoryHandle,OutputTimeframe,LONG_VALUE);
   FileWriteInteger(HistoryHandle,Digits,LONG_VALUE);
   FileWriteInteger(HistoryHandle, 0, LONG_VALUE);       
   FileWriteInteger(HistoryHandle, 0, LONG_VALUE);       
   FileWriteArray(HistoryHandle,i_unused,0,13);
   FileFlush(HistoryHandle);
   last_fpos=FileTell(HistoryHandle);
   return(HistoryHandle);
}

int savebar() //double o,double h,double l,double c)
{
   MqlRates rate;
   FileSeek(HistoryHandle,last_fpos,SEEK_SET);

   rate.time=0;
   rate.open=1.34250;
   rate.high=1.34350;
   rate.low= 1.34150;
   rate.close=1.34210;
   rate.tick_volume=11;
   rate.spread=0;
   rate.real_volume=0;  
   
   uint result=FileWriteStruct(HistoryHandle,rate);
   Print(StringConcatenate("error=",GetLastError()," result=",result));
   return(0);
} 

void deinitSyntBar()
{
   if (HistoryHandle > 0)
   {
      Print(StringConcatenate(__FUNCTION__," HistoryHandle=",HistoryHandle)); 
      FileClose(HistoryHandle);
      HistoryHandle = -1;
   }
      Print(StringConcatenate(__FUNCTION__," End: HistoryHandle=",HistoryHandle)); 

 return;
}


вызываются по очереди из полностью одинаковых  файлов:

 

1 вар.)     Libraries\HST_Lib.mq4  (через Include\HST_Lib.mqh естественно) 

2 вар.)    Include\ HST_Inc.mqh ( (отсутствует #property library  в отличии от первого варианта)

 

1 вар. видает 

2014.08.09 15:16:48.676 HST_Check EURUSD,M1: error=0 result=4294967295
 

 т.е.   Функция "FileWriteStruct" вроде как записывает в файл 4294967295 байт НО на самом деле ничего не записывает. В файле есть только заголовок.  И ошибок нет

 2 вар. видает    

2014.08.09 15:17:15.231 HST_Check EURUSD,M1: error=0 result=60
т.е  записывается  60 байт - полная длина структуры  MqlRates (как и должно быть) и запись происходит на самом деле. 

 

Из за чего это может разница в поведении ? 

Все файлы прикреплены.  

 

 

 

Файлы:
Ihor Herasko
8463
Ihor Herasko 2014.08.10 13:18  

Переменная HistoryHandle объявлена в библиотеке. Ее значение недоступно скрипту.

Исправить можно путем передачи handle в скрипт (возвратом значения функцией), а при вызове функций savebar и deinitSyntBar передавать им handle по значению.

djalexv
22
djalexv 2014.08.11 06:54  

Не помогло ...... (

И handle и last_fpos (для чистоты эксперимента)  получил из первой функции и передал по значению дальше ...  НО Результат тот же !!!!!

Есть ещё идеи? 

Кстати насколько я понимаю, несмотря на то что Переменная HistoryHandle объявлена в библиотеке, и  ее значение недоступно скрипту, оно остаётся доступно другим функциям, вызываемым  из этой библиотеки этим же экземпляром скрипта т.к. фунции запускаются в одном потоке...

ИЛИ я не прав?

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий