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

 
Vitaly Muzichenko:

最初はこんな感じにしておきましょう。

次に、バーが鍛えられていることをきちんと固定する必要がありますが、ここでは、TORへのアプローチ全体を計算する必要があります。

今のところ、あなたの投稿を見る限りでは、こうする必要があるようです。

要するに、スプレッドが通常より大きければ、OnTickに 再度出て、新しいティックでスプレッドをチェックし、通常であれば、注文を送り、このバーで取引があったことを記憶するのです。

また、第二の道もあります。

一般的には、いつ記録するかというロジックを定義し、「新しいバー」が形成されるまで再チェックしないようにする必要があります。


よくわかりました!ありがとうございます。

 

皆さん、ヒントをお願いします。後で読み込んでデータを元にインジケータを構築するために、2週目のインジケータデータをファイルに書き込むようにしています。このインジケータはトレーニング用のもので、あるバーの各ティックでボリュームを計算しています。ティックが正の場合は "+"、負の場合は"-"でボリュームが追加されます。取得した累積量を加算してデルタを求め、このデルタを累積とする。これにより、カーブが生まれます。ただし、この曲線はリアルタイムにしか作れない。歴史にプロットすることはできない。そのために、データをファイルに書き込むことにしました。この段階で行き詰まりました。悲痛な思いでなんとかコンパイラーエラーが出ないようなコードにしました。ところが、出来上がったものがうまくいかない。それ以前はインジケーターが動いていた。ファイルを書き込む コードを添付した後、インジケータが動かなくなりました。プログラムは1つの理解不能なレコードを持つファイルを作成し、この時点で死亡する。一日中、ここに座っていてもわからない。どなたか助けてください。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

input string             InpFileName="111.csv";      // Имя файла 
input string             InpDirectoryName="Data";     // Имя каталога 

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
//SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5=0;

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
     {
      Время=Вр;           // Запомнить
                          //      Buf_1[0]=0;         // и обнулить последний элемент буфера
     }

   datetime date_Buf_1[]; // массив дат индикатора 
   datetime time_Buf_1[]; // массив времени 
                          // --- считаю объем для положительных и отрицательных тиков      
   if(Bid>=Bid1)
     {
      if(Bid>Bid1) // если тик положительный..
        {
         V1=iVolume(NULL,0,0); // если повышающий цену тик, то находим его объем
         V2= V1 + V2;
        }
      else
        {
         V1=0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
         V2= V1 + V2;
        }
     }
   else
     {
      V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
      V4 = V3 + V4;             // то находим его объем  
     }

   V5=V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1=Bid;
   Buf_1[0]=V5; // в буфер сгружаем  дельту

                //   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries(Buf_1,true);
   ArraySetAsSeries(date_Buf_1,true);

//--- скопируем таймсерию 
   int copied=CopyTime(NULL,0,0,0,date_Buf_1);

//--- подготовим массив Buf_1 
   ArrayResize(Buf_1,copied);
//--- скопируем значения линии индикатора  
   for(int i=0;i<copied;i++)
     {
      Buf_1[i]=V5;
     }
//--- откроем файл для записи значений индикатора 
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Файл %s открыт для записи",InpFileName);
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- сначала запишем значения индикатора 
      FileWrite(file_handle,Buf_1[0]);
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1[0];i++)
         FileWrite(file_handle,time_Buf_1[i],Buf_1[i]);
      //--- закрываем файл 
      FileClose(file_handle);
      PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
YarTrade:

皆さん、ヒントをお願いします。後で読み込んでデータを元にインジケータを構築するために、2週目のインジケータデータをファイルに書き込むようにしています。このインジケータはトレーニング用のもので、あるバーの各ティックでボリュームを計算しています。ティックが正の場合は "+"、負の場合は"-"でボリュームが追加されます。取得した累積量を加算してデルタを求め、このデルタを累積とする。これにより、カーブが生まれます。ただし、この曲線はリアルタイムにしか作れない。歴史にプロットすることはできない。そのために、データをファイルに書き込むことにしました。この段階で行き詰まりました。コンパイラエラーが出ないようなコードにするのが苦肉の策で何とかしています。ところが、出来上がったものがうまくいかない。以前はインジケータが動作していました。ファイルを書き込む コードを添付した後、インジケータが動かなくなりました。プログラムは1つの理解不能なレコードを持つファイルを作成し、この時点で死亡する。一日中、ここに座っていてもわからない。どなたか助けてください。


録音前にポインターをファイルの末尾に移動しておくとよいでしょう。

FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения...
 
Alexey Viktorov:

書き込み前にポインタをファイルの末尾に移動しておくとよいでしょう。


これは何のため?リンク先を読んだけど、よくわからない。

 
YarTrade:

これは何のため?リンク先を読んだけど、よくわからない。

何のために?ファイルを開くと、ポインターはファイルの先頭に置かれ、情報が書き込まれます。正しい場所に書き込むには、ポインターを正しい場所に移動させなければなりません。

 
YarTrade:

皆さん、ヒントをお願いします。2週目にして、インジケーターのデータをファイルに書き込もうとしているのですが・・・。

読まれましたか?
 
Alexey Kozitsyn:
読まれましたか?

MQL4はまだ勉強中です。読んでないけど。

MQL4を無料/有料でチューターと一緒に例題で学べるオンライントレーニングサービスはありますか?MQL4のチュートリアルを読みかけたのですが、全くプログラミングができません。私は以前からプログラミングに精通しているわけではありません。このスレッドで何かを学ぼうとしているのですが、全然進みません。アドバイスをお願いします。

 
YarTrade:

MQL4はまだ勉強中です。読んでないけど。

MQL4を無料/有料でチューターと一緒に例題で学べるオンライントレーニングサービスはありますか?MQL4のチュートリアルを読みかけたのですが、全くプログラミングができません。私は以前からプログラミングに精通しているわけではありません。このスレッドで何かを学ぼうとしているのですが、全然進みません。何かご提案があればお願いします。

1.mql4でのファイル操作は、mql5と同じです。

2.セルゲイ・コバレフ氏には失礼ながら、彼の時代にも質問に答えていただいたのですが、私的にはキリルの教えの方がわかりやすいと思うのです。Yandexに入力すると、すぐに彼のレッスンへの2つのリンクが表示されます。


 

こんにちは!私はウェブサイトからのチュートリアルで十分でした、数年バッフルについて叩いてから、私は自分自身の指標を書くことを学びました。しかし、疑問は残ります。今となっては、なぜ指標が混乱するのか理解できない。M1では、12時間くらい経つと、描画がおかしくなるものが出てきますが、信号は正しく出ます。描画や信号が正しくないものがある。M5では、5倍の時間をかけて描画し続けます。ヒントを教えてください。

 
Alexey Viktorov:

1.mql4でのファイルの扱いは、mql5と同じです。

2.セルゲイ・コバレフ氏には失礼ながら、彼も私の質問に時間を割いて答えてくれましたが、私的にはキリルのレッスンの方がわかりやすいと思います。Yandexでは、上のタイプ、すぐに彼のレッスンへの2つのリンク



プログラミングに携わったことがない方でも、「キリル」のレッスンで学習することは可能でしょうか?あなたから見て、どれくらいの時間がかかりますか?