[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 365

 
sibemol >>:

Благодарю за ответ, буду пробовать, о результатах отпишусь.

навскидку добавил трохи - как идею.


//+------------------------------------------------------------------+
//| CopyBars.mq4 |
//| Copyright © 2009, Sorento |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Sibemol & Sorento" // :)
#property link "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 White
//---- input parameters
extern int Max_Length=9;
double v1[];int pos, hFile;datetime CurentT;
string O="CB", strng, F=";", Filler="0000000000000000";
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
string Name_File;
Name_File=StringConcatenate(O,Symbol(),TimeYear(Time[0]),"_",TimeMonth(
Time[0]),"_",TimeDay(Time[0]),"x",TimeHour(iTime(NULL,1,0)),"_",
TimeMinute(iTime(NULL,1,0)),".CSV");
Print ("Bars in ",Name_File," start!");
hFile=FileOpen(Name_File,FILE_CSV |FILE_WRITE,F);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,v1);
strng=StringConcatenate("<ticker>",F,"<per>",F,"<date>",F,"<time>",F,"<open>",F,"<high>");
strng=StringConcatenate(strng,F,"<low>",F,"<close>",F,"<volume>",F,"<oi>",F);
pos=pos+StringLen(strng);
FileWrite(hFile,strng);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
FileClose(hFile);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(), limit;
//----- первый вызов
if (counted_bars==0)
{CurentT=Time[0];// при записи может закрыться текущий бар и появится новый
limit=Bars-1;
CurentT =FilesWR(limit,1);
//----
return(0);
}
//---- последующие
if (counted_bars>0)
if (CurentT<Time[0])
{// мог быть обрыв связи - нужно найти последний и может еще не обновлённый бар
limit=iBarShift(NULL,Period(),CurentT,false);
CurentT=Time[0];// при записи может закрыться текущий бар и появится новый
FilesWR(limit+1,0);
}
else FilesWR(1,0); //бар еще текущий
//-----
return(0);
}
//+------------------------------------------------------------------+
datetime FilesWR(int startBar,int code){

int codec=code;

for(int i=startBar; i>=0; i--)
{
v1[i]=Close[i];
int _Year=TimeYear(Time[i]),
_Month=TimeMonth(Time[i]),
_Day=TimeDay(Time[i]),
_Hour=TimeHour(Time[i]),
_Minute=TimeMinute(Time[i]);

string Y, M, D, H, Mi, Date, _Time;

if(_Month<10) M="0"+DoubleToStr(_Month, 0); else M=DoubleToStr(_Month, 0);
if(_Day<10) D="0"+DoubleToStr(_Day, 0); else D=DoubleToStr(_Day, 0);
if(_Hour<1) H="00";
else if(_Hour<10 ) H="0"+DoubleToStr(_Hour, 0);
else H=DoubleToStr(_Hour, 0);
if(_Minute<1)Mi="00";
else if(_Minute<10) Mi="0"+DoubleToStr(_Minute, 0);
else Mi=DoubleToStr(_Minute, 0);
Date=DoubleToStr(_Year, 0)+M+D;
_Time=H+Mi;

strng=StringConcatenate(Symbol(),F, Period(),F, Date,F, _Time,F,
DS(Open[i]),F,DS(High[i]),F, DS(Low[i]),F,DS( Close[i]),F,IS( Volume[i],10),F);
pos=+StringLen(strng);// можно заранее просчитать длину и использовать предопределённую константу
if (codec==0)
{//обновим предпоследний бар тоже
FileSeek(hFile,pos-StringLen(strng),SEEK_SET);
codec=+1;
}

FileWrite(hFile,strng);// при записи может закрыться текущий бар и появится новый
if ( CurentT<Time[0]) i=+1;// сместим индексы

}
CurentT=Time[0];
FileFlush(hFile);
return ;
}
//----------Быстрая коричневая сука----------
//----------12345678901234567890----------!!!
string DS(double value)
{
string strng=DoubleToStr(value,Digits);
int k=StringLen(strng);
int l=StringFind(strng,".")+Digits+1;
if (l<k)
{ strng=StringConcatenate(strng,StringSubstr(Filler,0,k-l));k=2*k-l;}
int i=Max_Length-k;// add char
return (StringConcatenate(StringSubstr(Filler,0,i+1),strng));
}
string IS(int iValue, int Max_Length)
{
string strng=DoubleToStr(iValue,0);
int k=StringLen(strng);
int i=Max_Length-k;// add 0
return (StringConcatenate(StringSubstr(Filler,0,i+1),strng));
}
 

