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

 
Artyom Trishkin:

自分でも確認しましたが、すべてmql4でコンパイルされています。

どこかで間違えたんだろう。

これは私のコードではなく、Vasiliy Sokolovのクラスです。MT4でコンパイルできないと2人の方からクレームがありました。私もビルド1090でエラーになりました。このクラスをMT4のコンパイルで確認していただけませんか?なんだかナンセンスに見えますね。ありがとうございました。

https://www.mql5.com/ru/articles/1334#summary - クラスそのものは記事の一番下にあります。

Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
  • 2015.03.23
  • Vasiliy Sokolov
  • www.mql5.com
Эта статья описывает удобный класс для хранения информации - ассоциативный массив или словарь. Благодаря этому классу можно получать доступ к информации по ее ключу. Ассоциативный массив напоминает обычный массив, однако вместо индекса он использует некий уникальный ключ, например, перечисление ENUM_TIMEFRAMES или какой-либо текст. Что...
 
Alexey Volchanskiy:

これは私のコードではなく、Vasiliy Sokolovのクラスです。MT4でコンパイルできないとのクレームが2名ほどありました。私もビルド1090でエラーになりました。このクラスをMT4のコンパイルで確認していただけませんか?なんだかナンセンスに見えますね。ありがとうございました。

https://www.mql5.com/ru/articles/1334#summary - 記事下部のクラスそのものです。

編著者
 
Artyom Trishkin:
編著者

どのようにテストしたのか、見せてください。

 
Victor Nikolaev:

どのようにテストしたのか、見せてください。

Vityaさん、今パソコンの前にいないのでお見せできません。
私はこのバジルクラスをバイブルに使っています。両プラットフォーム共通
そしてまた-この行は、私が初めて遭遇した第四紀のクラスのプライベートセクションに挿入されたものです。そして、すべてをコンパイル。
 
Victor Nikolaev:

どのようにテストしたのか、見せてください。

このクラス

ファイル:
Dictionary.mqh  45 kb
 
ごあいさつ
ticket+symbolという名前のファイルを作成します。
私はポジションの開始 価格と現在の価格、価格の場所によって「P」または「L」の文字をファイルに書き込みます。
ポジションのデータは、オープンタイムが30分以上経過していないものを書き込む必要があります。
問題は、データが最新の1ポジション分しか書き込まれないことです。
他のファイルへの書き込みはできません。4つのポジションがあります。
どうすれば解決するのか?

datetime t_pre=0,t_lo;
string param="";string sy=""; int op=-1; int mn=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  PO=MarketInfo(Symbol(),MODE_POINT);
   vspread=(int)MarketInfo(Symbol(),MODE_SPREAD);
   datetime _o_t;
   double _Profit,_lot,_Swap,_pr,_tp,_sl,lA=-1;
   int _Ticket,_Type;
   string _Comm;
   int      i,k=OrdersTotal();

   if(sy=="0") sy=Symbol();
   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();

                     _pr=OrderOpenPrice();

                     _Ticket=OrderTicket();

                     _Type=OrderType();
                     ИмяФайла=_Ticket+Symbol()+".txt";
                     if(_o_t+60<TimeCurrent())
                        if(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent())
                          {
                           if(_Type==OP_BUY){if(Bid>_pr)text_="P"; else text_="L";}
                           if(_Type==OP_SELL){if(Bid<_pr)text_="P"; else text_="L";}
                           t_pre=TimeCurrent();
                           string Текст,Строка;

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

                           // Если новый файл записать строку заголовков колонок
                           if(FileSize(Файл)==0)FileWrite(Файл,"           Время Полу   BID     Цена ");

                           // Сбор информации и запись в файл
                           FileWrite(Файл,
                                     TimeToStr(TimeCurrent()),
                                     text_,
                                     dstr(Bid),
                                     "  ",
                                     dstr(_pr));
                           FileClose(Файл);
                           Файл=0;

                          }
                    }
                 }
              }
           }
        }
     }

   Comment("");
  }
// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
  {
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
  }


 
Artyom Trishkin:

それが、このクラスです。


おやおや、これはこれは。別のバグを発見しました。開発用のMT4ターミナルを不完全に更新させたことがある。端末版は1090、エディター版は1562です。他の端末では、unionは正常にコンパイルされ、エディターのバージョンは1601になりますアップデート時にすでにエディタを開いていたため、旧バージョンが残ってしまったからでしょう。このゴミに半日費やしたぜ。

とにかく、エディタ1601ですべてうまくコンパイルできます。

 
lil_lil:
ごあいさつ
ticket+symbolという名前のファイルを作成します。
私はポジションの開始 価格と現在の価格、価格の場所によって「P」または「L」の文字をファイルに書き込みます。
ポジションのデータは、オープンタイムが30分以上経過していないものを書き込む必要があります。
問題は、データが最新の1ポジション分しか書き込まれないことです。
他のファイルへの書き込みはできません。4つのポジションがあります。
どうすれば解決するのか?

スキップFileSeek- ファイルの終端を検索し、FileOpen後に毎回先頭に書き込まれます。

 

Alexey Volchanskiy:

おやおや、これはこれは。別のバグを発見しました。当時はMT4の開発端末を不完全に更新していたんです。端末のバージョンは1090、エディタのバージョンは1562です。他の端末では、unionは正常にコンパイルされ、エディターのバージョンは1601になりますアップデート時にすでにエディタを開いていたため、旧バージョンが残ってしまったからでしょう。このゴミに半日費やしたぜ。

とにかく、エディタ1601ですべてうまくコンパイルできます。

そうですか、よかったですね ;)

 
STARIJ:

FileSeek() - ファイルの終端を検索し、FileOpen後は毎回先頭に書き込まれます。

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

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