どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 1022

 

あるいは、もっとシンプルに質問させてください。

OnCalculate()関数の 中でループが挿入されているので、1回だけ反復して、グラフが更新されたときだけ次の反復をする......ということです。

 
ara66676:

あるいは、もっとシンプルに質問させてください。

OnCalculate()関数の中でループが挿入されているので、1回だけ反復して、グラフが更新されたときだけ次の反復をする......ということです。

サイキックかCODE TO STUDYが必要なようです。
 
bistreevseh:
ありがとうございました。私は管理者権限を持っており、特にターミナルフォルダについては、すべての破壊を所有者に与えたところ、うまくいきましたが、その後、動かなくなりました。その後、FileReadStrArrayW(名前に間違いがなければ)を使ってログファイルを読もうとしましたが、空の行を読んでしまい、スクリプトはansiモードでハングしてしまいます。FileReadCharArrのみ、アンシコードを読み取ることができました。あなたのライブラリでログファイルをパースする例はありますか?ぜひともよろしくお願いします。

はい、現在ログを読むのに問題があります。昔はもっと簡単だったんです。

ファイル自体はANSIエンコードされているのに、文字列がUNICODEになってしまっていることです。

ここでは、そのようなスクリプトの動作を紹介します。

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

しかし、それはログファイルが最初にUNICODEで保存されている場合にのみ機能します

すなわち、ライブラリが正常に動作する。ファイルのANSIエンコーディングからUNICODE文字列配列に変換する簡単な方法を考えるか、ファイルを読むときに文字列のエンコーディングを変換するような関数をライブラリに追加する必要がありますね。

=====================

オプション1:アレイを扱う必要がない。ファイル全体をANSIとして読み込み、UNICODEに変換し、MQLでパースします。

バリエーション2。ANSIとして読み込み、端末のカレントディレクトリに書き込み、CSVファイル用のMQL関数で読み込む。

オプション3.同じライブラリの関数を使ってサンドボックス内のログファイルへのシンボリックリンクを作成 し、CSVファイルを扱うためのMQL関数を使って読み取ります。

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

私の意見では、これが一番きれいで簡単なオプションです。

[Удален]  

私は、あるチャンネルのインジケータを書こうとしています。チャートに描画するための値を計算し、double tob[] と double tos[] 配列に入れましたが、それらをチャートに描画するためのバッファに接続しようとすると - 25行目と26行目にあるようになります。

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

のように、必要な値の代わりにこれらの配列を使用します。

0/1.424/1.3679
1/1.42/1.3639

は、このように2147483647という数字で埋め尽くされます。
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

どうしたら治るのでしょうか?

ファイル:
channel1.mq4  7 kb
削除済み  
ピリオドを素早く切り替えるためのホットキーはありますか?
Dを押すとH1がM15に、Uを押すとH1に切り替わります。
削除済み  

MT4で昼夜を分けるためのテンプレートを探すのを手伝ってください。

00:00から8:00までのチャートが1色で、8:00から00:00までが別の色だとします。

 

皆様にご挨拶申し上げます。

この問題に直面した。

ロボットのコードの断片。

int per=Period();
if(per = 60)
{.

Print("If the period is not H1, this line should not be in the log");

コメント(...)です。

...// これがロボットのボディです

...

...

}

は、チャート上でH1以外の期間を有効にした場合、ロボット本体、Print(...)ライン、画面上のComment(...)が実行されないことを意味しています。

ただし、どの期間でもすべて実行される。なぜ?

正しく書くには、チャート上の周期が指定したものと一致しない場合 - 端末に制御を戻すことです。(ちなみに、RETURN (0)も試しましたがダメで、やはり全部印刷されてしまいます...)

削除済み  
Dikons:

皆様にご挨拶申し上げます。

この問題に直面した。

ロボットのコードスニペットです。

int per=Period();
if(per = 60)
{

Print("If the period is not H1 - this line should not be in the logbook");

コメント(...)です。

...// 次に、ロボットの本体

...

...

}

は、チャートでH1以外のピリオドが有効になっている場合、ロボット本体、Print(...)文字列、画面上のComment(...)が実行されないことを意味しています。

ただし、どの期間でもすべて実行される。なぜ?

タイムフレームが設定されたものと一致しない場合の正しい登録方法 - 端末に制御を戻す。(ちなみに、RETURN (0)も試してみましたが、うまくいきません。やはり全部印刷されてしまいます...)

あなたは課題をやっているので、比較が必要です if(per== 60)
 
Trader76:
比較は必要だが、代入はしている if(per== 60)

ありがとう、同志よ...。脳みそが煮えくり返ってる...。プログラミングを大幅に中断してしまったので、少し知っていることをかなり忘れてしまっています...。

---

もう1つ質問ですが...1日のうち最大/最小の最初の8時間を端末別に検索した場合の断片。

int h=TimeHour(TimeCurrent()); // 現在のターミナルアワーを求める (0...23)
if (h<8) return(0); // 日中の最初の8本のローソクのH1がない場合 = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // その日の最初の8本のローソクの最大値を定義します.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


最後の2行は、チャートの期間がH1以外に設定されている場合、正しく動作しません。なぜ?ロボットには明示的に計算期間が割り当てられているため...。

例えばチャートにH4を表示させると、ロボットはH4のローソク足を使ってリバランスを行います(他のタイムフレームでも同様です)。

削除済み  
Dikons:

ありがとう、同志よ...。脳みそが煮えくり返ってる...。プログラミングを大幅に中断してしまったので、少し知っていることをかなり忘れてしまっています...。

---

もう1つ質問ですが...1日のうち最大/最小の最初の8時間を端末別に検索した場合の断片。

int h=TimeHour(TimeCurrent()); // 現在のターミナルアワーを求める (0...23)
if (h<8) return(0); // 日中の最初の8本のローソクのH1がない場合 = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // その日の最初の8本のローソク足の最大値を決定。

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


最後の2行は、チャートの期間がH1以外に設定されている場合、正しく動作しません。なぜ?ロボットには明示的に計算期間が割り当てられているため...。

例えばチャートにH4を表示させると、ロボットはH4のローソク足を使ってリバランスを行います(他のタイムフレームでも同様です)。

ここでは、最大/最小バー数を 取得します: iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

そして、例えばバー番号2を挿入すると、High[2]となり、別のタイムフレームでは、H1とは異なる値を得ることができます。ハイについて読む

iHigh(NULL,PERIOD_H1, iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)))