Оптимизация закончилась следующим сообщением:

There were 60 passes done during optimization
optimization stopped, 140 cache records were used, 140 cache records rejected

при этом в окне настроек было:

200 / 1 280 (200)


1. Может ли кто-нибудь объяснить что означают эти цифры и как они могли быть получены? (60, 140, 200, 1280)

2. Если оптимизировались, допустим, два параметра и число возможных комбинаций было 15 и 20 соответственно - где они были бы видны (среди этих чисел)?

3. Есть ли какие-нибудь ограничения по числу циклов оптимизации? (все ли комбинации будут гарантированно рассмотрены?)

Спасибо!

 

Как сделать из кода описание уровней объектов фибо, доступных из свойств? Как задать в коде их значения понятно:

      ObjectSet("fibo",OBJPROP_FIBOLEVELS,8);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+0,0.0);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+1,0.382);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+2,0.618);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+3,1.0);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+4,1.382);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+5,1.618);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+6,2.0);
      ObjectSet("fibo",OBJPROP_FIRSTLEVEL+7,2.618);

А описание? Или это из кода не доступно?

 

Sorento, гран мерси! Как только кончатся выходные обязательно проверю ваш вариант и alsu.

2alsu: с полями я затупил, посчитав их за строки )).

 
sibemol >>:
Sorento, гран мерси! Как только кончатся выходные обязательно проверю ваш вариант и alsu.

без движения рынка проверьте счас. это позволит сосредоточится на отладке только двух ситуаций.

бар еще старый

и есть уже новый.

раз новый появился - нужно полностью сформировавшийся обновить.

там есть что оптимизировать.

и алгоритм пропуска связи и потери фрагмента истории проверьте искусственно.


Удачи в пути.


PS. Сдвигать назад наверно нужно всё же на две длины. Подумайте.

 
Sorento, проверил код ничего не меняя на стоячем рынке. Строки имеют вид: EURUSD;15;20091224;1830;0001.43580;0001.43625;0001.43566;0001.43611;00000000163; EURUSD;15;20091224;1845;0001.43612;0001.43612;0001.43536;0001.43538;00000000180; и два последних бара записаны (продублированы) вначале файла. Таки придётся сдвигать. Буду изучать ваш код. Спасибо.
 

лидирующие и заполняющие после DoubleToStr(value,Digits) нули нужны для постоянства длины - в этом и загвоздка была. дальше разрулите.

Можна и от конца искать позицию. ;)

Удачи в изысканиях.

 

2Sorento:

В вашем коде

int start()
{
int counted_bars=IndicatorCounted(), limit;
//----- первый вызов
if (counted_bars==0)
{CurentT=Time[0];// при записи может закрыться текущий бар и появится новый
limit=Bars-1;
CurentT =FilesWR(limit,1);
//----
//return(0);

убрал return(0), после чего файл записался как надо, только нет значений последнего поля <oi>, содержащего 0 во всех записях, но это мелочи, разберусь. Теперь надо проверить в движении. Ещё раз спасибо.

ЗЫ А никак нельзя убрать лид. нули в полях с ценой? Вроде на длину не влияет.

 
Svinozavr >>:

Как сделать из кода описание уровней объектов фибо, доступных из свойств? Как задать в коде их значения понятно:

А описание? Или это из кода не доступно?


Спасибо Sorento - подсказал ObjectSetFiboDescription.

Вопрос снят.

 
sibemol >>:

2Sorento:

В вашем коде

убрал return(0), после чего файл записался как надо, только нет значений последнего поля <oi>, содержащего 0 во всех записях, но это мелочи, разберусь. Теперь надо проверить в движении. Ещё раз спасибо.

ЗЫ А никак нельзя убрать лид. нули в полях с ценой? Вроде на длину не влияет.

золото прогоните. 1140 и 980

длина записи меняется.

а <oi> я убрал за ненадобность ;)

Причина обращения: