MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 478

 
lil_lil:

FileSeek(File,0,SEEK_END); があり、すべてが改行から ファイルに書き込まれます。

問題は、4つのファイルがあり、それぞれ別のファイルに4つの位置のデータを書き込む必要があるのですが、それぞれのファイルには名前に位置券が付いていますが、データは最後のファイル、最後の位置のデータだけに書き込まれます。

ファイル名は正しく形成されていますか?Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; の代わりに File name=(string)OrderTicket()+Symbol()+".txt"; と書き、冒頭に #property strict 命令を追加するとエラーを排除することができる。
 
STARIJ:
ファイル名は正しく形成されていますか?Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt" の代わりに File name=(string)OrderTicket()+Symbol()+".txt"; と書き、冒頭に #property strict 命令を追加すると、エラーを排除することができます。

ありがとうございます。ご指摘のとおり名前形成をやり直したのですが、やはり最後の位置のデータしか書き込まれません。

また、新しいファイルの名前は変わっていません)名前ではなく、とにかく最後の位置のファイルが見つかったのではないかと思っています。

なぜ、前のポジションを無視するのか?

 

1501896125EURUSD.txt
時間 半額 BID価格
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
時間 半額 BID価格
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
ということで、このような形で、文字列 sy=""; int op=-1, mn=-1; といった感じで、ほとんど必要ないようです。落とせるか?ループ内では、ネストしたif()の代わりに、continueを使用するのがよいでしょう。

ファイル:
Fileee.mq4  7 kb
 
STARIJ:

1501896125EURUSD.txt
Time Half BID Price
2018.02.22.02.22 22:53 p 1,23259 0,88322
2018.02.22 22:54 p 1,23259 0,88322
2018.02.22 22:55 p 1,23259 0,88322
2018.02.22 22:56 p 1,23249 0,88322

1501896094EURUSD.txt
Time Half BID Price
2018.02.22:43 l 1,23212 1,23203
2018.02.22 22:44 l 1,23220 1,23203
2018.02.22 22:44 l 1,23224 1,23203
2018.02.22 22:45 l 1,23244 1,23203
2018.02.22 23:44 l 1,23202 1,23203 2018.02.02 22:44 l 1,23202 1,23203 2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
change anything? see...this: string sy=""; int op=-1, mn=-1; ほとんど必要ない ...落とせるか?ループ内では、ネストしたif()の代わりに、continueを使用するのがよいでしょう。

全ポジションに書き込むのは嫌なんです。

募集職種は7つです。1つのファイルを書きました。

チャート上にあるときにコンパイルしたところ、最初の位置と最後の位置のデータを書き込むようになりました。今、私は最初の位置から1つのデータしか持っていません。

6は見れませんが、Alert(NameFile)に全てのティックを入れています。

何が必要なのか...

 
には、ファイルを書き込むために満たさなければならない条件など、多くの条件がプログラムには含まれています。
if(t_pre+60<TimeCurrent()&& _o_t+1800>TimeCurrent()) // 注文開始から30分に一度。これは必要なことなのでしょうか?
{
t_pre=TimeCurrent();
このプログラムには、ラミネーションが含まれています。
  for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || 
               OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     _o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
  for(i=0; i<k; i++) 
  {
     if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующему
     if(OrderSymbol()!=sy && sy!="") continue;   // а это вообще надо?
     if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?
     if(op>=0 && OrderType()!=op) continue;
     if(mn>=0 && OrderMagicNumber()!=mn) continue;
     _o_t=OrderOpenTime();
以前、階段で書いたのは何のためだったのでしょうか?旧バージョンのMQL4では、実行速度が速くなりました。今は重要ではありません。
変数_o_tは2か所でしか使われていません。OrderOpenTime() に置き換えると、プログラムは2行(宣言と代入)でスッキリ短くなります
datetime _o_t; および
_o_t=OrderOpenTime();
 

60秒のカウントダウンは、ループから外す必要があります。

//+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   if(t_pre+60>=TimeCurrent()) return;      // Дождаться 60 секунд после прошлой обработки
   t_pre=TimeCurrent();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for(int i=0; i<OrdersTotal(); i++) 
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
      string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
      Alert(ИмяФайла);
      if(OrderOpenTime()+60>=TimeCurrent()) continue;   // Пропуск молодых которым меньше 1 минуты
      if(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минут
      if(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
      if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}

      // Открытие или создание файла и перемещение указателя в конец
      int Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
      if(Файл == -1) {  Alert("Ошибка при открытии файла ",ИмяФайла);  return; }
      FileSeek(Файл,0,SEEK_END);

      // Если новый файл записать имя файла и строку заголовков колонок
      if(FileSize(Файл)==0)
      {
         FileWrite(Файл,ИмяФайла);
         FileWrite(Файл,"           Время Полу   BID     Цена ");
      }
      // Сбор информации и запись в файл
      FileWrite(Файл, TimeToStr(TimeCurrent()), text,
                dstr(Bid), "  ", dstr(OrderOpenPrice()));
      FileClose(Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
ファイル:
-Fi----.mq4  5 kb
 

フォーラムユーザーの皆様、こんにちは。

同じ設定でも最適化とテストの結果が異なることがあるのですが、その理由を教えてください。

SQ Tick Downloaderから引用をダウンロードし、スクリプトで実行したところ

 
Aidar Kaliaskar:

こんにちは、親愛なる皆さん。

同じ設定でも最適化とテストの結果が異なることがあるのですが、その理由を教えてください。

さらに言うと、1つのブローカーで2つの異なるアカウントを使用して実際のアカウントで取引した場合、異なる結果が得られることがあります。
 
Vladislav Andruschenko:
もっと言うと、同じブローカーで2つの異なる口座でリアル口座で取引すると、異なる結果が出ることがあります。

それはおそらく、ブローカーによるところが大きいでしょう。でも、最初の質問のヒントをいただけないでしょうか。

 
Aidar Kaliaskar:

それはおそらく、ブローカーによるところが大きいでしょう。しかし、最初の質問に対して、何かアドバイスをいただけないでしょうか。

スプレッド、カレントで請求された場合。現在のもので請求された場合の検査終了日。 この他にも様々な理由が考えられます。