#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){
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)); }
int start(){int counted_bars=IndicatorCounted(), limit;//----- первый вызовif( counted_bars==0){ CurentT=Time[0];// при записи может закрыться текущий бар и появится новый
limit=Bars-1;
CurentT = FilesWR( limit,1);//----//return(0);
返信ありがとうございます!試してみて結果をお知らせします。
アイデアとしていくつか追加したところです。
//| 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
この場合、設定画面ではそうなっていた。
1.この数字が何を意味するのか、どのようにして得られたのか、どなたか説明してください。(60, 140, 200, 1280)
2.例えば、2つのパラメータが最適化され、可能な組み合わせの数がそれぞれ15と20だったとしたら、(この数の中で)どこに表示されるのでしょうか。
3.最適化回数に制限はありますか?(すべての組み合わせが検討されることが保証されるのか)。
ありがとうございました。
Fiboオブジェクトのレベルの説明を プロパティから利用できるようにするにはどうすればよいですか?その値をコードでどのように設定するかは、明確です。
でも、説明文は?それとも、コードから利用できないのでしょうか?
Sorentoさん、ありがとうございました週末が終わり次第、バージョンとalsuを確認させていただきます。
2alsu:フィールドを文字列としてカウントしてしまい、混乱しました ))。
Sorentoさん、ありがとうございました週末が終わったらすぐに、あなたのバリアントとalsuを必ずチェックします。
これで、2つの状況だけを集中的にデバッグすることができます。
酒場はまだ古い
とあり、新しいものが出てきました。
新しいバーがある場合、完全に形成されたものを更新する必要があります。
最適化するものがあります。
そして、リンクをスキップして人為的に歴史の断片を失うアルゴリズムもチェックします。
道中、頑張ってください。
PS.でも、2馬身ほど後ろにずらす必要がありそうです。考えてみてください。
DoubleToStr(value,Digits) の後のleading and filling zerosは、長さを一定にするために必要で、これが問題でした。
端からポジションを検索することができます。;)
頑張って探してみてください。
2ソレント
あなたのコードで
return(0)を削除したら、ファイルはちゃんと書き込まれました。ただ、最後の<oi>フィールドの値がなく、すべてのレコードで0が含まれていますが、何でもないので、修正することにします。あとは動きで確認することです。いつもありがとうございます。
価格フィールドのリードゼロを削除する方法はないのでしょうか?長さは関係ないようです。
Fiboオブジェクトのレベルの説明をプロパティから利用できるようにするにはどうすればよいですか?その値をコードでどのように設定するかは、明確です。
説明も?それとも、コードからアクセスできないのでしょうか?
Sorento - ObjectSetFiboDescriptionの提案に感謝します。
質問を削除しました。
2ソレント
あなたのコードで
return(0)を削除したところ、ファイルは正常に書き込まれました。ただ、最後の<oi>フィールドの値がなく、すべてのレコードで0が入っていますが、これは些細なことなので、何とかします。あとは動きで確認することです。いつもありがとうございます。
価格フィールドのリードゼロを削除する方法はないのでしょうか?長さには影響しないようです。
ゴールドラン1140 и 980
レコードの長さが変わる。
と<oi>は不要なので削除しました ;)