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); } } }
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); }
なぜそうなったかは理論的にわかっているので、質問なのですが、配列の使い方について簡単にお話いただけますか?
どこを初期化、削除、処理すれば動くようになるのか?
P.S
をgoogleが禁止した場合、以下のようになります。
なぜ、アレイのせいだと思うのですか?
必要
1) どこかに作成する(グローバルエリア、関数として、onitやonticに?)
2)注文を送信するときに、それに各チケットを 書き込み、順番に番号を与える
3)そこから必要な数だけ抜き出す
4) グリッド全体を閉じるときは、パラメータをゼロに戻す
ずっとメモリーに入れておく必要はありません。それを見つける必要があるときは、ループ内のすべてのオーダー/ポジションを置くローカル配列で関数を呼び出し、必要なように配列をソートし、そこから必要なオーダーを選択し、それらを使って必要なことを行い、関数を終了すると、そのローカル配列のことを忘れるのです。そして、次にまたこの関数を呼び出すと、その呼び出した瞬間にあるであろうオーダー/ポジションを整理して、同じことをする。また、常に監視し、制御しなければならないようなグローバルな配列も必要ありません。
どれだけ安くなったかわからない。それぞれの状況には、それぞれの解決策があります。 MQL4には OnTradeTransaction()イベントがありませんが、何とかして「私たちの」注文を追跡する必要があります...。そこで便利なのが、グローバル変数の配列です。
あるアカウントで複数のExpert Advisorが動作しており、そのうちの1つは計算が重く、他の1つは膨大な数の注文を抱えていると想像してみてください...重い計算をするとどうなるのでしょうか?このEAは膨大な量の注文を検索する必要があるのでしょうか?一般に検索をしないわけにはいきませんが、この手続きは最小限にとどめるべきです。
また、注文が終了したかどうかの判断は?履歴を全部見る?高すぎるのでは?
今までこのような失敗をしたことはないのですが、もし失敗していたらと思い、ここで質問させていただきました。自分でもできるけど、もっと時間がかかる。
前回の投稿でご理解いただけたと思いますが、私は配列をよく使いますし、それで問題が発生したことはありません。一度、チケットは配列に格納されている2000以上の注文を開くEAを書いたことがありますが、全く問題ありませんでした。アレイがあるから問題が出るとは思っていません。また、どのようなエラーでこのような問題が発生したのか、信じられません。
映画「ありえへん」を思い出した...。"人を殺すのはビールじゃない、水だ"...
どれだけ安くなったかわからない。それぞれの状況には、それぞれの解決策があります。 MQL4には OnTradeTransaction()イベントがありませんが、何とかして「私たちの」注文を追跡する必要があります...。そこで便利なのが、グローバル変数の配列です。
あるアカウントで複数のExpert Advisorが動作しており、そのうちの1つは計算が重く、他の1つは膨大な数の注文を抱えていると想像してみてください...重い計算をするとどうなるのでしょうか?このEAは膨大な量の注文を検索する必要があるのでしょうか?一般的に検索をしないわけにはいきませんが、この手順を最小限にするのはいいことだと思います。
注文が締め切られたかどうかを確認する方法は?履歴を全部見る?高すぎるのでは?
すべては解決できる。
例えば、私はずっと前に、これらすべてを監視するクラスを作りました。シンボル、マジック、タイムフレームごとに、あるいは1つのアカウントに対してすべて、あるいはそれらの組み合わせに対して、クラスオブジェクトを動的に作成/削除することができます - あなたは選択することができます。必要な検索サイクルは、すでに一度、新しいティックで実行され、必要なすべてのデータが存在する。もちろん、もう1サイクルないと無理な場合もありますが、1ティックあたり2回目の追加サイクルとなります。また、すべての関数で個別のループを持たないのは、リソースの無駄遣いがひどい。
すべては解決可能です。
私などは、とっくの昔に、このようなことを引き受けるクラスを作りました。シンボル、マジック、タイムフレームごとに、あるいは1つのアカウントに対してすべて、あるいはそれらの組み合わせに対して、クラスオブジェクトを動的に作成/削除することができます - あなたは選択することができます。必要な検索サイクルは、すでに一度、新しいティックで実行され、必要なすべてのデータが存在する。もちろん、もう1サイクルないと無理な場合もありますが、1ティックあたり2回目の追加サイクルとなります。また、すべての関数で個別のループを持たない のは、リソースの無駄遣いがひどい。
常にメモリーしておく必要はありません。それを見つける必要があるときは、ループの中にすべてのオーダー/ポジションを置くローカル配列を入れて関数を呼び出し、必要なように配列をソートし、そこから必要なオーダーを選択し、それらに対して必要なことを行い、関数を終了すると、そのローカル配列のことは忘れてしまうのです。そして、次にまたこの関数を呼び出すと、その呼び出した瞬間にあるであろうオーダー/ポジションを整理して、同じことをする。また、常に監視・制御しなければならないようなグローバルな配列は必要ありません。
よし、ここで簡略化して考えてみよう。
アレイをローカルに置く場合、どこに置くのですか? もちろんオンティックではありません。
{
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);
}
}
}
よし、ここで簡略化して考えてみよう。
アレイをローカルに置く場合、どこに置けばいいのでしょうか? 明らかにontikにはありません。
{
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);
}
}
}
{
// 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( )の代替が必要ですが、それは動作します