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

 
trader781:

なぜそうなったかは理論的にわかっているので、質問なのですが、配列の使い方について簡単にお話いただけますか?

どこを初期化、削除、処理すれば動くようになるのか?

P.S

をgoogleが禁止した場合、以下のようになります。

なぜ配列のことだと思うのですか?
 
Alexey Viktorov:
なぜ、アレイのせいだと思うのですか?
だって、こんなことは今までなかったし、もしあったとしても、どこかでミスを犯したから、ここに来たんだもの。自分でやることもできますが、その分時間がかかります。
 
trader781:

必要

1) どこかに作成する(グローバルエリア、関数として、onitやonticに?)

2)注文を送信するときに、それに各チケットを 書き込み、順番に番号を与える

3)そこから必要な数だけ抜き出す

4) グリッド全体を閉じるときは、パラメータをゼロに戻す

常にメモリーしておく必要はありません。それを見つける必要があるときは、ループ内のすべてのオーダー/ポジションを置くローカル配列で関数を呼び出し、必要なように配列をソートし、そこから必要なオーダーを選択し、それらを使って必要なことを行い、関数を終了すると、そのローカル配列のことを忘れる必要があります。そして、次にまたこの関数を呼び出すと、その呼び出した瞬間にあるであろうオーダー/ポジションを整理して、同じことをする。また、常に監視・制御しなければならないようなグローバルな配列は必要ありません。
 
Artyom Trishkin:
ずっとメモリーに入れておく必要はありません。それを見つける必要があるときは、ループ内のすべてのオーダー/ポジションを置くローカル配列で関数を呼び出し、必要なように配列をソートし、そこから必要なオーダーを選択し、それらを使って必要なことを行い、関数を終了すると、そのローカル配列のことを忘れるのです。そして、次にまたこの関数を呼び出すと、その呼び出した瞬間にあるであろうオーダー/ポジションを整理して、同じことをする。また、常に監視し、制御しなければならないようなグローバルな配列も必要ありません。

どれだけ安くなったかわからない。それぞれの状況には、それぞれの解決策があります。 MQL4には OnTradeTransaction()イベントがありませんが、何とかして「私たちの」注文を追跡する必要があります...。そこで便利なのが、グローバル変数の配列です。

あるアカウントで複数のExpert Advisorが動作しており、そのうちの1つは計算が重く、他の1つは膨大な数の注文を抱えていると想像してみてください...重い計算をするとどうなるのでしょうか?このEAは膨大な量の注文を検索する必要があるのでしょうか?一般に検索をしないわけにはいきませんが、この手続きは最小限にとどめるべきです。

また、注文が終了したかどうかの判断は?履歴を全部見る?高すぎるのでは?

 
trader781:
今までこのような失敗をしたことはないのですが、もし失敗していたらと思い、ここで質問させていただきました。自分でもできるけど、もっと時間がかかる。

前回の投稿でご理解いただけたと思いますが、私は配列をよく使いますし、それで問題が発生したことはありません。一度、チケットは配列に格納されている2000以上の注文を開くEAを書いたことがありますが、全く問題ありませんでした。アレイがあるから問題が出るとは思っていません。また、どのようなエラーでこのような問題が発生したのか、信じられません。

映画「ありえへん」を思い出した...。"人を殺すのはビールじゃない、水だ"...

 
Alexey Viktorov:

どれだけ安くなったかわからない。それぞれの状況には、それぞれの解決策があります。 MQL4には OnTradeTransaction()イベントがありませんが、何とかして「私たちの」注文を追跡する必要があります...。そこで便利なのが、グローバル変数の配列です。

あるアカウントで複数のExpert Advisorが動作しており、そのうちの1つは計算が重く、他の1つは膨大な数の注文を抱えていると想像してみてください...重い計算をするとどうなるのでしょうか?このEAは膨大な量の注文を検索する必要があるのでしょうか?一般的に検索をしないわけにはいきませんが、この手順を最小限にするのはいいことだと思います。

注文が締め切られたかどうかを確認する方法は?履歴を全部見る?高すぎるのでは?

すべては解決できる。

例えば、私はずっと前に、これらすべてを監視するクラスを作りました。シンボル、マジック、タイムフレームごとに、あるいは1つのアカウントに対してすべて、あるいはそれらの組み合わせに対して、クラスオブジェクトを動的に作成/削除することができます - あなたは選択することができます。必要な検索サイクルは、すでに一度、新しいティックで実行され、必要なすべてのデータが存在する。もちろん、もう1サイクルないと無理な場合もありますが、1ティックあたり2回目の追加サイクルとなります。また、すべての関数で個別のループを持たないのは、リソースの無駄遣いがひどい。

 
Artyom Trishkin:

すべては解決可能です。

私などは、とっくの昔に、このようなことを引き受けるクラスを作りました。シンボル、マジック、タイムフレームごとに、あるいは1つのアカウントに対してすべて、あるいはそれらの組み合わせに対して、クラスオブジェクトを動的に作成/削除することができます - あなたは選択することができます。必要な検索サイクルは、すでに一度、新しいティックで実行され、必要なすべてのデータが存在する。もちろん、もう1サイクルないと無理な場合もありますが、1ティックあたり2回目の追加サイクルとなります。また、すべての関数で個別のループを持たない のは、リソースの無駄遣いがひどい。

まあ、誰も異論はないでしょう。構造物の出現でさらに便利になった。
 
Artyom Trishkin:
常にメモリーしておく必要はありません。それを見つける必要があるときは、ループの中にすべてのオーダー/ポジションを置くローカル配列を入れて関数を呼び出し、必要なように配列をソートし、そこから必要なオーダーを選択し、それらに対して必要なことを行い、関数を終了すると、そのローカル配列のことは忘れてしまうのです。そして、次にまたこの関数を呼び出すと、その呼び出した瞬間にあるであろうオーダー/ポジションを整理して、同じことをする。また、常に監視・制御しなければならないようなグローバルな配列は必要ありません。

よし、ここで簡略化して考えてみよう。

アレイをローカルに置く場合、どこに置くのですか? もちろんオンティックではありません。

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

 
trader781:

よし、ここで簡略化して考えてみよう。

アレイをローカルに置く場合、どこに置けばいいのでしょうか? 明らかにontikにはありません。

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

関数とは何かをお読みください。そうすれば、関数本体で 宣言された配列はローカルに、つまりプログラムの他の部分からは見えないところに置かれることが理解できるはずです。
 
bool WriteToFile(int FileHandle,string DataToWrite)
  {
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
   int BytesWritten[1]={0};

// Get the length of the string
   int szData=StringLen(DataToWrite);

// Do the write
   WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);

// Return true if the number of bytes written matches the expected number
   return (BytesWritten[0] == szData);
  }

私は、新しい行に翻訳をファイルに書きたいが、それは動作しません、このコードはここからですhttps://www.mql5.com/en/forum/118999

このコードは、各文字の後にスペースを持つ行を書き込みます、私は FileWrite( )の代替が必要ですが、それは動作します

Reading and writing files anywhere on disk using CreateFileA() etc.
Reading and writing files anywhere on disk using CreateFileA() etc.
  • www.mql5.com
There are frequent questions in this forum (e.g...