[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 364

 
アルス、あなたのコードの'n'変数が明確ではありません。フィールドの数なら、事前に分からないのにどうやって見つけるんだ?
 
sibemol >> :
alsuさん、コードの中の'n'変数がよくわからないのですが。フィールドの数なら、事前に分からないのにどうやって探すんだ?

でも、ファイルに何か書き込むんですよね? それとも、CSVの構造があらかじめわからないということでしょうか?では、フィールドの数、型(文字列、整数、浮動小数点、時間)、意味的な負荷がわからないのに、それを追加する意味はあるのだろうか?

 
alsu >> :

でも、ファイルに何か書き込むんですよね? それとも、CSVの構造があらかじめわからないということでしょうか?では、フィールドの数も型(文字列、整数、浮動小数点、時間)も意味的な負荷もわからないのに、追加する意味はあるのだろうか。

私の仕事は単純で、他のアプリケーションに転送するために、現在の商品の相場をcsvファイルに書き出すことです。データ収集ループ for(int i=Bars-1; i>=0; i--)であれば、すべて正常に書き込まれます。しかし、もし、コードを最適化するならば

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

ループで for(int i=limit; i>=0; i--),

の代わりに int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",") を使用するようにしました。

挿入 int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

の場合、ゼロバーがファイルの先頭に書き込まれます。FileSeek()を使用すると、ティックごとに行が追加されますが、一方、現在のバーで最後のファイルの行が上書きされる必要があります。

これですべてが明らかになったかと思います。念のため、以下は最適化されていない完全な動作コードです。

//+------------------------------------------------------------------+
//|                                                  iHisoryBars.mq4 |
//|                                        Copyright © 2009, Sibemol |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Sibemol"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 White
//---- input parameters
double v1[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators 
   SetIndexStyle(0,DRAW_LINE);  
   SetIndexBuffer(0, v1);      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
  int counted_bars=IndicatorCounted(), limit;
  if ( counted_bars==0)  limit=Bars-1;
  if ( counted_bars>0)   limit=Bars- counted_bars-1;    
  int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV| FILE_WRITE, ",");
  //int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");    
  FileWrite( f,
  "<ticker>,<per>,<date>,<time>,<open>,<high>,<low>,<close>,<volume>,<oi>");
  for(int i=Bars-1; 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<10) H="0"+DoubleToStr(_Hour, 0); else H=DoubleToStr(_Hour, 0);
    if(_Minute<10) Mi="0"+DoubleToStr(_Minute, 0); else Mi=DoubleToStr(_Minute, 0);
    Date=DoubleToStr(_Year, 0)+ M+ D;
    _Time= H+ Mi;
        
    FileWrite( f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[ i], High[ i], Low[ i], Close[ i], Volume[ i], 0);
    
    }
    
    FileClose( f);
    
  return(0);
  }
//+------------------------------------------------------------------+
 
sibemol >> :

私の仕事は簡単で、現在の商品の相場をcsvファイルに書き出し、他のアプリケーションに送信することです。データ収集ループ for(int i=Bars-1; i>=0; i--)で全て正常に書き込まれています。しかし、もし、コードを最適化するならば

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

ループで for(int i=limit; i>=0; i--),

の代わりに int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",") を使用するようにしました。

挿入 int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

の場合、ゼロバーがファイルの先頭に書き込まれます。FileSeek()を使用する場合、行は各ティックで追加されますが、我々は現在のバーで最後のファイル行を上書きする必要があります。

これですべてが明らかになったかと思います。念のため、最適化されていないフル稼働のコード。


とか、ファイル内の現在位置を最初に記憶しておく方が楽なのでは?

バーチェンジで変わる

 
Sorento >> :

とか、ファイル内の現在位置を最初に記憶しておく方が楽なのでは?

バーチェンジで変化


差し支えなければ、コードではどのように見えるでしょうか?

 

現在のスクリプトから他のチャートにあるスクリプトを全て無効にする機能があれば教えてください。あるいは、端末の電源を完全に切るのがよいでしょう。

その理由は、もし有効化されたスクリプトの1つが災害の到来に「気づいた」場合、自分自身や他のすべてのスクリプトの動作を停止してしまうからです。上記のようなケースでも実現不可能な場合は、どうすればよいのでしょうか。

 
sibemol >> :

私の仕事は簡単で、現在のシンボルの引用をcsvファイルに書き込んで、他のアプリケーションに送信することです。データ収集ループ for(int i=Bars-1; i>=0; i--)で全て正常に書き込まれています。しかし、もし、コードを最適化するならば

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

ループで for(int i=limit; i>=0; i--),

の代わりに int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",") を使用するようにしました。

挿入 int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

の場合、ゼロバーがファイルの先頭に書き込まれます。FileSeek()を使用する場合、行は各ティックで追加されますが、我々は現在のバーで最後のファイル行を上書きする必要があります。

これですべてが明らかになったかと思います。念のため、最適化されていない完全なワーキングコード。


何が問題なのか理解できない。

以下は、あなたの文章の抜粋です、フィールドを読んでください。

FileWrite( f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[ i], High[ i], Low[ i], Close[ i], Volume[ i], 0);

記号、期間、日付、時刻、OHLCV - 合計9フィールドのCSVです。上記のリストでは、これらはすべて文字列として読まれていますが、私たちにとって重要なのはその値ではなく、文字列内の数なので、それは問題ではありません。

nに9を代入して使用すれば、サブルーチンは万能です。

同時に、Sorentoさんがおっしゃるように、レコードの前にポインタの位置を記憶する変数を書いておけば、次のレコードの前に、必要に応じて、カーソルを最後のレコードの先頭に移動して上書きすることができます。この場合、ファイルのオープンをinit()に、クローズをdeinit()に移動させることに注意してください。変数fはグローバルに宣言する必要があります。

まあ、それはできるだけ詳細にということです。宿題だと思ってください:))))))))

 
Mathers >> :

現在のスクリプトから他のチャートにあるスクリプトを全て無効にする機能があれば教えてください。あるいは、端末の電源を完全に切るのがよいでしょう。

その理由は、もし有効化されたスクリプトの1つが災害の到来に「気づいた」場合、自分自身や他のすべてのスクリプトの動作を停止してしまうからです。上記のようなケースで実現不可能な場合、どのようにすればよいのでしょうか?

私は、スクリプトのグローバル変数の形でフラグを設定し、それを他のスクリプトが読み取ることで、時間内にクリーンアップすることができるようにします。

 

alsu писал(а) >>

まあ、それくらい細かいことなんですけどね。宿題だと思ってください:))))))))

お返事ありがとうございます!試してみてどうなるか教えてください。

 
VSIのインジケータを作り直した。ボリュームをプラスとマイナスで表示したかったのだが、結果は唖然。不明確な数学。
ファイル: